我目前正在使用禁用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
才能使这个工作。我认为它应该自动协商正确的协议?
答案 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进行响应。