Исключение при запуске запроса - ClientAuth SSL

У меня есть приложение, вложение Jetty. Я хотел бы использовать аутентификацию сертификата клиента в SSL и когда я включаю это; При запуске запроса я получаю следующее исключение. Но после этого запрос получает надлежащее обслуживание. Это исключение возникает только при доступе от IE или Chrome. Он не появляется при доступе от Firefox. У нас есть наш пользовательский SSLConnector, расширяющий SslSocketConnector. Я пытаюсь его отладить; но хотел знать, есть ли какое-то конкретное место/код, где я могу начать проверку.

javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake 
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:808) 
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1112) 
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1139) 
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1123) 
        at org.mortbay.jetty.security.SslSocketConnector$SslConnection.run(SslSocketConnector.java:631) 
        at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:451) 
Caused by: java.io.EOFException: SSL peer shut down incorrectly 
        at com.sun.net.ssl.internal.ssl.InputRecord.read(InputRecord.java:333) 
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:789) 

Update:

Я включил параметр отладки SSL и получал это исключение при чтении сразу после сообщения ServerHelloDone. Это сообщение, в котором сервер отправляет свой сертификат вместе с запросом на сертификат клиента, на который я верю. Я не уверен, что происходит в первом чтении. Любая помощь глубоко ценится.

*** ClientHello, TLSv1
****
%% Created:  [Session-1, TLS_RSA_WITH_AES_128_CBC_SHA]
*** ServerHello, TLSv1
*** Certificate chain
***
*** CertificateRequest
Cert Types: RSA, DSS
Cert Authorities:
*** ServerHelloDone
WRITE: TLSv1 Handshake, length = 703
received EOFException: error
handling exception: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake

Update: Обновлен JDK до последнего, 23 и попытался с двумя включенными/отключенными свойствами. Все равно получайте такое же поведение.

Дополнительная информация: TLSv1 и SSLv3 включены во всех браузерах. Связь происходит должным образом без активации клиента. С клиентом auth всегда мы получаем исключение в первом рукопожатии, а следующее правильно выполняется и продолжается без исключений. Использование причальной версии 6.1.14 на стороне сервера

Ответ 1

Я видел такие проблемы, как TLS/SSLv3. http://www.oracle.com/technetwork/java/javase/documentation/tlsreadme2-176330.html

В SSL/TLS перезапуск может быть инициирован обеими сторонами. Подобно исправлению Phase 1, приложения, взаимодействующие с не обновленным одноранговым узлом в режиме Interoperable и пытающиеся инициировать повторное согласование (через SSLSocket.startHandshake() или SSLEngine.beginHandshake()), получат SSLHandshakeException (IOException), и соединение будет завершено (handshake_failure). Приложения, которые получают запрос на повторный вызов от не обновленного партнера, будут отвечать в зависимости от типа соединения:

  • TLSv1: сообщение предупреждения Alert типа "no_renegotiation (100)" будет отправлено партнеру, и соединение останется открытым. Предыдущие версии SunJSSE будут отключать соединение, когда получено уведомление "no_renegotiation".
  • SSLv3: приложение получит SSLHandshakeException, и соединение будет закрыто (handshake_failure). ( "no_renegotiation" не определено в спецификации SSLv3.)

Для установки этих режимов используются два системных свойства:

  • sun.security.ssl.allowUnsafeRenegotiation - введенный в фазу 1, это контролирует, разрешены ли предыдущие (небезопасные) повторные переговоры.
  • sun.security.ssl.allowLegacyHelloMessages - введенный в фазу 2, это позволяет рукопожатию однорангового соединения, не требуя надлежащих сообщений RFC 5746.

Если это все еще не помогает, вы можете попробовать включить SSL-вывод и взглянуть на подтверждение связи.
-Djavax.net.debug=all

Ответ 2

Я получил это, когда случайно поместил порт не-ssl в URL-адрес, но начал URL с https. Doh.

Иногда самые простые решения - это те, которые мы забываем!

Ответ 4

Я все еще думаю, что это проблема с TLS/SSL.

После того, как вы представили информацию об отладке, она показывает, что вы выполняете рукопожатие TLSv1.

Вы уверены, что в браузерах включен TLSv1?

Chrome: Чтобы включить TLS 1.0 в chrome, выполните следующие действия:

  • Нажмите значок гаечного ключа:
  • Выберите "Параметры"
  • Выберите вкладку "Под капотом"
  • Нажмите Изменить настройки прокси-сервера
  • Выберите вкладку "Дополнительно"
  • Scoll down и проверьте TLS 1.0
  • Закройте и перезапустите все открытые браузеры.

IE:

  • Выберите меню "Сервис"
  • Нажмите "Свойства обозревателя"
  • вкладка "Дополнительно"
  • Выделите раздел безопасности
  • Включить TLS 1.0

Firefox:

  • Нажмите "Сервис"
  • Нажмите "Параметры"
  • вкладка "Дополнительно"
  • Вкладка "Шифрование"
  • Включить TLS 1.0

Затем вы также отмечаете, что:

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

Вы установили сертификат клиента в каждый из веб-браузеров, которые вы тестируете?

Удостоверьтесь, что вы можете получить все, что работает без взаимной/клиентской аутентификации, а затем после его работы добавьте его обратно.