openssl s_client只能用-tls1开关连接

问题描述:

我们有一些遗留系统仍然只支持tls1(有计划尽快撤出,但不会很快)。openssl s_client只能用-tls1开关连接

为了连接到我们的新系统,我启用了tls1连接。但是,当我运行如下命令: openssl s_client -connect host:port我无法连接。当添加-debug开关,看看为什么我看到以下内容:

CONNECTED(00000004) 
write to 0x8000d02160 [0x8000d64000] (139 bytes => 139 (0x8B)) 
0000 - 80 89 01 03 01 00 60 00-00 00 20 00 00 39 00 00 ......`... ..9.. 
0010 - 38 00 00 35 00 00 88 00-00 87 00 00 84 00 00 16 8..5............ 
0020 - 00 00 13 00 00 0a 07 00-c0 00 00 33 00 00 32 00 ...........3..2. 
0030 - 00 2f 00 00 45 00 00 44-00 00 41 03 00 80 00 00 ./..E..D..A..... 
0040 - 05 00 00 04 01 00 80 00-00 15 00 00 12 00 00 09 ................ 
0050 - 06 00 40 00 00 14 00 00-11 00 00 08 00 00 06 04 [email protected] 
0060 - 00 80 00 00 03 02 00 80-00 00 ff 29 c2 dd fb 71 ...........)...q 
0070 - 5b 62 90 9e 5b b7 e7 5f-2e 67 9f a2 d2 01 eb bd [b..[.._.g...... 
0080 - 7f 16 28 2a 66 eb 37 78-92 d7 80     ..(*f.7x... 
read from 0x8000d02160 [0x8000d6a000] (7 bytes => 0 (0x0)) 
59659:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:/home/src/secure/lib/libssl/../../../crypto/openssl/ssl/s23_lib.c:182: 

但是,当我加入-tls1开关如预期我得到连接。我很困惑为什么会发生这种情况。连接时不应尝试所有可接受的方法吗?

0000 - 80 89 01 03 01 ... 

这是一个兼容的SSLv2的ClientHello(0×01),用于TLS版本1.0支持宣布(0x0301)。我的猜测是服务器不理解SSLv2兼容握手(已过时),但期望通过-tls1选项可以获得适当的TLS握手。

鉴于您的openssl s_client默认情况下执行了此SSLv2兼容握手,并且它仅支持TLS 1.0,并且效果并不好(因为这是默认宣布的最大值),这表明您使用的是旧版本且不受支持的OpenSSL版本,即0.9.8或1.0.0。

连接时不应尝试所有可接受的方法吗?

这不是SSL/TLS的工作方式。没有尝试各种方法。相反,客户端宣布它可以做的最好(在你的情况下为TLS 1.0),并且服务器选择与客户端支持的版本相同或更低的协议版本,希望客户端可以接受。

+0

Steffen,谢谢你的评论。我正在使用OpenSSL 0.9.8zg 2015年6月11日。我无法在此主机上升级。由于这个,我完全搞砸了吗? – john

+0

另外 - 是否有可能在openssl.cnf文件中强制tls1? – john

+0

@john:你不能强制在openssl.cnf或其他任何地方使用特定的协议。该行为对于使用openssl的每个应用程序都是特定的。除此之外,'openssl s_client'只是一个测试工具,所以你应该更关心你的应用程序是否正确地执行它而不是's_client'。至于OpenSSL 0.9.8 - 它支持TLS 1.0,但不支持TLS 1.1或TLS 1.2。因此,如果要求将使用更好的协议,你将被拧紧。 –