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

时间:2014-10-21 08:04:32

标签: ubuntu ssl curl openssl

我正在尝试使用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 个答案:

答案 0 :(得分:4)

设置--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实现的支持(这不是OpenSSL,因为Java有自己的实现),Java尝试使用它们时会出现问题