Jboss AS 6.1.0 与 Java7 的握手超时
Posted
技术标签:
【中文标题】Jboss AS 6.1.0 与 Java7 的握手超时【英文标题】:Jboss AS 6.1.0 Handshake timeout with Java7 【发布时间】:2015-01-06 13:41:07 【问题描述】:我在 Jboss 6.1.0 中遇到了 SSL 问题。我使用 CLIEN-CERT 来限制客户端证书的某些安全约束。我配置了所有需要的地方(web.xml, jboss-web.xml, jboss-loggin, server.xml, jboss-service
)。当我使用 JDK6 启动服务器时,一切正常,但是当我使用 JDK7 启动服务器并尝试访问安全约束时,我收到错误异常获取 SSL 属性: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
并看到在该循环中第一次进入并从 InputStream 浏览器窗口读取字节并请求我的客户端证书时,握手方法和 JDK6 中存在循环并请求我的客户端证书,但是使用 JDK7 这没有发生了,在方法结束时抛出错误,因为客户端没有发送他的证书。实际上这个浏览器窗口稍后会打开,当我提交我的证书时,什么也没有发生,因为握手以false
结果完成。我用 Firefox、IE、Chrome 试过,结果是一样的。如果有人可以帮助我或给我建议,那就太好了。
【问题讨论】:
【参考方案1】:在我们的项目中,类似的错误来自 jboss,但我现在不记得确切的错误。在我们的例子中,我们跳过了它并且应用程序运行良好。
【讨论】:
你会试着记住错误是什么吗?就我而言,问题是我有 SPRING 过滤器,我必须在其中获取证书并执行一些逻辑,当我遇到此错误时,我的过滤器不起作用(它没有被调用)我不知道为什么.. 目前我无法使用公司的笔记本电脑,因为我第二天要离开办公室 2...【参考方案2】:所以,我在 JSSESupport.java:178 中使用 Java 7 进行了更多调试,当它尝试从 AppInputStream 中读取 AppInputStream strong>SSLSocket 什么也没发生。它尝试读取 60 次,最后如果客户不确认他对证书的选择,则会抛出此“Handhake timeout”错误,然后 tomcat 检查证书,如果未提供我有日志“此请求中不包含任何证书”并响应向我发送错误代码 401 SC_UNAUTHORIZED 并且进程停止并且我的过滤器没有被调用。 与 Java 6 不同的是,当它第一次尝试从 AppInputStream 中读取数据时,系统会要求我选择我的客户端证书。 我认为这个问题可能与 Java 7 在安全领域的变化和 SSL(TLS) 的实现有关,或者与从这个 AppInputStream 读取的一些同步问题有关,因为这个对证书的请求是在抛出错误之后来的,但是错误代码已经在响应中设置了。
【讨论】:
您找到解决方案了吗?我们只是在尝试更新 Java 1.7 时遇到了同样的问题。 解决方案是修补 JSSESupport#handShake 所以而不是 byte[] b = new byte[1];使用新字节[0]。这应该适合从 InputStream 读取时在 Java 7 中所做的更改并且应该可以工作。以上是关于Jboss AS 6.1.0 与 Java7 的握手超时的主要内容,如果未能解决你的问题,请参考以下文章
javax.xml.parsers.FactoryConfigurationError 运行 JBoss AS 7.1 和 Java 7 更新 171