Исключение при запуске запроса - ClientAuth SSL - PullRequest
10 голосов
/ 28 января 2011

У меня есть приложение, встраивающее 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) 

Обновление:

Я включил опцию отладки 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

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

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

Ответы [ 4 ]

8 голосов
/ 28 января 2011

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

В SSL / TLS пересогласование может быть инициировано любой из сторон.Как и в фазе 1 исправления, приложения, взаимодействующие с необновленным партнером в режиме совместимости и пытающиеся инициировать повторное согласование (через 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 dedug и взглянуть на подтверждение связи.
-Djavax.net.debug=all

3 голосов
/ 25 августа 2012

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

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

1 голос
/ 05 февраля 2011

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

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

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

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

  1. Нажмите на значок гаечного ключа:
  2. Выберите параметры
  3. Выберите вкладку "Под капотом"
  4. Нажмите Изменить настройки прокси
  5. Выберите вкладку «Дополнительно»
  6. Прокрутите вниз и проверьте TLS 1.0
  7. Закройте и перезапустите все открытые браузеры.

IE:

  1. Нажмите меню Сервис
  2. Нажмите Свойства обозревателя
  3. Вкладка «Дополнительно»
  4. Прокрутите до раздела Безопасность
  5. Включить TLS 1.0

Firefox:

  1. Нажмите Инструменты
  2. Нажмите Опции
  3. Вкладка «Дополнительно»
  4. Вкладка «Шифрование»
  5. Включить TLS 1.0

Вы также упоминаете, что:

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

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

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

1 голос
/ 02 февраля 2011

Попробуйте новейший JDK. Они исправили ошибку рукопожатия ssl. http://www.java.net/blogs/kumarjayanti/

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