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.
与“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.cainfo="/path/to/downloaded/cacert.pem"
确保将路径用双引号括起来!!!
(也许也适用于 php)默认情况下,FastCGI 进程将每 300 秒解析一次新文件(如果需要,您可以按照此处的建议通过添加几个文件来更改频率 https://ss88.uk/blog/fast-cgi-和-user-ini-files-the-new-htaccess/)。
它失败了,因为 cURL 无法验证服务器提供的证书。
有两种选择可以让它工作:
使用带有 -k 选项的 cURL,它允许 curl 进行不安全的连接,即 cURL 不验证证书。将根 CA(签署服务器证书的 CA)添加到 /etc/ssl/certs/ca-certificates.crt
您应该使用选项 2,因为它是确保您连接到安全 FTP 服务器的选项。
我通过在 cURL 脚本中添加一行代码解决了这个问题:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
警告:这使得请求绝对不安全(参见@YSU 的回答)!
if( stristr("127.0.0.1",$_SERVER["SERVER_NAME"] ) || stristr("localhost",$_SERVER["SERVER_NAME"] )) curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
一起使用
对我来说,简单的证书安装有帮助:
sudo apt-get install ca-certificates
就我而言,在我尝试使用 cURL 使用的服务上安装证书是一个问题。我未能将中间证书和根证书捆绑/连接到我的域证书中。起初这并不是很明显的问题,因为尽管忽略了中间证书和根证书,Chrome 还是解决了这个问题并接受了证书。
捆绑证书后,一切都按预期工作。我这样捆绑
$ cat intermediate.crt >> domain.crt
并对所有中间证书和根证书重复。
-----END CERTIFICATE----------BEGIN CERTIFICATE-----
的行,并且您将收到模糊错误:curl: (77) error setting certificate verify locations
安装 Git Extensions v3.48 后出现此问题。尝试再次安装 mysysgit 但同样的问题。最后,必须禁用(请考虑安全隐患!)Git SSL 验证:
git config --global http.sslVerify false
但如果您有域证书,最好将其添加到(Win7)
C:\Program Files (x86)\Git\bin\curl-ca-bundle.crt
--global
的情况下仅对存在问题的存储库禁用 SSL。有关当前必要的 crt 文件的讨论,请参见 groups.google.com/forum/#!topic/git-for-windows/mlqn5J4OLlw。
很可能是服务器缺少证书。
根->中间->服务器
服务器应至少发送服务器和中间件。
使用 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 的输出。
我们最近遇到了这个错误。原来它与未正确安装在 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 命名约定正确安装根证书。
仅更新证书列表可能就足够了
sudo update-ca-certificates -f
update-ca-certificates 是一个程序,它更新目录 /etc/ssl/certs 以保存 SSL 证书并生成 ca-certificates.crt,这是一个串联的单文件证书列表。
我也遇到过这个问题。我已经阅读了这个帖子,大多数答案都提供了丰富的信息,但对我来说过于复杂。我在网络主题方面没有经验,所以这个答案适合像我这样的人。
就我而言,发生此错误是因为我没有在我的应用程序中使用的证书旁边包含中间证书和根证书。
这是我从 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
根据 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
尝试在 Ubuntu 中重新安装 curl,并使用更新证书的 sudo update-ca-certificates --fresh
更新我的 CA 证书
下载 https://curl.haxx.se/ca/cacert.pem 下载后,将此文件移动到您的 wamp 服务器。对于 exp: D:\wamp\bin\php\ 然后将以下行添加到底部的 php.ini 文件中。
curl.cainfo="D:\wamp\bin\php\cacert.pem"
现在重新启动您的 wamp 服务器。
输入这两个代码以禁用 SSL 证书问题。经过大量研究后我发现它对我有用。
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
https://i.stack.imgur.com/enLcY.png
我的工作只是将 -k 添加到我的 curl 中。没必要把事情复杂化。
curl -LOk https://dl.k8s.io/release/v1.20.0/bin/linux/amd64/kubectl
是的,您还需要添加 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)
您必须将服务器证书从 cert.pem
更改为 fullchain.pem
Perl HTTPS Daemon 遇到了同样的问题:
我已更改:
SSL_cert_file => '/etc/letsencrypt/live/mydomain/cert.pem'
为:
{4 }
在 Windows 上,我遇到了这个问题。 Curl 是由 mysysgit 安装的,因此下载并安装最新版本解决了我的问题。
否则,这些是关于如何更新您可以尝试的 CA 证书的不错的instructions。
我的情况不同。我在防火墙后面托管一个站点。该错误是由 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 服务器正确处理,而不是转发到通过发送登录页面响应的防火墙。
我打算对 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,它仍然无法正常工作。当我们从外部来源加载证书时,这个特定的要求让我很苦恼。
在 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
现在再试一次
有这个问题,更新版本没有解决。 /etc/certs 有根证书,浏览器说一切都很好。经过一些测试后,我从 ssllabs.com 收到了警告,即我的链不完整(实际上它是旧证书的链,而不是新证书的链)。更正证书链后一切都很好,即使使用 curl。
这是 ssh 证书存储问题。您需要从目标 CA 网站下载有效的证书 pem 文件,然后构建软链接文件以指示 ssl 受信任的证书。
openssl x509 -hash -noout -in DigiCert_Global_Root_G3.pem
你会得到dd8e9d41
使用散列号构建 solf 链接并使用 .0(点零)为文件添加后缀
dd8e9d41.0
然后再试一次。
由于 conda 环境,某些系统可能会出现此问题。如果您安装了 conda,则禁用它可能会解决您的问题。就我而言,当我停用 conda 时,此 curl-SSL 错误已解决。在 ubuntu 或 MacOS 上试试这个命令
conda deactivate
在 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
。
几天来,我一直在试图通过 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 时此方法都会失败,除非您进行额外的自动化操作。
我之所以添加这个答案,是因为在我什至费心深入研究插件源代码之前几天,我一直认为我在设置中做错了什么或不稳定。如果他们做类似的事情,希望这可以节省一些时间。
没有提到的答案可能是连接到内部 vpn 的角色,我之前遇到过这个问题,并要求在专用网络上
到目前为止,我已经看到这个问题在公司网络中发生,原因有两个,其中一个或两个可能在您的情况下发生:
由于网络代理的工作方式,它们有自己的 SSL 证书,从而改变 curl 看到的证书。许多或大多数企业网络强制您使用这些代理。一些在客户端 PC 上运行的防病毒程序的作用也类似于 HTTPS 代理,因此它们可以扫描您的网络流量。您的防病毒程序可能有一个禁用此功能的选项(假设您的管理员允许)。
作为旁注,上面的第 2 点可能会让您对被扫描的所谓安全 TLS 流量感到不安。这就是你的企业世界。
我对所有 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 有答案,但只有我自己和另一个人对他的答案投了赞成票。
专门为 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 中执行得很好。
不定期副业成功案例分享
curl.cainfo="/path/to/downloaded/cacert.pem" // Do not forget to write between quotes