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

时间:2014-07-07 13:23:05

标签: curl ssl openssl ssl-certificate x509certificate

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.

28 个答案:

答案 0 :(得分:173)

与SSL证书问题有关:无法获得本地颁发者证书&#39;错误。显然,这适用于发送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 :(得分:90)

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

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

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

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

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

答案 2 :(得分:60)

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

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

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

答案 3 :(得分:17)

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

git config --global http.sslVerify false

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

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

答案 4 :(得分:14)

在我的情况下,我在使用cURL尝试使用的服务上安装证书时遇到了问题。 我无法将中间证书和根证书捆绑/连接到我的域证书。一开始并不是很明显,这就是问题所在,因为尽管遗漏了中间证书和根证书,Chrome还是将其解决并接受了证书。

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

$ cat intermediate.crt >> domain.crt

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

答案 5 :(得分:10)

我们最近遇到了这个错误。事实证明它与根证书没有正确安装在CA商店目录中有关。我正在使用curl命令直接指定CA dir。 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 - &gt; rootcert.pem

卷曲,在封面下读取server.pem证书,确定根证书文件的名称(rootcert.pem),将其转换为其哈希名称,然后执行操作系统文件查找,但找不到它。

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

答案 6 :(得分:6)

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

根 - &GT;中程&GT;服务器

服务器应该发送服务器&amp;中级至少。

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

如果只返回一个证书(自签名或已签发),则必须选择:

  1. 修复服务器
  2. 信任该证书并将其添加到您的CA证书商店(不是最好的主意)
  3. 禁用信任,例如curl -k(非常糟糕的主意)
  4. 如果服务器返回多个,但不包括自签名(root)证书:

    1. 在您的CA商店中为此链安装CA(root)证书,例如谷歌发行人。 (,如果您信任该CA)
    2. 修复服务器以将CA作为链的一部分发送
    3. 信任链中的证书
    4. 禁用信任
    5. 如果服务器返回了根CA证书,那么它不在您的CA商店中,您的选项是:

      1. 添加(信任)它
      2. 禁用信任
      3. 我忽略了过期/撤销的证书,因为没有消息表明它。但您可以使用openssl x509 -text

        检查证书

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

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

答案 7 :(得分:5)

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

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

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

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

答案 8 :(得分:5)

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

sudo apt-get install ca-certificates

答案 9 :(得分:3)

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

答案 10 :(得分:2)

sudo apt-get install ca-certificates

为我工作。

答案 11 :(得分:2)

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

答案 12 :(得分:2)

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

答案 13 :(得分:2)

根据cURL docs,您还可以将证书传递给curl命令:

  

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

     

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

例如:

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

答案 14 :(得分:1)

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

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

答案 15 :(得分:1)

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

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

ssl certificate

答案 16 :(得分:1)

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

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

由于this answer,我意外地找到了原因。

当我从WAN访问my site时,一切都很顺利。

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

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

原因curl使用网站的广域网IP地址49.x.x.x时发生了什么。但是,在Web服务器的环境中,WAN IP是防火墙。

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

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

通过应用解决方案,Web服务器正确处理了curl的请求,而不是通过发送登录页面转发到响应的防火墙。

答案 17 :(得分:1)

在Windows上 - 如果你从cmd运行

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

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

设置环境变量:

CURL_CA_BUNDLE = C:\Program Files\curl-7.57.0\src\cacert.pem

并重新加载环境

refreshenv

现在再试一次

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

答案 18 :(得分:0)

仅更新证书列表就足够了

sudo update-ca-certificates -f
  

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

答案 19 :(得分:0)

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

openssl x509 -hash -noout -in DigiCert_Global_Root_G3.pem

您将获得dd8e9d41

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

dd8e9d41.0

然后重试。

答案 20 :(得分:0)

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

  1. 由于网络代理的工作方式,他们拥有自己的SSL证书,从而改变了curl看到的证书。许多或大多数企业网络都强迫您使用这些代理。
  2. 在客户端PC上运行的某些防病毒程序也与HTTPS代理类似,因此可以扫描您的网络流量。您的防病毒程序可能有一个选项来禁用此功能(假设您的管理员将允许它)。
  3. 作为旁注,上面的第2条可能会让您对您所谓的安全TLS流量被扫描感到不安。这对你来说就是企业界。

答案 21 :(得分:0)

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

答案 22 :(得分:0)

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

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

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

    <块引用>

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

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

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

答案 23 :(得分:-1)

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

答案 24 :(得分:-1)

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

答案 25 :(得分:-2)

这可以帮助您解决问题:

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

在枪口/枪口3上进行了测试。*

答案 26 :(得分:-2)

专门针对的 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中正常执行。

答案 27 :(得分:-4)

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

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