如何修复curl sslv3警报握手失败?

如何修复curl sslv3警报握手失败?

我正在尝试通过以下方式卷曲 HTTPS 网站:

$ curl -v https://thepiratebay.se/

但是它失败并出现错误:

* About to connect() to thepiratebay.se port 443 (#0)
*   Trying 173.245.61.146...
* connected
* Connected to thepiratebay.se (173.245.61.146) port 443 (#0)
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS alert, Server hello (2):
* error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
* Closing connection #0
curl: (35) error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure

使用-k/--insecure或添加insecure到 my~/.curlrc没有任何区别。

如何使用curl命令行忽略或强制证书?


使用时wget似乎效果很好。测试时也有效,openssl如下所示:

$ openssl s_client -connect thepiratebay.se:443
CONNECTED(00000003)
SSL handshake has read 2651 bytes and written 456 bytes
New, TLSv1/SSLv3, Cipher is AES128-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : AES128-SHA

我有:

$ curl --version
curl 7.28.1 (x86_64-apple-darwin10.8.0) libcurl/7.28.1 OpenSSL/0.9.8| zlib/1.2.5 libidn/1.17
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smtp smtps telnet tftp 
Features: IDN IPv6 Largefile NTLM NTLM_WB SSL libz 

答案1

某些站点禁用对 SSL 3.0 的支持(可能是因为许多漏洞/漏洞),因此可以通过-2/--sslv2-3/强制使用特定的 SSL 版本--sslv3。如果请求的页面已移动到其他位置,也-L值得一试。

就我而言,这是一个curl错误(在 OpenSSL 中找到),所以curl需要升级到最新版本(>7.40)并且工作正常。

也可以看看:

答案2

从 Mavericks 开始,Apple 将 TLS/SSL 引擎从 OpenSSL 切换到 Apple 分布式 cURL 二进制文件中自己的安全传输引擎,这破坏了客户端证书的使用。使用自制程序中的 cURL 二进制文件:

brew install curl
brew link curl --force

答案3

当我发送错误的主机头时,我遇到了这个错误。

我正在开发一个代理http://127.0.0.1:12345https://site.com:443。所以我按原样发送来自浏览器的请求标头,并且有 host:127.0.0.1:12345 标头。我删除了来自浏览器的主机标头来解决问题。

相关内容