2011-02-06 2 views
2

Для защищенных сокетов сервера, чтобы отправить сертификат сервера, все, что я делаю, это инициализировать 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 может использоваться на стороне клиента.

Спасибо!

+0

Это ошибка в коде клиента или сервера? –

+0

@GregS: Это исключение в коде сервера. В коде клиента я получаю «Исключение в потоке» main «java.net.SocketException: ПО вызвало прерывание соединения: recv failed» – Cratylus

ответ

0

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

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

+0

Может быть, это мое недоразумение здесь: I установили в клиенте jvm, как системные свойства, хранилище ключей, доверяя тем, что они указывают на то же хранилище ключей, что и сервер. Это хранилище ключей/truststore содержит только один сертификат, который я создал (самоподписанный). Я предполагаю, что сервер и клиент оба обменяются тот же сертификат. Это может вызвать проблему? – Cratylus

+0

@ user384706 Доверительное владение клиента должно доверять хранилищу ключей сервера. Если вы используете аутентификацию клиента, обратное также верно. Использование тех же файлов на сервере и клиенте не имеет никакого смысла ни с какой точки зрения, а особенно с точки зрения безопасности. Хранилище сервера содержит закрытый ключ сервера и не должно появляться ** нигде в юниверсе. ** В противном случае вы не можете доверять идентификатору сервера, установленному рукопожатием. – EJP