使用OpenSSL 0.9.8运行curl与OpenSSL 1.0.0服务器通信时出现握手错误?

10

如果我对一台运行 OpenSSL 1.0.0e 的机器运行 curl 命令,例如:

curl -v https://shumaker.flexrentalsolutions.com

在运行 OpenSSL 0.9.8r 的机器上,我收到以下错误:

About to connect() to shumaker.flexrentalsolutions.com port 443 (#0)
*   Trying 50.112.122.15... connected
* Connected to shumaker.flexrentalsolutions.com (50.112.122.15) port 443 (#0)
* SSLv3, TLS handshake, Client hello (1):
* error:14077458:SSL routines:SSL23_GET_SERVER_HELLO:reason(1112)
* Closing connection #0

如果我在一台运行OpenSSL 1.0.0e的机器上运行相同的curl命令,则该命令会顺利完成。

看起来握手没有正确完成,似乎是由于两个OpenSSL版本之间的某些不兼容性造成的。

有任何想法如何修复这个问题吗?

5个回答

13
如果在协议中设置了 OpenSSL 版本,则可以正常工作:
对于命令行:
curl -v -3 https://shumaker.flexrentalsolutions.com

如果在 PHP 中:

curl_setopt($ch, CURLOPT_SSLVERSION,3);

我遇到了OP提到的openssl错误bug。@jbaylina 的解决方案解决了我的问题。谢谢! - ThinkBonobo

6

这是一个仍然存在的(OpenSSL)漏洞。详细信息已经发布在curl bug report中。

"mancha"在OpenSSL-dev上发布了更多细节。


我成功地让Apache使用OpenSSL 0.9.8,通过使用一个指向OpenSSL 0.9.8的mod_ssl模块构建。这个改变解决了问题。你知道OpenSSL 1.0.0的bug何时会被修复吗? - rogiller

0

我在使用brew访问一些https服务器时,在OS X上遇到了问题,brew在内部使用curl。请注意,这仅适用于OS X 10.7.5,该版本固定在OpenSSL/0.9.8r上。我想升级,但苹果不支持在这台iMac上升级到10.7以上的版本!

我的解决方法是使用brew升级curl,将版本升级到1.0.2f,幸运的是,curl的brew安装没有出现问题。

brew install curl

0

现在由于 POODLE漏洞,许多网站现在禁用了 SSL 3.0

您应该像这样使用 TLS

curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1)

如果您仍然遇到错误(对于Apache),请检查您的 vhost 是否获得了正确的设置 ServerName


POODLE在2011年之前并不存在。早在2005年左右,我们就知道填充漏洞的存在,但大多数人选择忽略它。浏览器也是问题的一部分,因为它们长时间保持SSLv3的启用状态。请参阅Loren Weith的《SSLv2、SSLv3和TLS之间的差异》(http://www.yaksman.org/~lweith/ssl.pdf)。 - jww

0

这不是一个好的解决方案,但比无所事事要好,因此我将其作为答案添加在这里:

如果可以,请使用GnuTLS模块而不是mod_ssl。它不绑定于OpenSSL,因此可以巧妙地避开这个可怕的浪费时间的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接