Открытие сокета SSL TCP и отправка веб-запросов - PullRequest
0 голосов
/ 16 июля 2010

У меня есть требование открыть tcp-сокет и пройти аутентификацию с использованием протокола SSLv3 или TLSv1 IP с использованием цифрового сертификата X.509.

Что именно включает в себя этот процесс рукопожатия?Я знаю, что каждое сообщение должно быть зашифровано и подписано моим личным ключом.Что-то еще?

После успешного завершения я должен отправить HTTP-запросы POST через сокет.

Сервер может решить закрыть этот сокет, если через некоторое время он неактивен.Мне нужно иметь возможность повторно открывать, проверять подлинность и отправлять запросы снова.

Полученный мне сертификат в формате PKCS12 со следующей информацией.

Идентификация сертификата, Открытый ключ сертификата, СертификатЗакрытый ключ, Цепочка удостоверяющего центра

Я довольно новичок в SSL, может кто-нибудь, пожалуйста, предоставит указатели о том, как реализовать это в интеграции Java или Spring.

Ответы [ 3 ]

1 голос
/ 16 июля 2010

Хорошее начало - увидеть javaxoc javax.net.ssl.HttpsURLConnection: http://download.oracle.com/docs/cd/E17476_01/javase/1.4.2/docs/api/javax/net/ssl/HttpsURLConnection.html

Также вам нужно будет использовать команду keytool для импорта сертификата в хранилище ключей.

0 голосов
/ 16 июля 2010

Что касается деталей TLS / SSL, для аутентификации по сертификату клиента, по сравнению с "обычным" hanshake, сервер отправляет дополнительное сообщение CertificateRequest TLS клиенту, который отвечает своим сертификатом в последующем сообщении Certificate TLS.(позже клиент отправляет сообщение CertificateVerify TLS, где он подписывает другие сообщения своим закрытым ключом, чтобы доказать серверу, что он действительно имеет закрытый ключ для открытого ключа в сертификате, который он отправил.)Обратите внимание, что после завершения рукопожатия сообщения шифруются не вашим закрытым ключом, а эфемерными ключами, передаваемыми на сервер (конфиденциальное согласование этих ключей также является частью рукопожатия).

На практикевам нужен сертификат и его закрытый ключ, содержащиеся в файле PKCS # 12 (например) и для настройки клиента для отправки его при подключении к серверу (сервер запросит его в соответствии с его конфигурацией).Проще предположить, что вам понадобится только один сертификат, и вам не придется выбирать между несколькими сертификатами, в противном случае вам нужно настроить собственный X509TrustManager в пределах SSLContext.

Если все ваши подключения могут использовать этот сертификат, вы можете использовать настройки по умолчанию, которые HttpsURLConnection (и значение по умолчанию SSLSocketFactory) подберут.Это можно сделать:

  • , установив системные свойства javax.net.ssl.keyStore, javax.net.ssl.keyStoreType и javax.net.ssl.keyStorePassword в командной строке с вашими настройками.Я бы порекомендовал против , чтобы, поскольку кто-то на машине мог потенциально видеть командную строку и ваши настройки, перечисляя процессы (в зависимости от конфигурации машины),
  • устанавливая эти системные свойствав вашем приложении
  • инициализирует SSLContext и устанавливает его как значение по умолчанию с помощью SSLContext.setDefault(..) (Java 6).

Обратите внимание, что файлы .p12 (PKCS # 12)являются встроенным хранилищем ключей, поэтому вам не нужно выполнять какие-либо преобразования с keytool, просто используйте PKCS12 в качестве типа хранилища.

Если вам нужны эти настройки или вы можете инициализироватьSSLContext, создайте SSLSocketFactory из него, а затем настройте экземпляр HttpsURLConnection (если это то, что вы используете) с setSSLSocketFactory.

(Вы можете использовать такие инструменты, как jSSLutils , чтобы помочь построить SSLContext.)

0 голосов
/ 16 июля 2010

Вам не нужно знать о рукопожатии, все это сделано для вас.Прочтите «Справочник по JSSE», чтобы узнать, о чем вам стоит беспокоиться.

...