【问题标题】:curl error 35 : unknown SSL protocol error in connectioncurl 错误 35:连接中的未知 SSL 协议错误
【发布时间】:2011-03-15 03:08:42
【问题描述】:
$ 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,然后使用我的凭据通过身份验证(我已经获得了用户名/密码)。

抱歉,我根本不是安全专家。还有什么我可以尝试的吗?

提前非常感谢。

【问题讨论】:

  • 你能用openssl s_client -host 9.185.173.135 -p 443与服务器建立连接吗?
  • @Rudi:谢谢提示,更新请看我的回答:)
  • 我的 open_ssl 想让我做 -connect : 而不是 -host -p - 可能在较新的版本中发生了变化。
  • 服务器可能正在使用 SSL2 或 SSL3...这些协议现在已弃用。

标签: ssl curl ssl-certificate


【解决方案1】:

试试这个

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

【讨论】:

  • 但这不适用于 SPDY。在那里你必须使用spdycat。我不是作者,但它是一个开源项目。
  • 仅供参考:我们有这个,但它没有用。从我们发现的另一个答案中:curl_setopt($ch, CURLOPT_SSLVERSION, 4); 有效。 (第 4 版,而不是第 3 版)。
  • 这种方法存在安全风险。请参阅 PHP 文档。 php.net/manual/en/function.curl-setopt.php
  • 请不要对应该接收描述性枚举的东西使用任意数字。例如,@WilliamJossCrowcroft 错误地将 4 称为“版本 4”(可能是 CURL_SSLVERSION_TLSv1_0)。正确的值为 CURL_SSLVERSION_SSLv3。
【解决方案2】:

致鲁迪:感谢您的提示,这告诉了我很多信息。

不知何故,安全页面的管理员每天都会“刷新”认证状态。所以虽然我昨天被阻止访问它,但它慷慨地让我获取另一个证书并将其添加到 Firefox 的例外列表中。

所以一切正常,我真的从昨天的经验中学到了一些东西。

【讨论】:

    【解决方案3】:

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

     curl -I --tlsv1 https://9.185.173.135
    

    【讨论】:

      【解决方案4】:

      在我的 AIX VM 上也是这个问题,使用 --cacert 来指定一个 cacert.pem

      curl --cacert /var/ssl/cacert.pem https://localhost:3000

      【讨论】:

      • 也适用于经典环境(Windows 10 / Apache)。您为我节省了数小时的研究时间!
      【解决方案5】:

      在从 Eclipse 部署的本地主机上的 Tomcat 服务器上运行 curl/httpie 时,我遇到了同样的错误。事实证明,Eclipse disables https 部署的默认 server.xml。具体来说,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" />
      

      【讨论】:

        【解决方案6】:

        我有一些解决方案可以解决我的问题:

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

        2]重启apache

        那些对我有用!

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

            【解决方案8】:

            我也有类似的问题:

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

            (由于我请求了端口 3000,因此不确定该数字 -9847 来自哪里)

            修复:原来我的服务器在端口 3000 上运行的是“http”而不是“https”。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-01-11
              • 2013-10-23
              • 1970-01-01
              • 2014-12-16
              • 2015-05-17
              • 2017-10-07
              • 1970-01-01
              • 2017-10-02
              相关资源
              最近更新 更多