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

use*_*540 202 ssl curl 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.
Run Code Online (Sandbox Code Playgroud)

小智 193

与"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 /)

  • 我没有在PHP中看到任何问题参考.为什么在答案中引用?如果问题已被编辑,那么可以编辑答案以反映现在使用的命令行吗? (5认同)
  • 这个答案误导了我,因为它是与 PHP 相关的解决方案 (5认同)
  • 感谢您添加的提示:“适用于发送 CURL 请求的系统”。这对我很有帮助 (3认同)
  • 实际上我挣扎了一个小时,因为我没有在引号内写道.所以请在这里注意`curl.cainfo ="/ path/to/downloaded/cacert.pem"//不要忘记在引号之间写 (2认同)
  • @Adam虽然问题没有提到PHP,但这是由PHP生成的特定错误消息在Google中排名第一的搜索结果。因此,也许它并没有具体回答OP的问题,但是它似乎仍然对社区有用。 (2认同)
  • 编辑答案以提供有关解决curl问题的信息(通过指定本地cacert.pem文件) (2认同)

Yuv*_*ika 109

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

有两种方法可以使其工作:

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

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

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


小智 67

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

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
Run Code Online (Sandbox Code Playgroud)

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

  • 这可能有助于规避问题.但它完全错过了https和认证系统的想法. (37认同)
  • 添加此检查以确保仅将其与本地服务器一起使用 `if( stristr("127.0.0.1",$_SERVER["SERVER_NAME"] ) || stristr("localhost",$_SERVER["SERVER_NAME"] )) curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false); ` (5认同)
  • 作品!如果您不关心证书,那么很好的快速和肮脏的绕过 (3认同)
  • 这使它完全不安全。 (3认同)

Dan*_*ous 17

在我的情况下,在我尝试使用cURL使用的服务上安装我的证书时,结果证明是个问题.我无法将中间证书和根证书捆绑/连接到我的域证书中.起初并不是很明显,这是问题所在,因为尽管省略了中间证书和根证书,Chrome仍然将其解决并接受了证书.

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

$ cat intermediate.crt >> domain.crt
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,如果您执行此操作,并且您要添加的 crt 没有尾随换行符,那么您将看到类似“-----END CERTIFICATE----------BEGIN CERTIFICATE-”的行----` 在你的包中,你会得到一个晦涩的错误:`curl: (77) error setingcertificatelocations` (3认同)
  • 我有一个类似的问题,除了我没有将我的Apache SSLCertificateChainFile设置为正确的证书. (2认同)
  • 我正在使用letencrypt证书,但仅将证书和私钥部署到服务器。我的计算机上的Chrome和curl没有抱怨,但是我正在构建的nodejs应用程序不接受证书。将全链部署到服务器可解决此问题!感谢您指出正确的方向! (2认同)

Rig*_*iga 16

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

git config --global http.sslVerify false
Run Code Online (Sandbox Code Playgroud)

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

C:\Program Files (x86)\Git\bin\curl-ca-bundle.crt
Run Code Online (Sandbox Code Playgroud)

  • 工作,但感觉就像隐藏症状,而不是治愈疾病. (21认同)
  • 禁用SSL验证非常危险 (3认同)

小智 11

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

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

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

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

san*_*mar 11

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


Max*_*ina 10

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

sudo apt-get install ca-certificates
Run Code Online (Sandbox Code Playgroud)

  • 例如,一些小的 docker 容器可能没有安装这个,当整个包不存在时,没有必要对其他任何东西进行故障排除。 (2认同)

Gio*_*ous 8

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

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

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


例如:

curl --cacert mycertificate.cer -v https://www.stackoverflow.com
Run Code Online (Sandbox Code Playgroud)


Ank*_*ngh 8

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


小智 8

如果您只想测试它,则将--insecure与curl 命令一起传递以跳过验证。


Jas*_*ron 7

它很可能是服务器缺少的证书.

根 - >中程>服务器

服务器应至少发送Server&Intermediate.

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

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

  1. 让服务器修复
  2. 信任该证书并将其添加到您的CA证书库(不是最好的主意)
  3. 禁用信任,例如curl -k(非常糟糕的主意)

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

  1. 在您的CA商店中为此链安装CA(root)证书,例如google发行者.(只有你信任CA)
  2. 修复服务器以将CA作为链的一部分发送
  3. 信任链中的证书
  4. 禁用信任

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

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

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

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

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


Ene*_*imi 6

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

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

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

- abc.crt
- abc.pem
- abc-bunde.crt
Run Code Online (Sandbox Code Playgroud)

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

-----BEGIN CERTIFICATE-----
/*certificate content here*/
-----END CERTIFICATE-----
Run Code Online (Sandbox Code Playgroud)

如果我以这种格式提供它,浏览器将不会显示任何错误(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-----
Run Code Online (Sandbox Code Playgroud)

这些是您的中间证书和根证书。发生错误是因为它们在您提供给应用程序的 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-----
Run Code Online (Sandbox Code Playgroud)

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


Mic*_*zos 5

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

sudo update-ca-certificates -f
Run Code Online (Sandbox Code Playgroud)

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

  • 做到了,运行后一切就完成了。但卷曲不起作用。仍然是同样的错误。 (3认同)

小智 5

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

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
Run Code Online (Sandbox Code Playgroud)

ssl证书


小智 5

我的工作原理是在我的卷曲中添加 -k 。不需要让事情复杂化。

curl -LOk https://dl.k8s.io/release/v1.20.0/bin/linux/amd64/kubectl
Run Code Online (Sandbox Code Playgroud)

  • 这只是跳过安全问题。不是真正的解决方案。 (12认同)