Исключение при запуске запроса - 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.
Иногда самые простые решения - это те, которые мы забываем!
Ответ 3
Попробуйте новый jdk. Они исправили ошибку ssl handshake. http://www.java.net/blogs/kumarjayanti/
Ответ 4
Я все еще думаю, что это проблема с TLS/SSL.
После того, как вы представили информацию об отладке, она показывает, что вы выполняете рукопожатие TLSv1.
Вы уверены, что в браузерах включен TLSv1?
Chrome:
Чтобы включить TLS 1.0 в chrome, выполните следующие действия:
- Нажмите значок гаечного ключа:
- Выберите "Параметры"
- Выберите вкладку "Под капотом"
- Нажмите Изменить настройки прокси-сервера
- Выберите вкладку "Дополнительно"
- Scoll down и проверьте TLS 1.0
- Закройте и перезапустите все открытые браузеры.
IE:
- Выберите меню "Сервис"
- Нажмите "Свойства обозревателя"
- вкладка "Дополнительно"
- Выделите раздел безопасности
- Включить TLS 1.0
Firefox:
- Нажмите "Сервис"
- Нажмите "Параметры"
- вкладка "Дополнительно"
- Вкладка "Шифрование"
- Включить TLS 1.0
Затем вы также отмечаете, что:
Это сообщение, в котором сервер отправляет свой сертификат вместе с запросом на клиентский сертификат, который я считаю.
Вы установили сертификат клиента в каждый из веб-браузеров, которые вы тестируете?
Удостоверьтесь, что вы можете получить все, что работает без взаимной/клиентской аутентификации, а затем после его работы добавьте его обратно.