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.
1017347 次浏览

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

有两个选项可以让它工作:

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

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

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

在窗户上我遇到了这个问题。Curl是由mysysgit安装的,所以下载并安装最新版本可以解决我的问题。

否则,这些像样的指令关于如何更新您的CA证书,您可以尝试。

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

git config --global http.sslVerify false

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

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

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

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

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

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

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

  2. 将“——cacert /path/”添加到“/cacert”。在curl命令中输入“pem”选项,告诉curl本地证书颁发机构文件在哪里。

  3. (或)创建或添加到一个'。Curlrc的文件行: cacert = /path/to/cacert.pem 参见'man curl',关于'-K,——config <file>'部分的信息,curl在哪里查找该文件

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

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

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

  1. 默认情况下,FastCGI进程将每300秒解析一次新文件(如果需要,你可以通过添加一些文件来改变频率,如这里所建议的https://ss88.uk/blog/fast-cgi-and-user-ini-files-the-new-htaccess/)。
< p >简单的解决方案: 在~/.sdkman/etc/config中,修改sdkman_insecure_ssl=true

< br > < p >步骤: 纳米~/.sdkman/etc/config < br > 更改sdkman_insecure_ssl=falsesdkman_insecure_ssl=true

.保存并退出

以我为例,在我试图用cURL使用的服务上安装我的证书时出现了问题。我未能将中间证书和根证书捆绑/连接到我的域证书。一开始并没有明显的问题,因为Chrome解决了这个问题并接受了证书,尽管省略了中间证书和根证书。

在捆绑证书之后,一切都按预期工作。我捆扎成这样

$ cat intermediate.crt >> domain.crt

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

我们最近遇到了这个错误。事实证明,这与根证书没有正确安装在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散列-noout——rootcert.pem ' 0

哪个会创建软链接

60ff2731.0 -> rootcert.pem

卷曲,在被子下读取服务器。pem,确定根证书文件的名称(rootcert.pem),将其转换为其哈希名称,然后进行操作系统文件查找,但无法找到它。

因此,结论是,当curl错误很模糊时,在运行curl时使用strace(这是一个巨大的帮助),然后确保使用openssl命名约定正确安装根证书。

是的,您还需要添加一个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)

这很可能是服务器上丢失的证书。

根- >中间- >服务器

服务器应该发送server &中间体是最低的。

使用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检查certs

假设你连接到一个家庭版(https://www.cerberusftp.com/support/help/installing-a-certificate/) ftp服务器,我将说它是自签名的。

请发布更多细节,比如来自openssl的输出。

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

> curl -X GET "https://some.place"
< p > cacert下载。pem从 https://curl.haxx.se/docs/caextract.html < / p >

永久设置环境变量:

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 < / p >

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

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

作为旁注,上面的第2条可能会让您对被扫描的本应安全的TLS通信感到不安。这就是你的公司世界。

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

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

我偶然发现了原因,感谢这个答案


当我从WAN访问我的网站时,一切都很好。

然而,当站点从局域网内访问时(例如,当Wordpress向自己的服务器发出curl请求时,尽管使用WAN IP 49.x.x.x),它被提供pfSense登录页面。

我将证书标识为pfSense webConfigurator Self-Signed Certificate。难怪curl抛出一个错误。

所发生的事情是curl正在使用站点的WAN IP地址49.x.x.x。但是,在web服务器的上下文中,广域网IP是防火墙。

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

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

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

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

sudo apt-get install ca-certificates

具体地说用于Windows用户,使用curl-7.57.0-win64-mingw或类似版本。

这有点晚了,现有的答案是正确的。但我还是得费点劲才能让它在我的Windows电脑上运行,不过这个过程其实相当简单。所以,分享一步一步的过程。

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

为此,浏览URI(例如在Chrome上)并遵循步骤

  1. 右击安全挂锁图标
  2. 点击certificate,它会打开一个带有证书详细信息的窗口
  3. 进入“认证路径”选项卡
  4. 单击ROOT证书
  5. 单击查看证书,它将打开另一个证书窗口
  6. 进入详细信息选项卡
  7. 点击复制到文件,它将打开导出向导
  8. 单击Next
  9. 选择“Base-64 encoded X.509 (.CER)”
  10. 单击Next
  11. 起一个友好的名字。“MyDomainX。Cer '(浏览到所需目录)
  12. 单击Next
  13. 单击Finish,它将保存证书文件
  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中正常执行。

这可以帮助你控制暴饮暴食:

$client = new Client(env('API_HOST'));
$client->setSslVerification(false);

测试在guzzle/guzzle 3.*

根据旋度文档,你也可以将证书传递给curl命令:

获取一个可以验证远程服务器的CA证书,并使用 适当的选项指出此CA证书进行验证时 连接。对于libcurl黑客:curl_easy_setopt(curl, CURLOPT_CAPATH capath); < /代码> < / p >

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


例如:

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

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

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

sudo update-ca-certificates -f

update-ca-certificates是一个更新/etc/ssl/certs目录以保存SSL证书并生成ca-certificates的程序。Crt,一个连接的证书单文件列表。

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

我也遇到过这个问题。我读了这篇文章,大部分答案都很有信息量,但对我来说太复杂了。我在社交话题上没有经验,所以这个答案适合像我这样的人。

在我的例子中,发生这个错误是因为我没有在应用程序中使用的证书旁边包含中间证书和根证书。

以下是我从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-----

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

这是ssh证书存储问题。请先从目标CA网站下载有效的证书pem文件,再构建软链接文件指示ssl信任证书。

openssl x509 -hash -noout -in DigiCert_Global_Root_G3.pem

你会得到dd8e9d41

使用散列号构建solf链接,并以.0(点- 0)作为文件后缀

dd8e9d41.0

然后再试一次。

  1. < p > 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服务器。

在所有的ca中,我对Digicert有这个问题。我创建了一个数字文件。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有答案,但只有我和另一个人对他的答案进行了投票。

你必须将服务器证书从cert.pem更改为fullchain.pem
我有同样的问题与Perl HTTPS守护进程:
我已经改变了:
SSL_cert_file => '/etc/letsencrypt/live/mydomain/cert.pem' < br > : < br > SSL_cert_file => '/etc/letsencrypt/live/mydomain/fullchain.pem' < br > < / p >

我想评论Yuvik的回答,但我缺乏足够的声誉点。

当你导入一个.crt文件到/usr/share/local/ca-certificates时,它需要是正确的格式。其中一些已经在前面提到过,但是还没有人提到只需要一个新的行字符,也没有人收集过清单,所以我想在这里提供一个清单。

  1. 证书需要以.crt结尾。从Ubuntu的手册页:

    证书必须有一个.crt扩展名 update-ca-certificates < / p >

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

  3. 证书文件必须以换行符结束。例如,如果每行包含回车+换行符(这是Windows中的标准),update-ca-certificates似乎可以工作,但一旦证书被追加到/etc/ssl/ca-certificates.crt,它仍然不能工作。当我们从外部源加载证书时,这个特定的要求让我感到困惑。

输入这两个代码禁用SSL证书颁发。这对我很有效 经过大量的研究,我发现了这个

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

ssl certificate

由于conda环境,一些系统可能存在此问题。如果你安装了conda,那么禁用它可以解决你的问题。在我的情况下,当我停用conda时,这个curl-SSL错误得到了解决。在ubuntu或MacOS上试试这个命令

conda deactivate

我的工作方式是在旋度上加-k。 没有必要把事情复杂化。

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

在亚马逊Linux (CentOS / Red Hat等)上,我做了以下工作来解决这个问题。首先复制cacert。从http://curl.haxx.se/ca/cacert.pem下载了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时遇到问题,你可能需要重新启动你的web服务器service httpd restart(用于apache)或service nginx restart(用于nginx)。

我已经在Wordpress安装上花了几天时间试图通过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 Bundle。这个包在很大程度上与https://curl.haxx.se/docs/caextract.html下的包具有相同的目的,并且将覆盖大多数通常不涉及更多奇异设置的用例。
  2. Action/Filter的顺序在Wordpress和ElasticPress中很重要,它自己的许多内部函数都利用了这些远程调用。问题是,这些远程调用是在plugins_loaded生命周期期间执行的,这对于Theme逻辑来说还太早,无法覆盖。如果您正在使用任何外部调用其他服务的插件,并且您需要能够修改请求,那么您应该仔细注意这些插件何时执行这些请求。

这意味着,即使在主题中定义了正确的服务器设置、钩子、回调和逻辑,你仍然可能以一个坏的设置结束,因为底层插件调用在主题加载之前执行得很好,并且永远无法告诉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都会失败,除非你加入额外的自动化。

我添加这个答案是因为在我甚至懒得深入研究插件源代码之前,我已经认为我在我的设置中做了一些错误或不稳定的事情。希望这可以为正在做类似事情的人节省一些时间。

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