1

我在 Jboss 6.1.0 中遇到 SSL 问题。我使用 CLIEN-CERT 来限制客户端证书的某些安全约束。我配置了所有需要的地方(web.xml, jboss-web.xml, jboss-loggin, server.xml, jboss-service)。当我使用 JDK6 启动服务器时,一切正常,但是当我使用 JDK7 启动服务器并尝试访问安全约束时,我收到错误 Exception getting SSL attributes: java.net.SocketException: SSL Cert handshake timeout。这是堆栈跟踪:

2014-10-16 17:39:10,184 WARN  [org.apache.coyote.http11.Http11Processor] (http-0.0.0.0-8443-2) Exception getting SSL attributes: java.net.SocketException: SSL Cert handshake timeout  
  at org.apache.tomcat.util.net.jsse.JSSESupport.handShake(JSSESupport.java:178) [:6.1.0.Final]  
  at org.apache.tomcat.util.net.jsse.JSSESupport.getPeerCertificateChain(JSSESupport.java:138) [:6.1.0.Final]  
  at org.apache.coyote.http11.Http11Processor.action(Http11Processor.java:1144) [:6.1.0.Final]  
  at org.apache.coyote.Request.action(Request.java:352) [:6.1.0.Final]  
  at org.apache.catalina.connector.Request.getCertificateChain(Request.java:1112) [:6.1.0.Final]  
  at org.apache.catalina.authenticator.SSLAuthenticator.authenticate(SSLAuthenticator.java:132) [:6.1.0.Final]  
  at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:559) [:6.1.0.Final]  
  at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:88) [:6.1.0.Final]  
  at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:100) [:6.1.0.Final]  
  at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:159) [:6.1.0.Final]  
  at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158) [:6.1.0.Final]  
  at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:567) [:6.1.0.Final]  
  at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [:6.1.0.Final]  
  at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:631) [:6.1.0.Final]  
  at org.jboss.web.rewrite.RewriteValve.invoke(RewriteValve.java:273) [:6.1.0.Final]  
  at org.jboss.web.tomcat.service.request.ActiveRequestResponseCacheValve.invoke(ActiveRequestResponseCacheValve.java:53) [:6.1.0.Final]  
  at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:362) [:6.1.0.Final]  
  at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [:6.1.0.Final]  
  at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:654) [:6.1.0.Final]  
  at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:951) [:6.1.0.Final]  
  at java.lang.Thread.run(Thread.java:745) [:1.7.0_71]  

当我切换clientAuth="true""want"它工作时,但"false"使用 CLIENT-CERT 访问安全约束不适用于 JDK7。我尝试调试JSSESupport.java并看到握手方法和JDK6中存在for循环,当第一次进入该循环并从InputStream浏览器窗口读取字节并请求我的客户端证书时,但使用JDK7并没有发生这种情况,因为客户端没有发送他的证书,所以在方法结束时会抛出错误。实际上这个浏览器窗口是稍后打开的,当我提交我的证书时没有任何反应,因为握手完成了false结果。我用 Firefox、IE、Chrome 试过,结果是一样的。如果有人可以帮助我或给我建议,那就太好了。

4

2 回答 2

0

在我们的项目中,我们有来自 jboss 的类似错误,但我现在不记得确切的错误。在我们的例子中,我们跳过了它并且应用程序运行良好。

于 2014-11-10T09:45:38.507 回答
0

因此,我进行了更多调试,发现在JSSESupport.java:178中的Java 7尝试从SSLSocket读取AppInputStream时没有发生任何事情。它尝试读取 60 次,最后如果客户端不确认他对证书的选择,则会引发此“握手超时”错误,然后在 tomcat 检查证书并且如果它没有提供我有日志“此请求中不包含证书”和响应用代码401 SC_UNAUTHORIZED向我发送错误并停止进程并且我的过滤器没有被调用。与Java 6不同,第一次尝试从AppInputStream读取时,我被要求选择我的客户证书。我认为这个问题可能与Java 7在安全领域的变化和SSL(TLS)的实现有关,或者与从这个AppInputStream读取的一些同步问题有关,因为这个证书请求是在抛出错误之后稍后出现的,但是错误代码已经设置为响应。

于 2014-11-11T14:36:06.900 回答