【问题标题】:curl: (60) SSL certificate problem: unable to get local issuer certificatecurl: (60) SSL 证书问题:无法获取本地颁发者证书
【发布时间】:2021-05-24 06:00:03
【问题描述】:
root@sclrdev:/home/sclr/certs/FreshCerts# curl --ftp-ssl --verbose ftp://{abc}/ -u trup:trup --cacert /etc/ssl/certs/ca-certificates.crt
* About to connect() to {abc} port 21 (#0)
*   Trying {abc}...
* Connected to {abc} ({abc}) port 21 (#0)
< 220-Cerberus FTP Server - Home Edition
< 220-This is the UNLICENSED Home Edition and may be used for home, personal use only
< 220-Welcome to Cerberus FTP Server
< 220 Created by Cerberus, LLC
> AUTH SSL
< 234 Authentication method accepted
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS alert, Server hello (2):
* SSL certificate problem: unable to get local issuer certificate
* Closing connection 0
curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: http://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.

【问题讨论】:

标签: curl ssl openssl ssl-certificate x509certificate


【解决方案1】:

与“SSL 证书问题:无法获取本地颁发者证书”错误有关。需要注意的是,这适用于发送 CURL 请求的系统,而不是接收请求的服务器。

  1. https://curl.haxx.se/ca/cacert.pem下载最新的cacert.pem

  2. 在 curl 命令中添加“--cacert /path/to/cacert.pem”选项,以告知 curl 本地证书颁发机构文件的位置。

  3. (或)在“.curlrc”文件中创建或添加以下行: cacert = /path/to/cacert.pem 有关 curl 查找此文件的位置的信息,请参阅有关“-K、--config ”部分的“man curl”部分。

  4. (或者如果使用 php)将以下行添加到 php.ini:(如果这是共享主机并且您无权访问 php.ini,那么您可以将其添加到 public_html 中的 .user.ini)。

curl.cainfo="/path/to/downloaded/cacert.pem"

确保将路径用双引号括起来!!!

  1. (也许也适用于 php)默认情况下,FastCGI 进程将每 300 秒解析一次新文件(如果需要,您可以通过添加几个文件来更改频率,如下所示 https://ss88.uk/blog/fast-cgi-and-user-ini-files-the-new-htaccess/)。

【讨论】:

  • 第一个涉及使用 OpenSSL 库执行的操作的认证;第二个使用 cURL 发出的请求
  • 实际上我挣扎了一个小时,因为我没有在引号内写路径。所以请在这里记下curl.cainfo="/path/to/downloaded/cacert.pem" // Do not forget to write between quotes
  • 我在 PHP 的问题中看不到任何参考。为什么要在答案中引用?如果问题已被编辑,那么是否可以编辑答案以反映正在使用的命令行?
  • @Adam 虽然问题没有提到 PHP,但它在 Google 中作为 PHP 生成的特定错误消息的第一搜索结果出现。所以,也许它并没有专门回答 OP 的问题,但它似乎对社区仍然有用。
  • 这个答案误导了我,因为它是一个与 PHP 相关的解决方案
【解决方案2】:

由于 cURL 无法验证服务器提供的证书而失败。

有两种方法可以让它发挥作用:

  1. 使用带有-k 选项的cURL,它允许curl 建立不安全的连接,即cURL 不验证证书。

  2. 将根 CA(签署服务器证书的 CA)添加到 /etc/ssl/certs/ca-certificates.crt

您应该使用选项 2,因为它可以确保您连接到安全的 FTP 服务器。

【讨论】:

  • 我在里面添加了我的 rootCA.pem 文件:- root@sclrdev:/home/certs/FreshCerts# ll /etc/ssl/certs/rootCA.pem -rwxrwxrwx 1 root root 1302 Jul 8 00: 09 /etc/ssl/certs/rootCA.pem* 即使我用我的 rootCA.pem 验证了 ServerCertificate.pem 文件:- root@sclrdev:/home/certs/FreshCerts# openssl verify -CAfile rootCA.pem ../ServerCertificate。 pem ServerCertificate.pem: OK 还有 ca-certificates.crt 中 rootCA.pem 的内容。 root@sclrdev:/home/sclr/subhendu/certs/FreshCerts# ll /etc/ssl/certs/ca-certificates.crt -rw-r--r-- 1 root root 247945 Jul 8 00:10 /etc/ssl /certs/ca-certificates.crt
  • 我无法弄清楚我哪里出错了。在 WireShark 跟踪中,我收到以下错误:- Client Hello Server Hello, Certificate, Server Hello Done Alert (level : Fatal, Description: unknown CA (48)) 你能指导我并帮助我吗?
  • openssl 的工作方式是在验证期间尝试完成证书链。您的服务器证书是否由中间 CA 而不是根 CA 签名。例如
  • 我的证书仅由根 CA 签名。
  • 我遇到了一些错误:- root@sclrdev:~# openssl s_client -connect :21 -showcerts CONNECTED(00000003) 3074050248:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:s23_clnt .c:766: --- 没有可用的对等证书 --- 没有发送客户端证书 CA 名称 --- SSL 握手已读取 7 个字节并写入 225 个字节 --- 新,(无),密码是(无)安全重新协商不支持压缩:无扩展:无 --- 我不确定这到底是什么意思?
【解决方案3】:

我已经通过在 cURL 脚本中添加一行代码解决了这个问题:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

警告:这使得请求绝对不安全(参见@YSU 的回答)!

【讨论】:

  • 这可能有助于规避问题。但它完全错过了https的想法和认证系统。
  • 有效!如果您不关心证书,那么快速 n 肮脏的绕过方式
  • 这使得它完全不安全。
  • 我在本地服务器上遇到了这个问题,尽管相同的代码在登台服务器上运行良好。对我来说很好,因为它在本地。谢谢
  • 添加此检查以确保您仅将其用于本地服务器if( stristr("127.0.0.1",$_SERVER["SERVER_NAME"] ) || stristr("localhost",$_SERVER["SERVER_NAME"] )) curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
【解决方案4】:

对我来说,简单的证书安装有帮助:

sudo apt-get install ca-certificates

【讨论】:

  • 例如,一些小型 docker 容器可能没有安装它,当整个包不存在时,没有必要对其他任何东西进行故障排除。
【解决方案5】:

在我的情况下,在我尝试使用 cURL 使用的服务上安装证书时出现问题。 我未能将中间证书和根证书捆绑/连接到我的域证书中。起初这并不明显,因为 Chrome 解决了这个问题并接受了证书,尽管忽略了中间证书和根证书。

捆绑证书后,一切都按预期工作。我是这样捆绑的

$ cat intermediate.crt >> domain.crt

并为所有中间证书和根证书重复。

【讨论】:

  • 我遇到了类似的问题,只是我没有将 Apache SSLCertificateChainFile 设置为正确的证书。
  • 请注意,如果您这样做,并且您要添加的 crt 没有尾随换行符,那么您的包中将有类似 -----END CERTIFICATE----------BEGIN CERTIFICATE----- 的行,您将获得晦涩的错误:curl: (77) error setting certificate verify locations
  • 我正在使用letsencrypt证书,但仅将证书和私钥部署到服务器。我计算机上的 Chrome 和 curl 没有抱怨,但是我正在构建的 nodejs 应用程序不接受证书。将全链部署到服务器解决了这个问题!感谢您指出正确的方向!
  • 就我而言(来自 comodo 的证书),他们将中间证书作为 my-domain.ca-bundle 发送。我不得不将它附加到 my-domain.crt。谢谢!
【解决方案6】:

安装 Git Extensions v3.48 后出现此问题。尝试再次安装 mysysgit 但同样的问题。最后,必须禁用(请考虑安全隐患!)Git SSL 验证:

git config --global http.sslVerify false

但如果您有域证书,最好将其添加到 (Win7)

C:\Program Files (x86)\Git\bin\curl-ca-bundle.crt

【讨论】:

【解决方案7】:

我们最近遇到了这个错误。原来它与未正确安装在 CA 存储目录中的根证书有关。我使用 curl 命令直接指定 CA 目录。 curl --cacert /etc/test/server.pem --capath /etc/test ... 此命令每次都失败,curl: (60) SSL 证书问题:无法获取本地颁发者证书。

使用strace curl ... 后,确定 curl 正在寻找名称为 60ff2731.0 的根证书文件,该文件基于 openssl 哈希命名约定。所以我发现这个命令可以有效地正确导入根证书:

ln -s rootcert.pem `openssl x509 -hash -noout -in rootcert.pem`.0

创建软链接

60ff2731.0 -> rootcert.pem

curl,在后台读取 server.pem 证书,确定根证书文件 (rootcert.pem) 的名称,将其转换为其哈希名称,然后进行 OS 文件查找,但找不到它。

因此,要点是,当 curl 错误不明显时运行 curl 时使用 strace(这是一个巨大的帮助),然后确保使用 openssl 命名约定正确安装根证书。

【讨论】:

  • 呼,确实有帮助。详细说明一下对我有什么帮助:a) 运行 strace curl... b) 使用 something-hex.0 查找失败的 stat() c) 用 Google 搜索 something-hex,找到相应的证书 d) 将找到的证书放入 /usr/ local/share/ca-certificates/(带有 *.crt 扩展名,因为 *.pem 不起作用) e) 运行 update-ca-certificates 。然后宾果游戏! - 必要的符号链接是在 /usr/lib/ssl/certs/ 中自动创建的
【解决方案8】:

很可能是服务器缺少证书。

根->中间->服务器

服务器应至少发送服务器和中间体。

使用openssl s_client -showcerts -starttls ftp -crlf -connect abc:21 调试问题。

如果只返回一个证书(自签名或颁发),那么您必须选择:

  1. 修复服务器
  2. 信任该证书并将其添加到您的 CA 证书存储区(不是最好的主意)
  3. 禁用信任,例如curl -k(非常糟糕的主意)

如果服务器返回多个,但不包括自签名(根)证书:

  1. 在您的 CA 存储中为该链安装 CA(根)证书,例如谷歌发行人。 (仅在您信任该 CA 的情况下
  2. 固定服务器以将 CA 作为链的一部分发送
  3. 信任链中的证书
  4. 禁用信任

如果服务器返回了根 CA 证书,那么它不在您的 CA 存储中,您的选择是:

  1. 添加(信任)它
  2. 禁用信任

我忽略了过期/撤销的证书,因为没有消息表明它。但是你可以用openssl x509 -text检查证书

鉴于您要连接到家庭版 (https://www.cerberusftp.com/support/help/installing-a-certificate/) ftp 服务器,我会说它是自签名的。

请发布更多详细信息,例如 openssl 的输出。

【讨论】:

    【解决方案9】:

    更新证书列表可能就足够了

    sudo update-ca-certificates -f
    

    update-ca-certificates 是一个程序,它更新目录 /etc/ssl/certs 以保存 SSL 证书并生成 ca-certificates.crt,这是一个串联的单文件证书列表。

    【讨论】:

    • 做到了,运行后一切都完成了。但是卷曲不起作用。还是一样的错误。
    • 我做了命令,但没有帮助,我不敢相信我必须做以上所有事情。然后你的答案......感谢'-f'标志。
    【解决方案10】:

    根据cURL docs也可以把证书传给curl命令:

    获取可以验证远程服务器的 CA 证书并使用 指出此 CA 证书以进行验证的正确选项 连接。对于libcurl黑客:curl_easy_setopt(curl, CURLOPT_CAPATH, capath);

    使用 curl 命令行工具:--cacert [file]


    例如:

    curl --cacert mycertificate.cer -v https://www.stackoverflow.com
    

    【讨论】:

      【解决方案11】:

      我也遇到过这个问题。我已经阅读了这个帖子,大多数答案都提供了丰富的信息,但对我来说过于复杂。我在网络主题方面没有经验,所以这个答案适合像我这样的人。

      就我而言,发生此错误是因为我没有在我的应用程序中使用的证书旁边包含中间证书和根证书。

      这是我从 SSL 证书供应商那里得到的:

      - abc.crt
      - abc.pem
      - abc-bunde.crt
      

      abc.crt 文件中,只有一个证书:

      -----BEGIN CERTIFICATE-----
      /*certificate content here*/
      -----END CERTIFICATE-----
      

      如果我以这种格式提供它,浏览器将不会显示任何错误 (Firefox),但我会在执行 curl 请求时收到 curl: (60) SSL certificate : unable to get local issuer certificate 错误。

      要修复此错误,请检查您的 abc-bunde.crt 文件。您很可能会看到如下内容:

      -----BEGIN CERTIFICATE-----
      /*additional certificate content here*/
      -----END CERTIFICATE-----
      -----BEGIN CERTIFICATE-----
      /*other certificate content here*/
      -----END CERTIFICATE-----
      -----BEGIN CERTIFICATE-----
      /*different certificate content here*/
      -----END CERTIFICATE-----
      

      这些是您的中间证书和根证书。发生错误是因为您提供给应用程序的 SSL 证书中缺少它们。

      要修复错误,请按以下格式合并这两个文件的内容:

      -----BEGIN CERTIFICATE-----
      /*certificate content here*/
      -----END CERTIFICATE-----
      -----BEGIN CERTIFICATE-----
      /*additional certificate content here*/
      -----END CERTIFICATE-----
      -----BEGIN CERTIFICATE-----
      /*other certificate content here*/
      -----END CERTIFICATE-----
      -----BEGIN CERTIFICATE-----
      /*different certificate content here*/
      -----END CERTIFICATE-----
      

      请注意,证书之间没有空格,在文件的末尾或开头。一旦您向您的应用程序提供此组合证书,您的问题就应该得到解决。

      【讨论】:

      • 这解决了我的问题。没有意识到证书之间有一个空行是不好的。
      【解决方案12】:
      1. 下载https://curl.haxx.se/ca/cacert.pem

      2. 下载后,将此文件移动到您的 wamp 服务器。

        对于 exp:D:\wamp\bin\php\

      3. 然后将以下行添加到底部的php.ini文件中。

      curl.cainfo="D:\wamp\bin\php\cacert.pem"

      1. 现在重新启动您的 wamp 服务器。

      【讨论】:

      • 我也使用 WAMP,你的方式帮助了我。谢谢!
      • 我的荣幸#Dmitiry Korytnyi
      • 为什么人们不帮忙做出这个答案
      【解决方案13】:

      输入这两个代码以禁用 SSL 证书问题。它对我有用 经过大量研究,我发现了这一点。

      curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
      

      【讨论】:

      • 我应该在哪里输入这些行?在什么文件中?地点?
      【解决方案14】:

      尝试在 Ubuntu 中重新安装 curl,并使用更新证书的 sudo update-ca-certificates --fresh 更新我的 CA 证书

      【讨论】:

        【解决方案15】:

        是的,您还需要添加 CA 证书。在 Node.js 中添加代码 sn-p 以获得清晰的视图。

        var fs = require(fs)
        var path = require('path')
        var https = require('https')
        var port = process.env.PORT || 8080;
        var app = express();
        
        https.createServer({
        key: fs.readFileSync(path.join(__dirname, './path to your private key/privkey.pem')),
        cert: fs.readFileSync(path.join(__dirname, './path to your certificate/cert.pem')),
        ca: fs.readFileSync(path.join(__dirname, './path to your CA file/chain.pem'))}, app).listen(port)
        

        【讨论】:

          【解决方案16】:

          在 Windows 上我遇到了这个问题。 Curl 是由 mysysgit 安装的,因此下载并安装最新版本解决了我的问题。

          否则这些是不错的instructions,关于如何更新您可以尝试的 CA 证书。

          【讨论】:

            【解决方案17】:

            我的情况不同。我在防火墙后面托管一个站点。该错误是由 pfSense 引起的。

            Network layout: |Web Server 10.x.x.x| <-> |pfSense 49.x.x.x| <-> |Open Internet|
            

            无意中找到了原因,感谢this answer


            当我从 WAN 访问 my site 时一切正常。

            但是,当从 LAN 内部访问该站点时(例如,当 Wordpress 向其自己的服务器发出 curl 请求时,尽管使用的是 WAN IP 49.x.x.x),它会被提供给 pfSense 登录页面。

            我将证书标识为pfSense webConfigurator Self-Signed Certificate。难怪curl报错了。

            原因: 发生的事情是 curl 正在使用该站点的 WAN IP 地址 49.x.x.x。但是,在 Web 服务器的上下文中,WAN IP 是防火墙。

            调试:我发现我正在获得 pfSense 证书。

            解决方案:在托管网站的服务器上,将自己的域名指向 127.0.0.1

            通过应用该解决方案,curl 的请求被 Web 服务器正确处理,并没有被转发到以发送登录页面响应的防火墙。

            【讨论】:

              【解决方案18】:

              您必须将服务器证书从 cert.pem 更改为 fullchain.pem
              我对 Perl HTTPS 守护进程有同样的问题:
              我变了:
              SSL_cert_file =&gt; '/etc/letsencrypt/live/mydomain/cert.pem'
              至:
              SSL_cert_file =&gt; '/etc/letsencrypt/live/mydomain/fullchain.pem'

              【讨论】:

              • 我在将现有证书移动到 Cyber​​Panel 主机时遇到了这个问题,这是我设法解决的方法。
              【解决方案19】:

              我打算评论Yuvik's answer,但我的声望点不够。

              当您将 .crt 文件导入/usr/share/local/ca-certificates 时,它需要采用正确的格式。其中一些已经在前面提到过,但没有人提到只需要一个换行符,也没有人收集过清单,所以我想我会提供一份。

              1. 证书需要以.crt 结尾。来自Ubuntu's man page

                证书必须具有 .crt 扩展名才能包含在 更新 CA 证书

              2. /usr/local/share/ca-certificates 中的证书文件只能包含一个证书

              3. 证书文件必须以换行符结尾。 update-ca-certificates 如果每一行都包含,例如,回车 + 换行符(在 Windows 中是标准的),则似乎可以工作,但是一旦将证书附加到 /etc/ssl/ca-certificates.crt,它仍然无法工作。当我们从外部来源加载证书时,这个特定的要求让我很苦恼。

              【讨论】:

                【解决方案20】:

                我的工作只是将 -k 添加到我的 curl 中。 无需复杂化。

                curl -LOk https://dl.k8s.io/release/v1.20.0/bin/linux/amd64/kubectl

                【讨论】:

                  【解决方案21】:

                  在 Windows 上 - 如果你想从 cmd 运行

                  > curl -X GET "https://some.place"
                  

                  从下载 cacert.pem https://curl.haxx.se/docs/caextract.html

                  永久设置环境变量:

                  CURL_CA_BUNDLE = C:\somefolder\cacert.pem
                  

                  并通过重新打开您想要的任何 cmd 窗口来重新加载环境 使用卷曲;如果安装了 Chocolatey,您可以使用:

                  refreshenv
                  

                  现在再试一次

                  问题原因: https://laracasts.com/discuss/channels/general-discussion/curl-error-60-ssl-certificate-problem-unable-to-get-local-issuer-certificate/replies/95548

                  【讨论】:

                    【解决方案22】:

                    有这个问题,但新版本没有解决。 /etc/certs 有根证书,浏览器说一切都很好。经过一些测试后,我从 ssllabs.com 收到了警告,即我的链不完整(实际上它是旧证书的链,而不是新证书的链)。更正证书链后一切正常,即使使用 curl。

                    【讨论】:

                      【解决方案23】:

                      这是 ssh 证书存储问题。您需要从目标CA网站下载有效的证书pem文件,然后构建软链接文件来指示ssl信任的证书。

                      openssl x509 -hash -noout -in DigiCert_Global_Root_G3.pem

                      你会得到dd8e9d41

                      使用散列号构建 solf 链接并使用 .0(点零)为文件添加后缀

                      dd8e9d41.0

                      然后再试一次。

                      【讨论】:

                        【解决方案24】:

                        由于 conda 环境,某些系统可能会出现此问题。如果您安装了 conda,则禁用它可能会解决您的问题。就我而言,当我停用 conda 时,此 curl-SSL 错误已解决。在 ubuntu 或 MacOS 上试试这个命令

                        conda deactivate
                        

                        【讨论】:

                          【解决方案25】:

                          在 Amazon Linux(CentOS / Red Hat 等)上,我执行了以下操作来解决此问题。先把http://curl.haxx.se/ca/cacert.pem下载的cacert.pem复制下来,放到/etc/pki/ca-trust/source/anchors/目录下。然后运行update-ca-trust 命令。

                          这是取自https://serverfault.com/questions/394815/how-to-update-curl-ca-bundle-on-redhat的单行代码

                          curl https://curl.se/ca/cacert.pem -o /etc/pki/ca-trust/source/anchors/curl-cacert-updated.pem &amp;&amp; update-ca-trust

                          但是自从 curl 被破坏后,我实际上使用这个命令来下载 cacert.pem 文件。

                          wget --no-check-certificate http://curl.haxx.se/ca/cacert.pem

                          此外,如果您在使用 php 时遇到问题,您可能需要重新启动 Web 服务器 service httpd restart 用于 apache 或 service nginx restart 用于 nginx。

                          【讨论】:

                            【解决方案26】:

                            几天来,我一直在努力解决这个问题,试图通过 ElasticPress 和由 AWS ACM PCA 管理的自签名根 CA 与内部 ElasticSearch 服务进行通信。

                            在我的特殊情况下,我收到了来自默认 cURL 传输以及预期正文的 200 OK 响应,但 Wordpress 回来时返回了一个 WP_Error 对象,并且 ElasticPress 由于此证书问题正在接收但从不记录。

                            说到 Wordpress,有两点值得注意:

                            1. 所有wp_remote_* 调用的默认cURL 传输将查找位于wp-includes/certificates/ca-bundle.crt 中的CA 捆绑包。此捆绑包的用途与 https://curl.haxx.se/docs/caextract.html 下的内容大致相同,并且将涵盖通常不涉及更多奇特设置的大多数用例。
                            2. Wordpress 中的操作/过滤器顺序很重要,在 ElasticPress 的情况下,它自己的许多内部函数都利用了这些远程调用。问题是,这些远程调用是在plugins_loaded 生命周期中执行的,这对于主题逻辑来说还为时过早,无法覆盖。如果您正在使用任何对其他服务进行外部调用的插件,并且您需要能够修改请求,则应注意这些插件何时执行这些请求。

                            这意味着即使在您的主题中定义了正确的服务器设置、挂钩、回调和逻辑,您仍然可能以失败的设置而告终,因为底层插件调用在您的主题加载之前执行得很好并且永远不会能够告诉 Wordpress 新证书。

                            在 Wordpress 应用程序的上下文中,我知道只有两种方法可以在不更新核心或第三方代码逻辑的情况下规避此问题:

                            1. 推荐)将“必须使用”插件添加到您的安装中,以调整您需要的设置。 MU 插件在 Wordpress 生命周期中最早加载,并且能够使您能够覆盖您的插件和您的核心,而无需直接更改它们。就我而言,我使用以下逻辑设置了一个简单的 MU 插件:
                            // ep_pre_request_args is an ElasticPress-specific call that we need to adjust for all outbound HTTP requests
                            add_filter('ep_pre_request_args', function($args){
                                if($_ENV['ELASTICSEARCH_SSL_PATH'] ?? false) {
                                    $args['sslcertificates'] = $_ENV['ELASTICSEARCH_SSL_PATH'];
                                }
                                return $args;
                            });
                            
                            1. 不推荐)如果您绝对没有其他选择,您也可以将您的根 CA 附加到 wp-includes/certificates/ca-bundle.crt。这似乎会“纠正”潜在问题,并且您将获得对 SSL 证书的正确验证,但每次更新 Wordpress 时此方法都会失败,除非您采用额外的自动化。

                            我添加这个答案是因为在我什至费心深入研究插件源代码之前,我一直认为我在设置中做错了什么或有问题。如果他们做类似的事情,希望这可以节省一些时间。

                            【讨论】:

                              【解决方案27】:

                              到目前为止,我已经看到公司网络中出现此问题,原因有两个,您的情况可能是其中一个或两个原因:

                              1. 由于网络代理的工作方式,它们有自己的 SSL 证书,从而改变 curl 看到的证书。许多或大多数企业网络强制您使用这些代理。
                              2. 在客户端 PC 上运行的一些防病毒程序的作用也类似于 HTTPS 代理,因此它们可以扫描您的网络流量。您的防病毒程序可能会选择禁用此功能(假设您的管理员允许)。

                              附带说明一下,上面的第 2 点可能会让您对被扫描的所谓安全 TLS 流量感到不安。这就是适合你的企业世界。

                              【讨论】:

                                【解决方案28】:

                                我在使用所有 CA 的 Digicert 时都遇到了这个问题。我创建了一个 digicertca.pem 文件,它只是将中间文件和根文件粘贴到一个文件中。

                                curl https://cacerts.digicert.com/DigiCertGlobalRootCA.crt.pem
                                curl https://cacerts.digicert.com/DigiCertSHA2SecureServerCA.crt.pem
                                
                                curl -v https://mydigisite.com/sign_on --cacert DigiCertCA.pem
                                ...
                                *  subjectAltName: host "mydigisite.com" matched cert's "mydigisite.com"
                                *  issuer: C=US; O=DigiCert Inc; CN=DigiCert SHA2 Secure Server CA
                                *  SSL certificate verify ok.
                                > GET /users/sign_in HTTP/1.1
                                > Host: mydigisite.com
                                > User-Agent: curl/7.65.1
                                > Accept: */*
                                ...
                                

                                Eorekan 有答案,但只有我自己和另一个人对他的答案投了赞成票。

                                【讨论】:

                                  【解决方案29】:

                                  特别是 Windows 用户,使用curl-7.57.0-win64-mingw 或类似版本。

                                  这有点晚了,现有的答案是正确的。但是我仍然需要努力让它在我的 Windows 机器上运行,尽管这个过程实际上非常简单。所以,分享一步一步的过程。

                                  这个错误基本上意味着 curl 无法验证目标 URI 的证书。如果您信任证书 (CA) 的颁发者,则可以将其添加到受信任的证书列表中。

                                  为此,请浏览 URI(例如在 Chrome 上)并按照步骤操作

                                  1. 右键单击安全挂锁图标
                                  2. 点击证书,将打开一个包含证书详细信息的窗口
                                  3. 转到“认证路径”标签
                                  4. 点击ROOT证书
                                  5. 点击查看证书,会打开另一个证书窗口
                                  6. 转到详细信息标签
                                  7. 点击复制到文件,会打开导出向导
                                  8. 点击下一步
                                  9. 选择“Base-64 编码 X.509 (.CER)”
                                  10. 点击下一步
                                  11. 给出一个友好的名称,例如'MyDomainX.cer'(浏览到​​所需目录)
                                  12. 点击下一步
                                  13. 点击完成,将保存证书文件
                                  14. 现在打开这个 .cer 文件并复制内容(包括 -----BEGIN CERTIFICATE----- 和 -----END CERTIFICATE-----)
                                  15. 现在转到保存curl.exe 的目录,例如C:\SomeFolder\curl-7.57.0-win64-mingw\bin
                                  16. 使用文本编辑器打开 curl-ca-bundle.crt 文件
                                  17. 将复制的证书文本附加到文件末尾。保存

                                  现在你的命令应该可以在 curl 中正常执行了。

                                  【讨论】:

                                  • 欢迎对拒绝投票的原因发表评论
                                  • 我在“C:\xampp\apache\bin”(Windows)中找不到任何名为“curl-ca-bundle.crt”的文件。猜猜反对票是由于这个。我在上面提到的“bin”文件夹中有我的“curl.exe”
                                  【解决方案30】:

                                  简单的解决方案: 在~/.sdkman/etc/config,更改sdkman_insecure_ssl=true

                                  步骤:
                                  纳米~/.sdkman/etc/config
                                  sdkman_insecure_ssl=false 更改为 sdkman_insecure_ssl=true
                                  保存退出

                                  【讨论】:

                                    猜你喜欢
                                    • 2021-03-21
                                    • 2016-10-30
                                    • 2021-05-22
                                    • 2017-07-19
                                    相关资源
                                    最近更新 更多