故障是故意的,因为SSLv3已被禁用。 .NET客户端默认使用SSLv3,如果没有在失败之前收到警报,它将不会使用受支持的SSL版本重试。
我已根据http://httpd.apache.org/docs/2.2/mod/mod_ssl.html#ssloptions设置了OptRenegotiate,但我的服务器仍然返回SSL握手失败,而不是警告握手失败(然后发送握手失败)。
使用:
$ openssl s_client -connect my.working.server:443 -ssl3
CONNECTED(00000003)
2414208:error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure:s3_pkt.c:1472:SSL alert number 40
2414208:error:1409E0E5:SSL routines:ssl3_write_bytes:ssl handshake failure:s3_pkt.c:656:
失败:
$ openssl s_client -connect my.failing.server:443 -ssl3
CONNECTED(00000003)
2414208:error:1409E0E5:SSL routines:ssl3_write_bytes:ssl handshake failure:s3_pkt.c:656:
唯一的区别:
2414208:error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure:s3_pkt.c:1472:SSL alert number 40
发送此警报是问题所在:我似乎无法在Apache文档中的任何位置找到它的引用。
答案 0 :(得分:0)
.NET客户端默认使用SSLv3,它不会在支持的SSL版本下重试,而不会在失败前收到警报。
这不是SSL协议协商的工作原理。客户端宣布它愿意支持的最佳版本,然后服务器以最佳版本响应,该版本等于或低于客户端版本。如果此操作失败,某些客户端(主要是浏览器)会使用较低的SSL版本重试,因为它们会假设服务器损坏。但是他们为此使用了新的TCP连接,即在现有连接中没有任何类型的重新协商。
没有协议升级,这是你在这里描述的。
答案 1 :(得分:0)
需要在服务器上启用TLS 1.0,以便在发生故障之前发送警报。 .NET客户端接收警报,并使用安全协议再次尝试,即不是SSLv3。