4

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

该问题将在代码中表现出来,如下所示:

>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 <===
    • 版本:TLS 1.0 (0x0301)
    • ...
    • 握手协议:客户端Hello
      • ...
      • 版本:TLS 1.0 (0x0301)

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

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

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

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

4

1 回答 1

3

我做了更多的测试和调试,发现有几个站点在默认或使用 Curl 的 TLSv1(curl.exe -k -v --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

如果您有类似的问题,这篇文章对我解决“SSL 未知 SSL 协议错误”问题非常有用:

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

于 2012-11-21T22:46:00.130 回答