我正在开发一个需要与不同 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 似乎是问题所在。
有什么想法吗?想法?类似的经历?非常感谢任何帮助!