curl: 连接中出现未知的SSL协议错误

4

我正在尝试使用Tomcat 7 + SSL从一个在AWS中的服务器(A)连接到另一个在AWS中的服务器(B)。

服务器A:

  • Ubuntu 14.04
  • OpenSSL 1.0.1f

服务器B:

  • Ubuntu 13.04
  • Tomcat 7
  • OpenSSL 1.0.1c
  • SSL证书

我正在服务器A上尝试以下命令:

curl https://Server.B -v

我遇到了以下异常:

* Connection #0 to host test.salespredict.com left intact
yakirm@ip-10-214-10-178:~$ curl https://Server.B.com -v
* Rebuilt URL to: https://Server.B.com/
* Hostname was NOT found in DNS cache
*   Trying 54.245.81.*...
* Connected to Server.B.com (54.245.81.*) port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: none
  CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* Unknown SSL protocol error in connection to Server.B.com:443 
* Closing connection 0
curl: (35) Unknown SSL protocol error in connection to Server.B.com:443 

我尝试使用OpenSSL进行检查

openssl s_client -connect Server.B.Address:443

我得到了以下结果:
CONNECTED(00000003)
140284858304160:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:184:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 307 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
---

如果我正在尝试从我的电脑(OS X Mavericks)连接,curl 命令可以成功,但 openssl 命令返回相同的结果。

顺便说一下:

如果我尝试:

curl https://Server.B -v -ssl3

这是从A服务器工作,但我不想指定SSL协议。

编辑

B服务器 - Tomcat配置:

<Connector SSLEnabled="true" acceptCount="100" clientAuth="false" disableUploadTimeout="true" 
                   enableLookups="true" maxThreads="200" port="443" keystoreFile="/var/lib/tomcat7/conf/Path/Path_keystore" keystorePass="******" protocol="org.apache.coyote.http11.Http11NioProtocol" scheme="https" 
                   secure="true" sslProtocol="TLS" />

1
请注意,"-ssl3" 不等同于 "--sslv3",而是等同于 -s -s -l -3... - Daniel Stenberg
1个回答

5
设置 --sslv3 和不设置的主要区别在于,客户端在初始 ClientHello 消息中不会宣布支持高于 SSL3.0 的版本。通常客户端和服务器都同意一种双方都支持的版本,因此客户端宣布其支持的最佳 SSL 版本是正确的。
看起来在您的情况下,您面临的是这样一种情况:服务器(或某些中间件)不仅无法使用更新的 TLS 版本,而且还无法正确处理 SSL 3.0,因为如果客户端宣布支持更新的版本,则会出现错误。由于服务器软件本身看起来并不旧,您可能有一个非常奇怪的服务器设置或者一些中间件(如负载均衡器、防火墙等)无法处理正确的 TLS。
如果您发布有关服务器的更多信息,可能会提供更多信息。您也可以检查服务器是否符合 SSLLabs
编辑:看起来服务器支持 TLS1.*,但当客户端提供 ECDHE-RSA-AES256-SHA 密码时会断开连接。使用 openssl s_client -cipher 'ALL:!ECDHE-RSA-AES256-SHA'curl --ciphers 'ALL:!ECDHE-RSA-AES256-SHA' 可以正常工作。我认为这是服务器端的问题 - 您可能配置了实际上不受 tomcat SSL 实现(因为 Java 有自己的实现)支持的密码,当 Java 尝试使用它们时会出错。

我添加了Tomcat配置(支持TLS)...你能告诉我你还想获取什么更多的信息吗?只是提醒你,服务器在AWS上... - Yakiros
你尝试过像我建议的那样检查服务器是否符合ssllabs标准吗? - Steffen Ullrich
是的,我的证书得分是100分,协议支持得分是90分,密钥交换得分是40分,密码强度得分是60分(将在下次更新中修复...)。在握手模拟中,我几乎全部都成功了...(大多数安卓失败了)... - Yakiros
在这里公布网站名称会有问题吗?只有模糊的信息很难调试问题:百分比评级并没有说明它检测到的问题。 - Steffen Ullrich
我认为这是服务器端的错误配置或Java中的一个漏洞。 - Steffen Ullrich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接