OpenSSL s_client无法通过APR连接到Tomcat 7

时间:2014-12-10 21:10:51

标签: ssl tomcat7 sslv3

我目前正在使用禁用SSLv3的APR连接器将我的Tomcat服务器升级到Tomcat 7。这是我的连接器:

<Connector port="8443" maxHttpHeaderSize="8192"
           maxThreads="150"
           enableLookups="false" disableUploadTimeout="true"
           acceptCount="100" scheme="https" secure="true"
           SSLEnabled="true" 
           SSLProtocol="TLSv1"
           SSLCertificateFile="${CP_ROOT}/security/tomcat.crt"
           SSLCertificateKeyFile="${CP_ROOT}/security/tomcat.key" />

一切似乎都正常工作......例如通过HTTPS转到页面正确地提供该页面。但是,我们正在使用F5负载均衡器,并且一旦禁用SSLv3,配置的运行状况监视器就会为该节点/端口启动失败。在对F5进行一些故障排除后,我决定尝试使用OpenSSL进行诊断:

$ openssl s_client -connect casrept2.tc.columbia.edu:8443/cas/monitor.jsp      
CONNECTED(00000003)
write:errno=54

执行相同操作,但强制使用TLSv1(-tls1),我能够正确连接:

$ openssl s_client -connect casrept2.tc.columbia.edu:8443/cas/monitor.jsp -tls1
CONNECTED(00000003)
... cert chain, etc, etc

我想知道这是否是导致健康监视器失败的原因。无论哪种方式,我很好奇为什么我需要专门强制-tls1才能使这个工作。我认为它应该自动协商正确的协议?

1 个答案:

答案 0 :(得分:4)

您在openssl使用的是哪个版本s_client?如果它是0.9.8系列,则默认为协议ssl2,ssl3,tls1(.0),这要求它使用SSL2格式的ClientHello(但内容可以协商到tls1.0)。 Tomcat / APR中的openssl服务器(仅指定tls1(而不是默认的自动检测))将协商或提供适当的警报用于SSL3 +格式,但对于SSL2格式,它只关闭TCP连接 - 至少在Windows上它使用RST“异常”,导致s_client得到系统调用错误并显示您看到的消息。 (虽然54是一个errno值,我不记得看到RST;你能说出什么操作系统?)

通过指定s_client -tls1,您可以使用包含版本3.1 = TLS1.0的SSL3 +格式,它可以正常工作。如果您改为使用-ssl3,则无法进行协商,但它确实会获得更具体的alert handshake failure,而不仅仅是TCP错误。如果您使用使用SSL3 +格式的-no_ssl2并协商TLS1.0,虽然这不像-tls1那样方便。

如果对s_client使用openssl 1.0.0或1.0.1系列,则默认为最小SSL3和(因此)SSL3 + hello格式并且工作,除非在构建过程中发生了异常。

我不知道F5显示器在这里做了什么 - 或者可以做什么 - 但是如果它在理论上尝试SSL2格式你好 - 或者在过去是 - 最大程度上可互操作的话,我不会感到惊讶。如果是这样会导致连接失败,这可以理解为服务器的问题。您可以在服务器上(或附近)放置诸如www.wireshark.org或类似的跟踪,并查看F5发送的确切内容,并确认您的服务器使用RST进行响应。