Клиент Java для подключения к серверу с помощью Openssl и аутентификации клиента - PullRequest
3 голосов
/ 22 декабря 2008

Мне нужно написать клиент Java для подключения к серверу SSL. Сервер использует сертификат openssl и настроен для аутентификации клиента.

Кажется, я не могу найти в сети какие-либо полезные ресурсы, которые могут помочь мне (который ничего не знает об openssl и о SSL) понять, к кому обратиться при реализации моей клиентской стороны.

Помощь!

Ответы [ 3 ]

4 голосов
/ 23 декабря 2008

Суть в том, что вы используете аутентификацию клиента, поэтому вам нужен личный ключ и сертификат для идентификации себя. Вы предоставляете это JSSE, указав KeyManager при инициализации SSLContext.

Настраиваемая настройка

Ниже приведены основные шаги. JSSE API был значительно улучшен в Java 6, но я остановлюсь на Java 5, если вы застряли на этой версии.

KeyStore tks = KeyStore.getInstance(KeyStore.getDefaultType());
tks.load(...); /* Load the trust key store with root CAs. */
TrustManagerFactory tmf = 
  TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(tks);
KeyStore iks = KeyStore.getInstance(KeyStore.getDefaultType());
iks.load(...); /* Load the identity key store with your key/cert. */
KeyManagerFactory kmf = 
  KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(iks, password);
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
SocketFactory factory = ctx.getSocketFactory();
Socket socket = factory.createSocket(host, port);

Конфигурация системы

При использовании провайдера SunJSSE можно использовать альтернативный сценарий "нулевой конфигурации". Я считаю, что многие другие провайдеры (например, IBM) следовали той же схеме и будут работать так же. Механизм использует системные свойства , и подробно описан в Справочном руководстве JSSE .

Для аутентификации клиента важными свойствами являются javax.net.ssl.keyStore и javax.net.ssl.keyStorePassword. Значения должны быть путем к хранилищу ключей пользователя и паролем для «записей ключей» этого хранилища ключей, соответственно.

При использовании этих свойств вы можете создать новый SSLSocket, который поддерживает аутентификацию клиента, например:

SocketFactory factory = SSLSocketFactory.getDefault();
Socket socket = factory.createSocket(host, port);

Так как вы используете «по умолчанию» SSLSocketFactory, который зависит от общесистемных свойств, все сокеты, созданные в JVM, будут аутентифицироваться с одним и тем же сертификатом. Если вам нужен больший контроль, вы должны использовать «Настраиваемые настройки» выше.

1 голос
/ 22 декабря 2008

Java включает поддержку SSL в стандартном API. Посмотрите на эти классы в javadoc 1.5.0:

SSLSocket если вы сами выполняете логику связи.

HttpsURLConnection , если серверная часть говорит HTTP

0 голосов
/ 22 декабря 2008

Вы можете использовать httpclient. Взгляните на это SSL-руководство .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...