Исключение при запуске запроса — 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) 

Обновление:

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


person vpram86    schedule 28.01.2011    source источник
comment
Как сказал @Dan, вам нужно установить для системного свойства javax.net.debug значение all или debug. Для большинства средств запуска Java вы просто добавляете -Djavax.net.debug=all` к аргументам.   -  person President James K. Polk    schedule 30.01.2011


Ответы (4)


Я видел подобные проблемы с согласованием 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 и проверить подтверждение связи.
-Djavax.net.debug=all

person Dan    schedule 28.01.2011
comment
Большое спасибо. Установка этих свойств не помогла. Я пробовал отладку. Пожалуйста, смотрите обновленный вопрос. - person vpram86; 01.02.2011
comment
это был бы способ добавить: System.setProperty(sun.security.ssl.allowUnsafeRenegotiation, true); System.setProperty(sun.security.ssl.allowLegacyHelloMessages, true); - person tibi; 03.02.2014

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

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

person Paul Hilliar    schedule 25.08.2012

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

person Hiro2k    schedule 02.02.2011
comment
Попробовал и получил ту же ошибку с двумя указанными выше свойствами или без них. - person vpram86; 02.02.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

Fire Fox:

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

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

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

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

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

person Dan    schedule 05.02.2011
comment
Да Дэн. TLSv1 и SSLv3 включены во всех браузерах. Сертификат клиента установлен и также работает корректно со второго рукопожатия. Как я и сказал; это просто первое рукопожатие, которое дает это исключение. Второй раз; Я могу выбрать сертификат, и связь в дальнейшем будет нормальной. Я проверил с отключенной клиентской аутентификацией, и он работает без каких-либо исключений. :( - person vpram86; 07.02.2011
comment
Я думаю, вам нужно уточнить, что вы подразумеваете под «первым разом» и «вторым разом». Вы имеете в виду, как проявляется со стороны клиента или со стороны сервера? Кроме того, запишите все выходные данные с помощью javax.net.debug=all из первого запуска, а затем второго запуска в файлы. Удалите временные метки (perl, макросы текстового редактора и т. д.). Затем сравните два файла рядом и найдите любые серьезные расхождения. Я хотел бы знать, представляет ли клиент идентичный сертификат клиента (отпечаток пальца/хэш) в запросе, который завершается неудачей, и запросе, который завершается успешно. - person Dan; 10.02.2011
comment
Отладка была включена на стороне сервера. Когда мы пытаемся открыть ссылку на сервере; такое поведение происходит еще до появления всплывающего окна выбора клиентского сертификата. С точки зрения пользователя они не увидят разницы; но на самом деле они соединились только во втором рукопожатии. Я также использовал ssltap для захвата трафика. Я постараюсь выложить куда-нибудь логи из ssltap и связать. Насколько я вижу, они почти одинаковы. Но я могу что-то упустить. - person vpram86; 10.02.2011