Суть в том, что вы используете аутентификацию клиента, поэтому вам нужен личный ключ и сертификат для идентификации себя. Вы предоставляете это 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, будут аутентифицироваться с одним и тем же сертификатом. Если вам нужен больший контроль, вы должны использовать «Настраиваемые настройки» выше.