Сервер TLS принимает соединение от клиента, даже если сертификат клиента отсутствует в хранилище доверенных сертификатов на серверах? Зачем? - PullRequest
0 голосов
/ 08 июня 2009

TLS-сервер принимает подключение от клиента, даже если сертификат клиента отсутствует в доверенном хранилище сервера. Почему?

Код сервера:

tlsContext = SSLContext.getInstance(SSL_PROTOCOL);
tlsContext.init(getMyKeyManagers(),null,null);
SSLServerSocketFactory fact = tlsContext.getServerSocketFactory();
tlsServerSock = (SSLServerSocket)fact.createServerSocket();
tlsServerSock.setNeedClientAuth(true);
tlsServerSock.setWantClientAuth(true);
tlsServerSock.bind(objSocketAddress);

и начните прослушивание кода сокета сервера

Код клиента:

SSLContext tlsContext = SSLContext.getInstance(SSL_PROTOCOL);
tlsContext.init(getMyKeyManagers(), getMyTrustManagers(), null);
SSLSocketFactory fact = tlsContext.getSocketFactory();
socket = fact.createSocket();
socket.connect(objSocketAddress);

Как показывает код, на стороне сервера не добавлены TrustManager, но аутентификация клиента прошла успешно почему так?

Ответы [ 2 ]

0 голосов
/ 09 января 2018

Я знаю, что этот вопрос задавали довольно давно, но все же; -)

Две возможные причины: вы не настроили доверительный менеджер, поэтому «для установленных провайдеров безопасности будет выполнен поиск наивысшего приоритета для соответствующей фабрики» (взято из Javadoc ). Может быть, вы случайно установили доверительный менеджер, принимая все.

В качестве альтернативы ваш клиент может вообще не пытаться выполнить TLS-аутентификацию клиента, потому что вы настроили необязательное требование, установив для setWantClientAuth значение true. Скорее всего, это перезаписало настройку, которую вы указали в строке выше setNeedClientAuth до true. Первый позволяет серверу сообщить клиенту «если у вас есть сертификат для меня, пожалуйста, отправьте его», а второй говорит «если у вас нет сертификата, даже не пытайтесь ...». Если по какой-то причине настроенный менеджер ключей не предоставляет сертификат и закрытый ключ для аутентификации клиента TLS, квитирование TLS будет успешным.

Использование сниффера TCP (например, Wireshark) должно помочь увидеть, действительно ли происходит аутентификация клиента TLS. В качестве альтернативы вы можете установить системное свойство -Djavax.net.debug=all и прочитать всю отладочную информацию в STDOUT (см. Отладка соединений SSL / TLS , чтобы узнать больше об этом)

0 голосов
/ 08 июня 2009

если нет trustmananager, тогда сертификат клиента не требуется.

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

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