curl错误35:连接中出现未知的SSL协议错误

15
$ curl -I https://9.185.173.135
curl: (35) Unknown SSL protocol error in connection to 9.185.173.135:443

这是一个我需要访问的安全页面。但是我不知道如何获取它的证书文件。我尝试使用Firefox,但一旦输入URL,它就会显示无法获取任何SSL证书。

$ curl -I http://9.185.173.135
HTTP/1.1 200 OK
Content-Length: 686
Content-Type: text/html
Content-Location: http://9.185.173.135/Default.htm
Last-Modified: Mon, 16 Mar 2009 05:05:38 GMT
Accept-Ranges: bytes
ETag: "a851dbd8f4a5c91:d41"
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Date: Tue, 13 Jul 2010 04:09:35 GMT

从我的笔记本电脑上可以访问该服务器。一旦我获取证书文件,我可以将其导入到Firefox中,然后使用我的凭据通过身份验证(我已经获得了用户名和密码)。

很抱歉,我完全不是安全方面的专家。还有什么其他的尝试吗?

非常感谢您的帮助。


5
你能否使用 openssl s_client -host 9.185.173.135 -p 443 建立与服务器的连接? - Rudi
@ Rudi:谢谢你的提示,请看我的答案更新 :) - Michael Mao
1
我的 OpenSSL 要求我使用 -connect <ip>:<port> 而不是 -host <ip> -p <port>,可能在较新版本中更改了。 - froderik
服务器可能正在使用SSL2或SSL3协议...这些协议现在已经过时了。 - Lorinczy Zsigmond
8个回答

5

试试这个

curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_SSLv3); // Force SSLv3 to fix Unknown SSL Protocol error

但这在SPDY上不起作用。 在那里,您必须使用spdycat。我不是作者,但它是一个开源项目。 - Ján Sáreník
1
FYI:我们之前尝试过这个,但是没有成功。后来从另一个答案中发现了 curl_setopt($ch, CURLOPT_SSLVERSION, 4); 这个方法,它起作用了(版本为4,而不是3)。 - William Joss Crowcroft
这种方法存在安全风险。请参阅 PHP 文档。http://php.net/manual/en/function.curl-setopt.php - Goose
1
请不要为应该接收描述性枚举的内容使用任意数字。例如,@WilliamJossCrowcroft错误地将4称为“版本4”(可能是CURL_SSLVERSION_TLSv1_0)。正确的值是CURL_SSLVERSION_SSLv3。 - D.Go

2
给Rudi:感谢你的提示,它告诉了我非常多的信息。
一些被保护页面的管理员每天都会“刷新”证书状态。因此,尽管昨天我被阻止访问该网页,但它慷慨地让我获取另一个证书并将其添加到Firefox例外列表中。
所以现在一切都正常工作了,我真的从昨天的经历中学到了一些东西。

1

如果curl版本低于7.34,您可以使用--tlsv1选项解决该问题。

 curl -I --tlsv1 https://9.185.173.135

使用更新的curl版本即可解决问题。 - Ivan Chau

1
在我的情况下,在AIX虚拟机上也遇到了这个问题,使用--cacert指定cacert.pem即可。 curl --cacert /var/ssl/cacert.pem https://localhost:3000

在经典环境(Windows 10 / Apache)上也可以工作。你节省了我数小时的研究时间! - Pierre Le Bot

0

我有类似的问题:

 curl https://localhost:3000
 ...
 curl: (35) Unknown SSL protocol error in connection to localhost:-9847

(不确定那个数字-9847是从哪里来的,因为我请求的是端口3000)

修复:结果发现我的运行在端口3000上的服务器是运行“http”而不是“https”,真是让人费解。


0
当我使用curl/httpie针对从Eclipse部署在我的本地计算机上的Tomcat服务器运行时,遇到了相同的错误。事实证明,Eclipse部署的默认server.xml禁用了https。具体来说,下面的部分在server.xml中被注释掉了。
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
           maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
           clientAuth="false" sslProtocol="TLS" />

取消注释并添加两个密钥库参数后,curl命令开始工作(如果证书是自签名的,则使用--insecure选项)。

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
           maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
           clientAuth="false" sslProtocol="TLS" />
           keystoreFile="/path/to/your/keystore"
           keystorePass="yourpass" />

0

在目标SSL站点更新SSL证书后,我遇到了相同的错误。 我的源操作系统是Centos 6,更新到新的curl版本解决了这个问题。 *注意,我已经使用了curl -k(不安全选项),但仍然会出现该错误。实际上,此错误是由于nss或openssl过时引起的。 yum -y install curl nss openssl 请记住,如果您有像PHP这样调用curl的Web应用程序,则需要重新启动Apache以使更新生效。

我根据这个指南进行了更新:http://realtechtalk.com/curl_35_Unknown_SSL_protocol_error_in_connection_Solution_Centos-1988-articles


0

我有一些解决方案可以帮助你解决这个问题:

1] 尝试更新你的curl/php/apache [ yum update ]

2] 重启apache

这些方法对我很有效!


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