我有一个嵌入 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