请求开始时的异常 - ClientAuth SSL

vpr*_*m86 10 java authentication ssl jetty sslhandshakeexception

我有一个嵌入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) 
Run Code Online (Sandbox Code Playgroud)

更新:

我启用了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
Run Code Online (Sandbox Code Playgroud)

更新:将 JDK更新为最新版本23,并尝试启用/禁用这两个属性.仍然采取相同的行为.

更多信息: 所有浏览器都启用了TLSv1和SSLv3.无需启用客户端身份验证即可正常进行通信.使用客户端身份验证时,我们总是在第一次握手时获得异常,然后下一次正确完成并继续进行无异常.在服务器端使用jetty版本6.1.14

Dan*_*Dan 8

我通过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