Аутентификация безопасного клиентского сокета Java

Для защищенных сокетов сервера для отправки сертификата сервера все, что я делаю, это инициализирую SSLContext с помощью KeyManagerFactory.getKeyManagers(), которое было инициализировано с помощью моего хранилища ключей.
Но как я могу сделать это на стороне клиента?
Т.е. для клиента я делаю:

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 в serversocket для true).

Exception in thread "main" javax.net.ssl.SSLHandshakeException: null cert chain

Итак, как мне настроить клиентскую сторону для отправки сертификата? Разве системные свойства не являются правильным подходом?
Потому что я не вижу, как SSLContext можно использовать на клиентской стороне.

Спасибо!


person Cratylus    schedule 06.02.2011    source источник
comment
Это ошибка в клиенте или в коде сервера?   -  person President James K. Polk    schedule 07.02.2011
comment
@GregS: это исключение в коде сервера. В коде клиента я получаю Exception in thread "main" java.net.SocketException: Software caused connection abort: recv failed   -  person Cratylus    schedule 07.02.2011


Ответы (1)


Вам не нужно задавать определенную конфигурацию на стороне клиента, чтобы использовать сертификат для проверки подлинности. Возможно, в хранилище ключей отсутствуют какие-то промежуточные центры сертификации, и клиент не может построить путь сертификата из якоря доверия, отправленного сервером, и поэтому не может определить, подходит ли сертификат для аутентификации.

Вы можете добавить системное свойство javax.net.debug к all для печати потока отладки на стандартном выходе. Может быть, вы можете получить больше информации об ошибке.

person Jcs    schedule 07.02.2011
comment
Возможно, это мое недоразумение: я установил в клиенте jvm в качестве системных свойств хранилище ключей, оба доверенных хранилища указывают на одно и то же хранилище ключей, которое использует сервер. Это хранилище ключей / доверенное хранилище содержит только 1 сертификат, который я создал (самоподписанный). Я предполагаю, что сервер и клиент обмениваются одним и тем же сертификатом. Это может вызвать проблему? - person Cratylus; 07.02.2011
comment
@ user384706 Хранилище доверенных сертификатов клиента должно доверять хранилищу ключей сервера. Если вы используете аутентификацию клиента, верно и обратное. Использование одних и тех же файлов как на сервере, так и на клиенте не имеет никакого смысла ни с какой точки зрения и особенно с точки зрения безопасности. Хранилище ключей сервера содержит закрытый ключ сервера и не должно появляться где-либо еще во вселенной. В противном случае вы не можете доверять удостоверению сервера, установленному рукопожатием. - person user207421; 04.06.2012