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


258
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.


我有类似的问题。这对我
有用


//,就我而言,从向HashiCorp Vault服务器发出卷曲请求直到我安装了X509证书(仅以相反的顺序将end-entity / Intermediates / root用作终端实体/中间体/根)时,都遇到了此错误,每个证书都由Base64编码。
弥敦道(Nathan Basanese)

//,在将错误复制到此处之前,您对此进行了哪些研究?
弥敦道(Nathan Basanese)

Answers:


231

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

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

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

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

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

  3. 默认情况下,FastCGI进程将每300秒解析一次新文件(如果需要,您可以按照此处的建议通过添加几个文件来更改频率,网址https://ss88.uk/blog/fast-cgi-and-user-ini- files-the-new-htaccess /)。


1
第一个与使用OpenSSL库执行的操作的认证有关。使用cURL进行的请求的第二个请求
Mike

4
实际上,我奋斗了一个小时,因为我没有在引号内写路径。所以,请大家注意到这里curl.cainfo="/path/to/downloaded/cacert.pem" // Do not forget to write between quotes
人士Himanshu Upadhyay

12
我在该问题中没有看到对PHP的任何引用。为什么要在答案中引用?如果问题已被编辑,那么答案是否可以被编辑以反映当前正在使用的命令行?
亚当

5
@Adam虽然问题没有提到PHP,但这是由PHP生成的特定错误消息在Google中排名第一的搜索结果。因此,也许它并没有具体回答OP的问题,但似乎对社区仍然有用。
rinogo '19

1
这个答案对我来说是一种误导,因为它是与PHP相关的解决方案
Wasif Khan

141

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

有两种方法可以使它起作用:

  1. 将cURL与-k允许curl建立不安全连接的选项一起使用,即cURL不验证证书。

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

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


1
我在以下位置添加了rootCA.pem文件:-root @ sclrdev:/ home / certs / FreshCerts#ll /etc/ssl/certs/rootCA.pem -rwxrwxrwx 1根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:还可以ca-certificates.crt中rootCA.pem的内容。root @ sclrdev:/ home / sclr / subhendu / certs / FreshCerts#ll /etc/ssl/certs/ca-certificates.crt -rw-r--r-- 1根root 247945 7月8日00:10 / etc / ssl /certs/ca-certificates.crt
user3812540 2014年

我无法弄清楚我要去哪里。在WireShark跟踪中,出现以下错误:-客户端Hello服务器Hello,证书,服务器Hello完成警报(级别:致命,描述:未知的CA(48))请您指导我,并为此提供帮助吗?
user3812540 2014年

openssl的工作方式是尝试在验证过程中完成证书链。服务器证书是由中间CA而非根CA签名的吗?例如
Yuvika 2014年

我的证书仅由根CA签名。
user3812540 2014年

1
我遇到一些错误:-root @ sclrdev:〜#openssl s_client -connect <server_ip>:21 -showcerts CONNECTED(00000003)3074050248:error:140770FC:SSL例程:SSL23_GET_SERVER_HELLO:未知协议:s23_clnt.c:766:-没有可用的对等证书---没有发送客户端证书CA名称--- SSL握手已读取7个字节并写入225个字节---新增,(无),密码为(无)不支持安全重新协商压缩:无扩展:无---我不确定这到底意味着什么?
user3812540 2014年

69

我通过在cURL脚本中添加一行代码来解决此问题:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

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


42
这可能有助于解决该问题。但是它完全错过了https和认证系统的想法。
史蒂芬·里希特

1
作品!如果您不在乎证书,那就可以快速进行n次绕行
Gilly 2015年

2
这使其完全不安全。
Moox'2

1
我在本地服务器上遇到了这个问题,尽管相同的代码在登台服务器上也能正常工作。对我来说很好,因为它在本地。谢谢
萨宾

1
添加此检查以确保您仅将其与本地服务器一起使用 if( stristr("127.0.0.1",$_SERVER["SERVER_NAME"] ) || stristr("localhost",$_SERVER["SERVER_NAME"] )) curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
Hussain

20

就我而言,事实证明我在尝试使用cURL使用的服务上安装证书时遇到了问题。我未能将中间证书和根证书捆绑/连接到我的域证书中。最初并不清楚这是问题所在,因为Chrome尽管不考虑中间证书和根证书,却解决了问题并接受了证书。

捆绑证书后,一切按预期进行。我像这样捆绑

$ cat intermediate.crt >> domain.crt

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


2
除了没有将我的Apache SSLCertificateChainFile设置为正确的证书之外,我遇到了类似的问题。
韦恩·皮卡斯基

1
请注意,如果执行此操作,并且要添加的crt没有尾随换行符,则-----END CERTIFICATE----------BEGIN CERTIFICATE-----捆绑中将包含类似的行,并且会出现晦涩的错误:curl: (77) error setting certificate verify locations
Marty Neal

2
我正在使用letencrypt证书,但仅将证书和私钥部署到服务器。我的计算机上的Chrome和curl没有抱怨,但是我正在构建的nodejs应用程序不接受证书。将全链部署到服务器可解决此问题!感谢您指出正确的方向!
Paulo Santos '18年

就我而言(来自comodo的证书),他们将中间证书作为my-domain.ca-bundle发送。我必须将其附加到my-domain.crt。谢谢!
乔恩·赫尔卡


16

安装Git Extensions v3.48后出现此问题。试图再次安装mysysgit,但存在同样的问题。最后,必须使用以下命令禁用(请考虑安全性!)Git SSL验证:

git config --global http.sslVerify false

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

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

23
有效,但感觉就像隐藏症状,无法治愈疾病。
单线程

4
禁用SSL验证非常危险
jonasl 2015年

1
您可以不对--global存在问题的存储库仅禁用SSL。有关当前必要的crt文件的讨论,请参见groups.google.com/forum/#!topic/git-for-windows/mlqn5J4OLlw
koppor

13

我们最近遇到了这个错误。事实证明,这与根证书未正确安装在CA存储目录中有关。我在直接指定CA目录的地方使用curl命令。 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 cert,确定了根证书文件的名称(rootcert.pem),将其转换为哈希名称,然后进行了OS文件查找,但找不到它。

因此,最重要的是,在卷曲错误模糊不清(有很大帮助)时,在运行curl时使用strace,然后确保使用openssl命名约定正确安装根证书。


2
ew,确实有帮助。为了详细说明什么对我有帮助:a)运行strace curl ... b)查找某事-十六进制的stat()失败c)google搜索某事​​-十六进制,找到相应的证书d)将找到的证书放入/ usr /本地/共享/ ca-certificates /(扩展名为* .crt,因为* .pem不起作用)e)运行update-ca-certificates。然后宾果!-在/ usr / lib / ssl / certs /中自动创建了必要的符号链接
No-Bugs Hare,2016年

11

服务器很可能缺少证书。

根目录->中级->服务器

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

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

如果仅返回一个证书(自签名或已颁发),则您必须选择以下任一项:

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

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

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

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

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

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

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

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


6

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

5

仅更新证书列表就足够了

sudo update-ca-certificates -f

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


做到了,运行它后一切都完成了。但是卷曲不起作用。还是一样的错误。
AGamePlayer

1
我做了命令,但没有帮助,我简直不敢相信我必须做以上所有事情。然后您的答案...感谢“ -f”标志。
Alex Shtromberg

1
这也是我想到的解决方案。+1
SS安妮


2

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

否则,这些是有关如何尝试更新CA证书的不错的说明


2

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

2

我也遇到了这个问题。我已经阅读了该主题,并且大多数答案都提供了很多信息,但对我来说却过于复杂。我没有网络主题方面的经验,因此此答案适用于像我这样的人。

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

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

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

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

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

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

要解决此错误,请检查您的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-----

请注意,证书之间,文件末尾或开始处都没有空格。一旦将此组合证书提供给您的应用程序,就应该解决您的问题。



1

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

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

由于这个答案,我无意中找到了原因。


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

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

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

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

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

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

通过应用该解决方案,curl的请求已由Web服务器正确处理,并且未转发到通过发送登录页面进行响应的防火墙。


0

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

openssl x509 -hash -noout -in DigiCert_Global_Root_G3.pem

你会得到 dd8e9d41

用哈希号构建solf链接,并在文件后缀.0(点零)

dd8e9d41.0

然后再试一次。


0
  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服务器。

0

您必须将服务器证书从更改cert.pem为。fullchain.pem
我在Perl HTTPS守护程序中遇到了相同的问题:
我已将更改
SSL_cert_file => '/etc/letsencrypt/live/mydomain/cert.pem'
为:
SSL_cert_file => '/etc/letsencrypt/live/mydomain/fullchain.pem'


-1

到目前为止,由于两个原因,我已经看到此问题在公司网络内发生,在您的情况下,可能会发生一个或两个原因:

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

附带说明一下,上述第2条可能会让您感到不安,因为您扫描的是所谓的安全TLS流量。那就是您的企业世界。


-1

遇到了这个问题,而新版本并没有解决。/ etc / certs具有根证书,浏览器表示一切正常。经过一番测试后,我从ssllabs.com得到警告,说我的链条不完整(实际上是旧证书的链条,而不是新证书的链条)。校正证书链后,即使出现卷曲也一切都很好。


-1

我对所有CA的Digicert都有此问题。我创建了一个digicertca.pem文件,该文件既是中间文件,也是将root粘贴到一个文件中的。

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


-2

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

这有点晚了,现有的答案是正确的。但是我仍然需要努力才能使其在Windows机器上运行,尽管该过程实际上非常简单。因此,共享分步过程。

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

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

  1. 右键单击安全挂锁图标
  2. 单击证书,它将打开一个窗口,其中包含证书详细信息
  3. 转到“认证路径”标签
  4. 单击根证书
  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中正常执行了。


3
对downvote原因的几点意见,将不胜感激
ArghyaÇ

我在“ C:\ xampp \ apache \ bin”(Windows)中找不到任何名为“ curl-ca-bundle.crt”的文件。猜猜这是否决票。我在上面提到的“ bin”文件夹中有“ curl.exe”
kathikeyan

-4

这可以帮助您解决问题:

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

在食口/食口3。


-5

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.