我正在开发一款需要与不同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下看到安全套接字层:
在正确的情况下,我将从服务器看到Server Hello,我将看到:
我不完全确定它是libcurl问题,或者WireShark没有正确解码它(因为两种情况下的记录层看起来几乎相同,并且2版本字段是正确的),使得libcurl似乎是问题
有什么想法?想法?类似经历?任何帮助非常感谢!!
答案 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