【问题标题】:https connection using CURL from command line从命令行使用 CURL 的 https 连接
【发布时间】:2012-04-22 05:01:54
【问题描述】:

我是 Curl 和 Cacerts 世界的新手,在连接服务器时遇到问题。 基本上,我需要通过 https 测试从一台机器到另一台机器的连接性。 我有一个需要从机器 A(Linux 机器)连接到的 URL 我在命令提示符下试过这个

cmd> curl https://[my domain or IP address]

得到以下结果:

curl: (60) SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

在浏览互联网上的一些文章时,我这样做了:

openssl s_client -connect <domain name or Ip address>:443

并得到了一些回应,包括 服务器证书(在-----BEGIN CERTIFICATE----- and -----END CERTIFICATE----- 内)。

从这里我接下来应该做什么。我想,我只需要复制粘贴里面的文字 BEGIN CERTIFICATE &amp; END CERTIFICATE 并将其保存在文件中。 但, 它应该是什么类型的文件? .pem, .crt ?.. 之后我该怎么办?

我试过这个 - 复制 BEGIN CERTIFICATE &amp; END CERTIFICATE 中的文本并将其保存在 .crt 文件中 - 将其命名为 my-ca.crt (也尝试将其命名为 my-ca.pem 文件) 然后这样做:

cmd>curl --cacert my-ca.crt https://[my domain or IP address]

但是遇到了同样的错误。

【问题讨论】:

  • 不确定你建议的解决方案,但我只是在寻找类似的信息,我发现这个有用的网站用于使用 curl 和 PHP unitstep.net/blog/2009/05/05/…
  • 您也可以添加--insecure 以忽略 SSL 错误。
  • 新版本的 curl(例如 7.64)无法识别像 RC4-SHA 这样的旧密码 - 使用旧版本的 curl (7.46) 帮助了我serverfault.com/questions/889631/…

标签: curl ssl command-line https certificate


【解决方案1】:

我遇到了同样的问题 - 我正在从我自己的网站上获取一个页面,该网站是通过 HTTPS 提供的,但 curl 给出了相同的“SSL 证书问题”消息。我通过在调用中添加-k 标志来解决它以允许不安全的连接。

curl -k https://whatever.com/script.php

编辑:我发现了问题的根源。我使用的是 SSL 证书(来自 StartSSL,但我认为这并不重要)并且没有正确设置中间证书。如果您遇到与上述 user1270392 相同的问题,最好先使用test your SSL cert 解决任何问题,然后再使用curl -k 修复。

【讨论】:

  • -k 标志是一个不错的快捷方式。为我工作!
【解决方案2】:

简单的解决方案

这是我的日常脚本:

curl --insecure -v https://www.google.com 2>&1 | awk 'BEGIN { cert=0 } /^\* Server certificate:/ { cert=1 } /^\*/ { if (cert) print }'

输出:

* Server certificate:
*    subject: C=US; ST=California; L=Mountain View; O=Google Inc; CN=www.google.com
*    start date: 2016-01-07 11:34:33 GMT
*    expire date: 2016-04-06 00:00:00 GMT
*    issuer: C=US; O=Google Inc; CN=Google Internet Authority G2
*    SSL certificate verify ok.
* Server GFE/2.0 is not blacklisted
* Connection #0 to host www.google.com left intact

【讨论】:

  • 因此,您每天都允许通过 TSL 进行--insecure 连接...
  • @Brethlosze 感谢您的评论。但是,事实并非如此。重点是从各种证书中获取 SSL 信息。
  • 我不明白这是一个解决方案吗?这可能会返回一些 ssl 信息,但您还没有解释这与问题的相关性。 @Brethlosze 是正确的,如果您使用它(即使用于收集信息),您使用 SSL 来获取该信息,这意味着您的请求很容易被滥用。
  • @Brethlosze Duh
【解决方案3】:

您需要将整个证书链提供给 curl,因为 curl 不再附带任何 CA 证书。由于 cacert 选项只能使用一个文件,因此您需要将完整的链信息连接到 1 个文件中

将证书链(例如从您的浏览器)复制到 DER 编码的二进制 x.509(.cer) 中。为每个证书执行此操作。

将证书转换为 PEM,并将它们合并为 1 个文件。

openssl x509 -inform DES -in file1.cer -out file1.pem -text
openssl x509 -inform DES -in file2.cer -out file2.pem -text
openssl x509 -inform DES -in file3.cer -out file3.pem -text

cat *.pem > certRepo

curl --cacert certRepo -u user:passwd -X GET -H 'Content-Type: application/json' "https//somesecureserver.com/rest/field"

我在这里写了一篇关于如何做到这一点的博客:http://javamemento.blogspot.no/2015/10/using-curl-with-ssl-cert-chain.html

【讨论】:

  • 你能解释一下传递用户名和密码的目的吗?如果我正在编写 Java 客户端,在这种情况下,我是否需要在 GET 请求的标头中传递用户名和密码?
  • @Shubhi224 如果您的 https 服务器不需要对 GET 请求进行简单身份验证,则不会。我不得不使用身份验证,因为它是一个需要它的 REST 调用。
  • 正如这个答案中提到的“您需要提供整个证书链来 curl,因为 curl 不再附带任何 CA 证书。”
【解决方案4】:

使用--cacert 指定.crt 文件。 ca-root-nss.crt 例如。

【讨论】:

    【解决方案5】:

    我确实遇到过这种问题,我通过以下步骤解决了:

    1. 从此处获取根 CA 证书包:https://curl.haxx.se/ca/cacert.pem 并将其保存在本地

    2. 找到php.ini文件

    3. curl.cainfo 设置为证书的路径。所以它会是这样的:

    curl.cainfo = /path/of/the/keys/cacert.pem

    【讨论】:

      【解决方案6】:

      Here you could find the CA certs with instructions to download and convert Mozilla CA certs。 一旦获得ca-bundle.crtcacert.pem,您只需使用:

      curl.exe --cacert cacert.pem https://www.google.com
      

      curl.exe --cacert ca-bundle.crt https://www.google.com
      

      【讨论】:

        【解决方案7】:

        发现问题 我能够使用现有的系统默认 CA 文件,在 debian6 上是:

        /etc/ssl/certs/ca-certificates.crt
        

        作为 root 可以这样做:

        echo curl.cainfo=/etc/ssl/certs/ca-certificates.crt >> /etc/php5/mods-available/curl.ini
        

        然后重新启动网络服务器。

        【讨论】:

          【解决方案8】:

          你可以用这个

          curl_setopt($curl-&gt;curl, CURLOPT_SSL_VERIFYPEER, false);

          【讨论】:

            【解决方案9】:

            您需要证书链而不是单个证书。 使用 Firefox 很容易获得它:

            1. 在 Firefox 中打开网址。
            2. 点击网址左侧地址框上的安全图标。
            3. 点击connection not securemore information。在security 选项卡下,选择view certificate,滚动到最后。在 download 旁边,选择 PEM(chain) 以下载证书链。

            现在您将证书链作为一个文件,您可以在 --cacert 标志之后的 curl 请求中使用它:
            curl --cacert downloaded.pem -X POST https://the-url-to-access

            【讨论】:

              【解决方案10】:

              对我来说,我只是想测试一个具有自动 http->https 重定向的网站。我想我已经安装了一些证书,因此仅此一项就可以在运行 curl 7.47.0 (x86_64-pc-linux-gnu) libcurl/7.47.0 GnuTLS/3.4.10 zlib/1.2.8 libidn/1.32 librtmp/2.3 的 Ubuntu 16.04 上为我工作@

              curl --proto-default https &lt;target&gt;

              【讨论】:

                【解决方案11】:

                wget 有什么问题?

                不要抱怨标准被抛在后面。

                【讨论】:

                  【解决方案12】:

                  使用现代版本的 curl,您可以使用 --resolve 或 --connect-to(curl 比版本 7.49 更新)简单地覆盖要连接的 IP 地址。这甚至适用于 SSL/SNI。所有详细信息都在手册页中。

                  例如,要覆盖 DNS 并使用特定 IP 地址通过 ssl 连接到 www.example.com:(这也将覆盖 ipv6)

                  curl --resolve www.example.com:443:192.168.42.2 https://www.example.com/
                  

                  另一个例子,在 8080 端口上连接到名为 backend1 的特定后端服务器

                  curl --connect-to www.example.com:80:backend1.example.com:8080 http://www.example.com/
                  

                  如果服务器需要正确回答,请记住添加主机头:

                  -H 'Host:www.example.com' 
                  

                  【讨论】:

                  • 我不确定这如何回答这个问题。
                  猜你喜欢
                  • 1970-01-01
                  • 2015-05-09
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-12-17
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多