Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java: Работа с сетью > Как URLConnection использовать с HTTPS и SSL |
Автор: Fameing 14.4.2006, 10:27 | ||||
Как получить всю страницу в буфер по HTTPS сейчас изпользую так :
|
Автор: powerOn 14.4.2006, 11:21 | ||
Данный код у меня работал:
Добавлено @ 11:34 Сорри, Fameing, прозевал что по HTTPS надо.... |
Автор: Fameing 14.4.2006, 11:47 |
Да а как это можно реализовать с HTTPS? Плиз помогите. ![]() ![]() ![]() |
Автор: Fameing 14.4.2006, 18:01 | ||
Уже пробывал добавить сертификат вручную. ![]()
|
Автор: Goliath 14.4.2006, 19:13 |
http://www.javable.com/javaworld/tips/111_tt/ |
Автор: powerOn 14.4.2006, 23:15 | ||||||||||||||||||||
Использование защищенного соединения на основе SSL сокетов. Протокол SSL предназначен для организации защищенного сетевого соединения. Протокол SSL может быть использован как промежуточный протокол между HTTP и TCP/IP, поэтому его применение HTTP клиентами будет "прозрачно". Чтобы установить связь по протоколу SSL средствами JAVA требуется создать SSL сокеты, которые в последствии используются как обыкновенные. Для этого требуется выполнить след. шаги. 1) Создание защищенных сертификатов для клиента и сервера. 2) Создание сервера (имеет серверный SSL сокет). 3) Создание клиента (имеет клиентский SSL сокет). Создание защищенных сертификатов для клиента и сервера. Создание защищенных сертификатов можно произвести с помощью утилиты KeyTool входящей в состав JDK. Нам потребуется создать два хранилища ключей: для клиента и для сервера. В каждых из них должны находиться по сертификату: серверному и клиентскому, что бы оде стороны, обменивающиеся информацией могли друг друга опознать. Создадим хранилище ключей для сервера, сгенерируем ключ, подпишем его, и экспортируем клиенту. Для клиента выполним аналогичные действия. /// Создаем ключ для сервера
/// Создаем ключ для клиента
/// Подписываем ключ клиента.
/// Подписываем ключ сервера.
/// Экспортируем сертификат сервера в хранилище клиента.
/// Экспортируем сертификат клиента в хранилище сервера.
Далее просмотрим содержимое хранилищ, для уверенности. /// Для серверного хранилища.
/// Для клиентского хранилища.
Очевидно, что каждое из хранилищ содержит по собственному подписанному ключу и доверенному сертификату будущего собеседника. Осталось раздать хранилища клиенту и серверу, т.е. чтобы во время выполнения программы они могли найти свои хранилища ключей. Поместите их, к примеру, в одну папку с клиентом и сервером соответственно. Создание Сервера
Создание Клиента
Код подробно прокомментирован, но суть в следующем: сначала происходит настройка SSLContext необходимыми для аутентификации сертификатами, а потом создаются клиентский и серверный SSL сокеты. После создания с ними можно работать как с простыми сокетами, передавать в них информацию, но она будет шифроваться не заметно для нас. Только если скорость передачи данных несколько упадет. Запустите сервер а потом клиент. Клиент должен получить ответ от сервера в виде строки: Sending simple string to socket. Желаю успеха! (если модераторы не против, то можно оформить как статью для FAQ :-)) |
Автор: Goliath 14.4.2006, 23:37 |
Рульное описание ![]() |
Автор: LSD 14.4.2006, 23:47 | ||
Не против ![]() Спасибо за статью! |
Автор: powerOn 14.4.2006, 23:53 | ||
Урааа!!! ![]() |
Автор: Fameing 19.4.2006, 17:58 |
Большое спасиб. |
Автор: Mikkie 20.4.2006, 19:13 |
Классная статья! спасибо |
Автор: sergejzr 25.10.2007, 12:00 | ||
powerOn, спасибо за отличный туториал! В свою очередь добавлю генерацию ключей, описанную в туториале powerOn'a на Ant'е, которую написал по долгу службы. Комменты везде есть. Если коротко- заполняем часть properties по вкусу данными для сервера и клиента и выполняем ant ssl
|
Автор: sergejzr 25.10.2007, 12:24 |
Чтобы туториал завершить... Не подскажете, как сгенеренные сертификаты использовать через HTTPURLConnection на клиенте и TomCat на сервере. (Думаю, это стандартный вариант коммуникации апплет-сервер). |
Автор: ZeusX 10.2.2008, 21:09 | ||
sergejzr,
+1 |
Автор: Hidrag 10.2.2008, 22:36 |
Можно просто юзать в приложении org.apache.commons.httpclient тогда никаких заморочек не надо, будет работать одинаково что для http, что для https, проверено мной лично ![]() коннектился к https://uslugi.beeline.ru и имея логин и пасс свободно гулял по сайту, считывал нужные мне данные, парсил и выдавал в удобном виде |
Автор: pompei 1.7.2009, 11:57 | ||
Когда используем URLConnection то переход на https с http будет прозрачным, просто меняем урл на урл с https-протоколом, и ВСЁ! (не нужно никаких System.setProperty и прочей ерунды) Казалось бы просто, но у некоторых это не работает - возникает ошибка.... На самом деле всё работает, просто эта ошибка предусмотрена разработчиками, верней самой концепцией безопасности. Протокол HTTPS подразумевает, что вы будете работать только с заранее зарегистрированными сертификатами, т.е. с теми сертификаторами, которым вы доверяете. Ну а так как вы ещё ни чего не говорили по поводу того, кому вы доверяете, а кому нет, то система думает, что вы никому ни чего не доверяете, и все обрубает при работе с HTTPS. Короче нужно зарегистрировать, те сертификаты к кому вы обращаетесь. На заметку: когда происходит коннект по протоколу HTTPS, то вначале клиент и сервер обмениваются сертификатами, потом проверяют эти сертификаты, и только потом уже обмениваются данными. Как получить сертификат у сервера? Как его зарегистрировать? - это хорошие вопросы... я в них сейчас разбираюсь. Когда разберусь напишу сюда... а ещё лучше если кто-нибудь напишет а я прочитаю...... ![]() |
Автор: pompei 1.7.2009, 13:03 |
Для того чтобы зарегистрировать новый сертификат для работы с 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... сохраняем в файл - это и будет <файл сертификата> |
Автор: Anatret 22.7.2010, 14:03 | ||||||
Подскажите плиз. Я не пойму где лежит ClientKeyStore раз его подгружают как фаил. Если делать как указанно выше в примере,
то выдает ошибку
а вот что лежит у меня в ClientKeyStore
|
Автор: Alexandr87 22.7.2010, 14:32 |
FileInputStream fis = new FileInputStream("/billing/www/cbadmin_ora/ClientKeyStore"); |
Автор: ReFLeXive 1.12.2010, 13:26 | ||
ДОброго времени суток! У меня проблема в следующем. Есть https сервер, я ему посылаю POST запрос с определенными параметрами, он мне в ответ должен прислать url-encoded строку вида param=value. Так вот, как мне получить эту самую строку от него? Делаю вот так:
Пытался получить https-заголовки, но там ниче нету; пытался получить через con.getInputStream() - там вроде возвращаются какие то числа, но их что то маловато для ответа... Или может я неверно посылаю запрос на сервер? т.е. может сперва нужно установить коннект с сервером (https://serverurl/), затем установить метод POST и уже потом тока отправлять запрос на этот url? каким тогда образом отправить запрос после url.openConnection()? |
Автор: Skipy 1.12.2010, 18:36 |
Вы данные посылаете не POST-ом. Вам надо: 1. Получить URLConnection 2. Вызвать setDoOutput(true) 3. Получить output stream 4. Записать туда то, что Вы хотите передать 5. Вызвать connect и getInputStream - только в этот момент запрос пойдет на сервер. |
Автор: ReFLeXive 7.12.2010, 15:18 | ||
Спасибо за отклик! Сейчас попробую!!! |
Автор: ReFLeXive 7.12.2010, 16:00 | ||||
Видимо я по прежнему не до конца все понимаю и делаю не так. Вот что я переделал:
Сервер мне постоянно выдает, что ему не хватает обязательных параметров. Получается, что мои значения из urlString до сервера не доходят. Как правильно посылать параметры запроса к серверу? Может быть, нужно делать какой-нибудь URLEncoder.encode() c каждым параметров в отдельности или для запроса в целом? Добавлено через 6 минут и 12 секунд Все кажется разобрался с этим! Я забыл, что надо делать
для BufferedWriter |
Автор: Skipy 8.12.2010, 14:51 |
А почему у Вас первый параметр с вопросом? Вы же не query string создаете. |