Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как URLConnection использовать с HTTPS и SSL 
V
    Опции темы
pompei
Дата 1.7.2009, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 7.9.2007

Репутация: нет
Всего: 6



Цитата(sergejzr @ 25.10.2007,  12:24)
Чтобы туториал завершить... Не подскажете, как сгенеренные сертификаты использовать через HTTPURLConnection на клиенте и TomCat на сервере. (Думаю, это стандартный вариант коммуникации апплет-сервер).

Когда используем URLConnection то переход на https с http будет прозрачным, просто меняем урл на урл с https-протоколом, и ВСЁ! (не нужно никаких System.setProperty и прочей ерунды)

Казалось бы просто, но у некоторых это не работает - возникает ошибка....

На самом деле всё работает, просто эта ошибка предусмотрена разработчиками, верней самой концепцией безопасности.

Протокол HTTPS подразумевает, что вы будете работать только с заранее зарегистрированными сертификатами, т.е. с теми сертификаторами, которым вы доверяете.

Ну а так как вы ещё ни чего не говорили по поводу того, кому вы доверяете, а кому нет, то система думает, что вы никому ни чего не доверяете, и все обрубает при работе с HTTPS.

Короче нужно зарегистрировать, те сертификаты к кому вы обращаетесь.

На заметку: когда происходит коннект по протоколу HTTPS, то вначале клиент и сервер обмениваются сертификатами, потом проверяют эти сертификаты, и только потом уже обмениваются данными.

Как получить сертификат у сервера? Как его зарегистрировать? - это хорошие вопросы... я в них сейчас разбираюсь.

Когда разберусь напишу сюда... а ещё лучше если кто-нибудь напишет а я прочитаю...... smile
--------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап.
PM MAIL   Вверх
pompei
Дата 1.7.2009, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 7.9.2007

Репутация: нет
Всего: 6




Для того чтобы зарегистрировать новый сертификат для работы с https
протоколом в java необходимо выполнить команду:

keytool -import -alias <алиас сертификата в keystore> \
    -file <файл сертификата> \
    -keystore <файл keystore>

где
    <файл keystore> - файл в котором хранятся сетификаты по алиасам (хранилище сертификатов)
    <алиас сертификата в keystore> - это уникальный идентификатор
        сертификата на уровне хранилища - я ввел абру-кадабру (и всё работало замечательно)

По умолчанию JVM держит своё хранилище сертификатов в файле:
    $JAVA_HOME/jre/lib/security/cacerts

(Его можно поменять с помощью какой-то System.setProperty... но это делать вредно)

Когда я натравил keytool на этот файл, у меня ничего не получилось (он потребовал
пароль, который я не знаю)
Поэтому я стёр этот файл и запустил команду ещё раз (которая указывала на только что стёртый файл)
Он потребовал уже не ввести пароль, а выбрать новый (и подтветдить его)

Дальше я запустил свою программу и всё заработало, так же как и раньше по http, но уже по https!!!!

        * * *
 
Для плучения сертификата можно, например, воспользоваться FireFox-ом:
    Edit -> Preferences -> Advanced 
        -> Encryption -> View Certificates -> Servers -> AddException
            
            Здесь вводим домен с https
            Нажимаем Get Certificate
            Потом View -> Details -> Export...
            сохраняем в файл - это и будет <файл сертификата>



--------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап.
PM MAIL   Вверх
Anatret
Дата 22.7.2010, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 18.9.2007

Репутация: нет
Всего: нет



Подскажите плиз. Я не пойму где лежит ClientKeyStore раз его подгружают как фаил.  Если делать как указанно выше в примере,

Код

KeyStore trustStore  = KeyStore.getInstance("JKS");
        FileInputStream fis = new FileInputStream("ClientKeyStore");
        try {
            trustStore.load(fis, "passpass".toCharArray());
        } finally {
            fis.close();
        }

то выдает ошибку 
Код

Exception in thread "main" java.io.FileNotFoundException: ClientKeyStore (No such file or directory)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(FileInputStream.java:106)
    at java.io.FileInputStream.<init>(FileInputStream.java:66)
    at com.logica.banks.ClientCustomSSL.main(ClientCustomSSL.java:31)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:110)

а вот что лежит у меня в ClientKeyStore
Код

vadim@vadim:/billing/www/cbadmin_ora$ keytool -list -keystore ClientKeyStore
Enter keystore password:  passpass

Keystore type: jks
Keystore provider: SUN

Your keystore contains 2 entries

serverkeysydney, 22.07.2010, trustedCertEntry,
Certificate fingerprint (MD5): 00:D0:BE:54:6A:B7:4E:DA:39:6B:A0:14:EC:82:3B:50
clientkey, 22.07.2010, keyEntry,
Certificate fingerprint (MD5): 08:91:CA:01:61:3C:FF:9D:C2:C8:56:E6:F8:E4:9D:38



PM MAIL   Вверх
Alexandr87
Дата 22.7.2010, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

Репутация: нет
Всего: 39



FileInputStream fis = new FileInputStream("/billing/www/cbadmin_ora/ClientKeyStore");
PM Jabber   Вверх
ReFLeXive
Дата 1.12.2010, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 30.3.2009
Где: г. Уфа

Репутация: нет
Всего: 1



ДОброго времени суток!
У меня проблема в следующем. Есть https сервер, я ему посылаю POST запрос с определенными параметрами, он мне в ответ должен прислать url-encoded строку вида param=value. Так вот, как мне получить эту самую строку от него?
Делаю вот так:

Код

StringBuilder urlString = new StringBuilder( "https://serverurl/" );
urlString.append( "?param1=value1" );
urlString.append( "&param2=value2");
...
URL url = new URL( urlString.toString() );
HttpsURLConnectionImpl con = (HttpsURLConnectionImpl) url.openConnection();
con.setRequestMethod( "POST" );
...


Пытался получить https-заголовки, но там ниче нету; пытался получить через con.getInputStream() - там вроде возвращаются какие то числа, но их что то маловато для ответа... 
Или может я неверно посылаю запрос на сервер? т.е. может сперва нужно установить коннект с сервером (https://serverurl/), затем установить метод POST и уже потом тока отправлять запрос на этот url? каким тогда образом отправить запрос после url.openConnection()?
PM MAIL   Вверх
Skipy
Дата 1.12.2010, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 487
Регистрация: 24.8.2006
Где: Москва, Россия

Репутация: 4
Всего: 16



Вы данные посылаете не POST-ом. 

Вам надо:

1. Получить URLConnection
2. Вызвать setDoOutput(true)
3. Получить output stream
4. Записать туда то, что Вы хотите передать
5. Вызвать connect и getInputStream - только в этот момент запрос пойдет на сервер.


--------------------
С уважением,
Евгений aka Skipy
www.skipy.ru
PM MAIL WWW ICQ   Вверх
ReFLeXive
Дата 7.12.2010, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 30.3.2009
Где: г. Уфа

Репутация: нет
Всего: 1



Цитата(Skipy @ 1.12.2010,  18:36)
Вы данные посылаете не POST-ом. 

Вам надо:

1. Получить URLConnection
2. Вызвать setDoOutput(true)
3. Получить output stream
4. Записать туда то, что Вы хотите передать
5. Вызвать connect и getInputStream - только в этот момент запрос пойдет на сервер.

Спасибо за отклик! Сейчас попробую!!!
PM MAIL   Вверх
ReFLeXive
Дата 7.12.2010, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 30.3.2009
Где: г. Уфа

Репутация: нет
Всего: 1



Видимо я по прежнему не до конца все понимаю и делаю не так.
Вот что я переделал:
Код

URL url = new URL( "https://serverurl/" );
HttpsURLConnectionImpl connection = ( HttpsURLConnectionImpl ) url.openConnection( );
connection.setRequestMethod( "POST" );
connection.setDoOutput( true );
//
StringBuilder urlString = new StringBuilder( );
urlString.append( "?client_orderid=" + clientOrderId );
urlString.append( "&amount=" + amount );
urlString.append( "&currency=" + currency );
urlString.append( "&order_desc=" + description );
//....            
BufferedWriter bw = new BufferedWriter( new OutputStreamWriter( connection.getOutputStream( ) ) );
bw.write( urlString.toString( ).toCharArray( ) );
            
connection.connect( );
//считываем ответ
char[] b = new char[ 1024 * 1024 ];
BufferedReader br = new BufferedReader( new InputStreamReader( connection.getInputStream( ) ) );
br.read( b );


Сервер мне постоянно выдает, что ему не хватает обязательных параметров. Получается, что мои значения из urlString до сервера не доходят. Как правильно посылать параметры запроса к серверу? 
Может быть, нужно делать какой-нибудь URLEncoder.encode()  c каждым параметров в отдельности или для запроса в целом?

Добавлено через 6 минут и 12 секунд
Все кажется разобрался с этим! Я забыл, что надо делать 
Код

bw.close()

для BufferedWriter
PM MAIL   Вверх
Skipy
Дата 8.12.2010, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 487
Регистрация: 24.8.2006
Где: Москва, Россия

Репутация: 4
Всего: 16



А почему у Вас первый параметр с вопросом? Вы же не query string создаете.


--------------------
С уважением,
Евгений aka Skipy
www.skipy.ru
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.0769 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.