libcurl与OpenSSLUnknown SSL协议连接错误 - (没有服务器问候) - 为什么?

时间:2012-11-19 22:50:17

标签: openssl libcurl wireshark ssl

我正在开发一款需要与不同HTTPS服务器通信的应用。在某些情况下,服务器只是忽略SSL / TLS客户端Hello(不返回服务器Hello)。

问题会在代码中表现出来:

>curl32.exe -v -k --tlsv1 https://...
* timeout on name lookup is not supported
* About to connect() to <server> port 443 (#0)
*   Trying <IP>...
* connected
* Connected to <server> (<IP>) port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: ./cacert.test.pem
  CApath: none
* Unknown SSL protocol error in connection to <Server>:443

* Closing connection #0
===> CURLcode is: 35

返回的代码是:CURLE_SSL_CONNECT_ERROR

直接从OpenSsl运行时,这样就可以了:

OpenSSL> s_client -tls1 -connect <server>:443

我尝试了各种组合(指定TLS,SSL或未指定)。问题发生时唯一常见的事情是SSL / TLS版本不一致。所以在WireShark中,我将在TCP下看到安全套接字层:

  • SSL记录层:握手协议:客户端Hello&lt; ===
    • 版本:TLS 1.0(0x0301)
    • ...
    • 握手协议:客户端您好
      • ...
      • 版本:TLS 1.0(0x0301)

在正确的情况下,我将从服务器看到Server Hello,我将看到:

  • TLSv1记录层:握手协议:客户端Hello&lt; ===
    • 版本:TLS 1.0(0x0301)
    • ...
    • 握手协议:客户端您好
      • ...
      • 版本:TLS 1.0(0x0301)

我不完全确定它是libcurl问题,或者WireShark没有正确解码它(因为两种情况下的记录层看起来几乎相同,并且2版本字段是正确的),使得libcurl似乎是问题

有什么想法?想法?类似经历?任何帮助非常感谢!!

1 个答案:

答案 0 :(得分:3)

我做了更多的测试和调试,发现有几个站点一直都是使用Curl(curl.exe -k -v --tlsv1,或者没有--tlsv1)的默认或TLSv1失败,但是确定使用SSLv3。我很漂亮的版本不是问题,因为IE连接使用TLSv1和openSSL也可以使用TLSv1。但是我的时间不够用,因此SSLv3将用作解决方法。

真正的问题可能是在Client Hello中发送的密码列表。指定一个肯定有效的密码后,SSL就可以了:

curl.exe -k -v <site>                     # failed
curl.exe -k -v --ciphers RC4-MD5 <site>   # now will connect

如果您遇到类似问题,本文对我进行故障排除非常有用&#34; SSL未知SSL协议错误&#34;问题:

http://blog.techstacks.com/2010/03/3-common-causes-of-unknown-ssl-protocol-errors-with-curl.html