Для защищенных сокетов сервера, чтобы отправить сертификат сервера, все, что я делаю, это инициализировать SSLContext
с KeyManagerFactory.getKeyManagers()
, который был инициализирован моим хранилищем ключей.
Но как я могу сделать это на стороне клиента?
I.e. для клиента я:аутентификация сокета для надежного клиентского сокета java
System.setProperty("javax.net.ssl.keyStore", "clientKeystore.keystore");
System.setProperty("javax.net.ssl.keyStorePassword", "secret");
System.setProperty("javax.net.ssl.trustStore", "clientKeystore.keystore");
System.setProperty("javax.net.ssl.trustStorePassword", "secret");
SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket socket = (SSLSocket) factory.createSocket("localhost", 7890);
Я использую то же хранилище ключей, что и хранилище доверия. Я предполагаю, что только для того, чтобы смотреть вокруг JSSE, все в порядке.
Проблема в том, что я попадаю в серверную часть (у меня есть setNeedClientAuth
в serverocket для true).
Exception in thread "main" javax.net.ssl.SSLHandshakeException: null cert chain
Как я могу настроить клиентскую сторону для отправки сертификата? Не правильные ли системные свойства?
Поскольку я не вижу, как SSLContext может использоваться на стороне клиента.
Спасибо!
Это ошибка в коде клиента или сервера? –
@GregS: Это исключение в коде сервера. В коде клиента я получаю «Исключение в потоке» main «java.net.SocketException: ПО вызвало прерывание соединения: recv failed» – Cratylus