ChatGPT解决这个技术问题 Extra ChatGPT

curl:(60)SSL证书问题:无法获取本地颁发者证书

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.
我有类似的问题。这对我有用stackoverflow.com/a/29649024
就我而言,superuser.com/a/719047/137881 有所帮助。
// ,在我的例子中,我从向 HashiCorp Vault 服务器发出 curl 请求时遇到了这个错误,直到我安装了一个 X509 证书,其中的最终实体/中间体/根仅以相反的顺序排列,每个证书都是 Base64 编码的。
我希望有一天主流工具,在任何地方每小时都使用数千次,可以在错误的情况下拥有清晰简洁的调试信息。在某些时候,这是一个笑话,说真的,这并不难。

B
Boern

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

从 https://curl.se/ca/cacert.pem 下载最新的 cacert.pem 将“--cacert /path/to/cacert.pem”选项添加到 curl 命令以告诉 curl 本地证书颁发机构文件在哪里. (或)在“.curlrc”文件中创建或添加以下行: cacert = /path/to/cacert.pem 有关信息,请参阅“man curl”,有关“-K,--config ”部分的部分关于 curl 查找此文件的位置。 (或者如果使用 php)将以下行添加到 php.ini:(如果这是共享主机并且您无权访问 php.ini,那么您可以将其添加到 public_html 中的 .user.ini)。

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

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

(也许也适用于 php)默认情况下,FastCGI 进程将每 300 秒解析一次新文件(如果需要,您可以按照此处的建议通过添加几个文件来更改频率 https://ss88.uk/blog/fast-cgi-和-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 生成的特定错误消息的 #1 搜索结果出现。所以,也许它没有专门回答 OP 的问题,但它似乎对社区仍然有用。
这个答案对我有误导,因为它是与 PHP 相关的解决方案
N
Nick

它失败了,因为 cURL 无法验证服务器提供的证书。

有两种选择可以让它工作:

使用带有 -k 选项的 cURL,它允许 curl 进行不安全的连接,即 cURL 不验证证书。将根 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 个字节 --- 新,(无),密码为(无) 不支持安全重新协商 压缩:无 扩展: NONE --- 我不确定这到底是什么意思?
j
jotik

我通过在 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); 一起使用
M
Maxim Krušina

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

sudo apt-get install ca-certificates

例如,一些小型 docker 容器可能没有安装它,当整个包不存在时,没有必要对其他任何东西进行故障排除。
D
Daniel Watrous

就我而言,在我尝试使用 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。谢谢!
它对我有用。谢谢我从 digitcert 获得域证书、中间证书、根证书。但在 nginx conf 中只引用了域证书
R
Ricardo stands with Ukraine

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

git config --global http.sslVerify false

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

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

有效,但感觉就像隐藏症状,而不是治愈疾病。
禁用 SSL 验证非常危险
您可以在没有 --global 的情况下仅对存在问题的存储库禁用 SSL。有关当前必要的 crt 文件的讨论,请参见 groups.google.com/forum/#!topic/git-for-windows/mlqn5J4OLlw
G
Gerrat

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

根->中间->服务器

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

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

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

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

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

在您的 CA 商店中为该链安装 CA(根)证书,例如谷歌发行者。 (仅当您信任该 CA 时)固定服务器以将 CA 作为链的一部分发送信任链中的证书禁用信任

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

添加(信任)它禁用信任

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

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

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


我不确定我是否错了,但根据 openssl 的手册,-showcerts 标志应该只显示发送的远程证书。因此,如果您使用它进行测试,似乎即使您有整个本地链并且正确,openssl 也可能会输出错误(因为您只查看可能不完整的已发送证书链)。我将使用 curl -vvv www.google.ch:443 进行测试,以测试本地商店是否已经正确,并使用 openssl -showcerts 测试发送的链。到目前为止,我还没有找到任何其他解决方案来区分和检查本地和远程。
g
gp-coder

我们最近遇到了这个错误。原来它与未正确安装在 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/ 中自动创建
M
Michael P. Bazos

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

sudo update-ca-certificates -f

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


做到了,一切都在运行后完成。但是卷曲不起作用。仍然是同样的错误。
我做了命令,但没有帮助,我不敢相信我必须做上面的所有事情。然后你的回答......感谢'-f'标志。
E
Enes Kirimi

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

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

这是我从 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-----

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


这解决了我的问题。没有意识到证书之间有一个空行是不好的。
阅读此内容后,我使用 -certfile 选项而不是 -CAfile 为服务器重新生成了 .pfx 文件。它修复了使用 curl 调用服务器 api 时的问题。例如openssl pkcs12 -export -out a.pfx -inkey privateKey.pem -in uri.crt -certfile certs.ca-bundle
G
Giorgos Myrianthous

根据 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

A
Ankit Singh

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


C
Community

下载 https://curl.haxx.se/ca/cacert.pem 下载后,将此文件移动到您的 wamp 服务器。对于 exp: D:\wamp\bin\php\ 然后将以下行添加到底部的 php.ini 文件中。

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

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


我也使用 WAMP,你的方式帮助了我。谢谢!
我的荣幸#Dmitiry Korytnyi
为什么人们不帮助做出这个答案
A
Ajeet Shah

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

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

https://i.stack.imgur.com/enLcY.png


我应该在哪里输入这些行?在什么文件中?地点?
t
tim_fl90

我的工作只是将 -k 添加到我的 curl 中。没必要把事情复杂化。

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


这只是跳过了安全问题。不是真正的解决方案。
R
Ravi Prakash

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

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)

k
k-messaoudi

您必须将服务器证书从 cert.pem 更改为 fullchain.pem
Perl HTTPS Daemon 遇到了同样的问题:
我已更改:
SSL_cert_file => '/etc/letsencrypt/live/mydomain/cert.pem'
为:
{4 }


我在将现有证书移动到 CyberPanel 主机时遇到了这个问题,这就是我设法修复它的方法。
p
pbarney

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

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


A
Aloha

我的情况不同。我在防火墙后面托管一个站点。该错误是由 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 服务器正确处理,而不是转发到通过发送登录页面响应的防火墙。


T
Tomerikoo

我打算对 Yuvik's answer 发表评论,但我缺乏足够的声望点。

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

证书需要以 .crt 结尾。来自 Ubuntu 的手册页:证书必须具有 .crt 扩展名才能被 update-ca-certificates 包含 /usr/local/share/ca-certificates 中的证书文件只能包含一个证书 证书文件必须以换行符结尾。如果每一行都包含,例如,回车 + 换行符(在 Windows 中是标准的),update-ca-certificates 似乎可以工作,但是一旦证书附加到 /etc/ssl/ca-certificates.crt,它仍然无法正常工作。当我们从外部来源加载证书时,这个特定的要求让我很苦恼。


T
ThePirate42

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

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

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

永久设置环境变量:

CURL_CA_BUNDLE = C:\somefolder\cacert.pem

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

refreshenv

现在再试一次

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


F
Frank

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


r
roger

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

openssl x509 -hash -noout -in DigiCert_Global_Root_G3.pem

你会得到dd8e9d41

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

dd8e9d41.0

然后再试一次。


A
Adarsh

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

conda deactivate

c
cby016

在 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 && update-ca-trust

然而,由于 curl 被破坏了,我实际上使用这个命令来下载 cacert.pem 文件。

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

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


m
maiorano84

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

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

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

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

这意味着即使在您的主题中定义了正确的服务器设置、钩子、回调和逻辑,您仍然可能以一个损坏的设置结束,因为底层插件调用在您的主题加载之前执行得很好,并且永远无法分辨关于新证书的 Wordpress。

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

(推荐)将“必须使用”插件添加到您的安装中,以调整您需要的设置。 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;
});

(不推荐)如果您绝对没有其他选择,您也可以将您的根 CA 附加到 wp-includes/certificates/ca-bundle.crt。这似乎会“纠正”潜在问题,并且您将获得对 SSL 证书的正确验证,但是每次更新 Wordpress 时此方法都会失败,除非您进行额外的自动化操作。

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


A
Abdullah Tahan

没有提到的答案可能是连接到内部 vpn 的角色,我之前遇到过这个问题,并要求在专用网络上


r
rdguam

到目前为止,我已经看到这个问题在公司网络中发生,原因有两个,其中一个或两个可能在您的情况下发生:

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

作为旁注,上面的第 2 点可能会让您对被扫描的所谓安全 TLS 流量感到不安。这就是你的企业世界。


K
Kirt Carson

我对所有 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 有答案,但只有我自己和另一个人对他的答案投了赞成票。


A
Arghya C

专门Windows 用户,使用 curl-7.57.0-win64-mingw 或类似版本。

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

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

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

右键单击安全挂锁图标 单击证书,它将打开一个包含证书详细信息的窗口 转到“证书路径”选项卡 单击根证书 单击查看证书,它将打开另一个证书窗口 转到详细信息选项卡 单击复制到文件,它将打开导出向导 单击下一步 选择“Base-64 编码 X.509 (.CER)” 单击下一步 提供友好名称,例如“MyDomainX.cer”(浏览到所需目录)单击下一步 单击完成,它将保存证书文件现在打开这个.cer文件并复制内容(包括-----BEGIN CERTIFICATE-----和-----END CERTIFICATE-----)现在进入curl所在的目录.exe 被保存,例如 C:\SomeFolder\curl-7.57.0-win64-mingw\bin 使用文本编辑器打开 curl-ca-bundle.crt 文件 将复制的证书文本附加到文件末尾。节省

现在你的命令应该在 curl 中执行得很好。


我们将不胜感激对拒绝投票的原因发表一些评论
我在“C:\xampp\apache\bin”(windows)中找不到任何名为“curl-ca-bundle.crt”的文件。猜猜反对票是由于这个。我在上面提到的“bin”文件夹中有我的“curl.exe”