在尝试访问HTTPS URL时如何使用cURL处理证书?


187

使用curl我遇到以下错误:

curl:(77)错误设置证书验证位置:
  CAfile:/etc/ssl/certs/ca-certificates.crt
  CApath:无

如何设置此证书验证位置?谢谢。


2
您正在使用什么操作系统/发行版?您应该安装ca-certificates软件包(在debian / ubuntu上就是这样)。
igorw

40
供以后参考,我已经ca-certificates安装了,但错误仍然存​​在。问题是我的证书位于/etc/ssl/certs/ca-certificates.crt而不是/etc/pki/tls/certs/ca-bundle.crt,所以我只需要将环境变量CURL_CA_BUNDLE设置为正确的路径即可。
罗伯·史密斯

13
凉!我坐下来对我有用export CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt
整洁的

Answers:


82

此错误与缺少软件包有关ca-certificates。安装它。

在Ubuntu Linux(及类似发行版)中:

# apt-get install ca-certificates

在CygWin中通过Apt-Cyg

# apt-cyg install ca-certificates

在Arch Linux(Raspberry Pi)中

# pacman -S ca-certificates

该文件告诉:

该软件包包括CA证书的PEM文件,以允许基于SSL的应用程序检查SSL连接的真实性。

如在Debian上所示-squeeze中的ca-certificates软件包详细信息


97
ca-certificates已经是最新版本了,但我仍然遇到错误
Pastor Bones

2
当然,如果尝试使用curl和raw.github.com通过推荐的方法安装apt- cyg,也会遇到相同的错误。
10gistic 2013年

11
在Arch Linux上,您可能还需要pacman -S ca-certificates-utils。是的
Mark Grimes

8
该软件包已安装。这个答案没有帮助。
JimmyJames

8
@PastorBones我有同样的问题,该包已经最新的,我认为它不过被损坏,所以sudo apt install --reinstall ca-certificates重新安装包,解决了我看到的错误
威尔

153

我还安装了最新版本的ca-certificates,但仍然出现错误:

curl: (77) error setting certificate verify locations:
  CAfile: /etc/pki/tls/certs/ca-bundle.crt
  CApath: none

问题是curl期望证书在路径中,/etc/pki/tls/certs/ca-bundle.crt但是找不到它,因为证书在路径中/etc/ssl/certs/ca-certificates.crt

通过运行将我的证书复制到预期的目的地

sudo cp /etc/ssl/certs/ca-certificates.crt /etc/pki/tls/certs/ca-bundle.crt

为我工作。如果不存在,则需要为目标位置创建文件夹

sudo mkdir -p /etc/pki/tls/certs

如果需要,请修改以上命令以使目标文件名与curl期望的路径匹配,即用/etc/pki/tls/certs/ca-bundle.crt错误消息中“ CAfile:”之后的路径替换。


31
ln -s如果不想每次更新时都重新复制它,则也可以创建一个符号链接。
starbeamrainbowlabs 2015年

4
rescuetime在Fedora 25上的应用程序遇到了同样sudo ln -s /etc/pki/tls/certs/ca-bundle.crt /etc/pki/tls/certs/ca-certificates.crt的问题。解决了该问题。(CURL_CA_BUNDLEenv var无效)
GabLeRoux

在我的ubuntu上,此问题已解决:sudo ln -s /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.pem。我实际上The repository ... does not have a Release file是由于缺少证书(Could not load certificates from ...)导致的。
Marinos

84

放进你的 .bashrc

# fix CURL certificates path
export CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt

(请参阅罗伯特的评论)


8
感谢您提供的方法不需要我手工处理系统文件,但仍然可以确保使用证书的安全性!
史蒂芬·约翰逊

谢谢。这解决了我与pyenv和curl相似的问题。我正在使用Ubuntu 14.04,并且已经安装了ca证书。
davidA

这种方法也适用于xonsh(添加$CURL_CA_BUNDLE = "/etc/ssl/certs/ca-certificates.crt"到中.xonshrc)。
m00am

以防万一:此的一个衬里版本:CURL_CA_BUNDLE=/path/to/bundle.crt curl http://example.com
jmathew 18'Jan

30

创建~/.curlrc具有以下内容的文件

cacert=/etc/ssl/certs/ca-certificates.crt

1
最好的答案,这对我在Linux Mint 17上起作用
圣地亚哥,

在Mac上,它可以在~/.curlrc cacert=/etc/openssl/cert.pem
amirathi

21

解决该错误的最快方法是在curl请求中的某处添加-k选项。该选项“允许没有证书的SSL引用连接”。(来自curl --help)

请注意,这可能意味着您未在与您认为的端点进行对话,因为它们正在提供未经您信任的CA签名的证书。

例如:

$ curl -o /usr/bin/apt-cyg https://raw.github.com/cfg/apt-cyg/master/apt-cyg

给了我以下错误响应:

curl: (77) error setting certificate verify locations:
  CAfile: /usr/ssl/certs/ca-bundle.crt
  CApath: none

我在-k上添加了:

curl -o /usr/bin/apt-cyg https://raw.github.com/cfg/apt-cyg/master/apt-cyg -k

并没有错误消息。作为奖励,现在我安装了apt-cyg。和ca证书。


10
那可能会绕过错误,但同时也会使“安全”连接变得不安全。
蒂姆(Tim)

1
并不是的。据我所知,您不能仅绕过安全连接的加密,因此它仍然是加密的,并且仅连接到一个端点。如果我错了,请有人纠正我,但您所面临的唯一风险是,您可能会沦为中间人攻击的牺牲品。如果您使用卷发,仍然不太可能会有风险。
10gistic

18
对真的。“ -k”选项是“ --insecure”的简写。如果您是中间人,您认为他在处理您的数据吗?剧透警报:他正在解密,窃取它,并可能对其进行修改并注入不安全的流中。直接在手册页上:“ -k,--insecure(SSL)”该选项显式允许curl执行“不安全”的SSL连接和传输。尝试通过使用默认安装的CA证书捆绑使所有SSL连接变得安全。除非使用-k,--insecure,否则所有被认为“不安全”的连接都会失败。
蒂姆(Tim)

2
如果您需要SSL,则需要隐私和验证-该-k标志表示您正在丢失验证。根据您的需要,这可能是可以接受的。如果您假设您的网络和与之通信的服务器受到入侵者的保护,则MITM是不平凡的攻击(您可以做这个假设吗?)。根据您的数据类型,风险会增加(源代码和证书比图像更具风险)。您可以在传输后验证数据的完整性(校验和等),但是现在您正在将信任转移到该校验和通道上。最后-k为您提供了更多的工作。
Mark Fox

这是否意味着如果我使用的是自签名证书。我应该使用选项-k。由于可能无法验证自签名证书?
Linus 2014年

15

@roens是正确的。这会影响所有Anaconda用户,出现以下错误
curl: (77) error setting certificate verify locations: CAfile: /etc/pki/tls/certs/ca-bundle.crt CApath: none

解决方法是使用默认的系统curl并避免弄乱前面的Anaconda PATH变量。你可以

  1. 重命名Anaconda curl二进制文件:)
    mv /path/to/anaconda/bin/curl /path/to/anaconda/bin/curl_anaconda

  2. 去除Anaconda卷发
    conda remove curl

$ which curl /usr/bin/curl

[0] Anaconda Ubuntu curl Github问题 https://github.com/conda/conda-recipes/issues/352


很好的发现,我没有意识到Anaconda在抢我的道路。一旦我替换curl了完整路径,它就会起作用/usr/bin/curl
jxramos

这很有帮助!谢谢。
Shababb Karim

12

来自$ man curl

--cert-type <type>
    (SSL) Tells curl what certificate type the provided  certificate
    is in. PEM, DER and ENG are recognized types.  If not specified,
    PEM is assumed.

    If this option is used several times, the last one will be used.

--cacert <CA certificate>
    (SSL) Tells curl to use the specified certificate file to verify
    the peer. The file may contain  multiple  CA  certificates.  The
    certificate(s)  must be in PEM format. Normally curl is built to
    use a default file for this, so this option is typically used to
    alter that default file.

7

对于在Windows的XAMPP上运行的PHP代码,我发现我需要编辑php.ini以包括以下内容

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo = curl-ca-bundle.crt

然后复制到文件https://curl.haxx.se/ca/cacert.pem并重命名为curl-ca-bundle.crt并将其放在\ xampp路径下(我无法使curl.capath正常工作) 。我还发现cURL站点上的CAbundle还不足以连接到我要连接的远程站点,因此使用了http://winampplugins.co.uk上预编译的curl 7.47.1 Windows版本列出的CAbundle 。 /卷曲/


在Windows上,您也可以像这样在php之前添加“ xampp”:curl.cainfo =“ C:\ xampp \ php \ extras \ cacert.pem”
Ryan Steyn

7

我有同样的问题。事实证明,我的/etc/ssl/certs/ca-certificates.crt文件格式错误。最后一个条目显示如下内容:

-----BEGIN CERTIFICATE-----
MIIEDTCCAvWgAwIBAgIJAN..lots of certificate text....AwIBAgIJAN-----END CERTIFICATE-----

在之前添加换行符之后-----END CERTIFICATE-----,curl可以处理证书文件。

因为我的update-ca-certificates命令没有给我任何警告,所以这很烦人。

这可能不是卷曲的特定于版本的问题,所以这是我的版本,仅出于完整性考虑:

curl --version
# curl 7.51.0 (x86_64-alpine-linux-musl) libcurl/7.51.0 OpenSSL/1.0.2j zlib/1.2.8 libssh2/1.7.0
# Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp 
# Features: IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP UnixSockets 

6

这对我有用

sudo apt-get install ca-certificates

然后进入位于的证书文件夹

sudo cd /etc/ssl/certs

然后将ca-certificates.crt文件复制到 /etc/pki/tls/certs

sudo cp ca-certificates.crt /etc/pki/tls/certs

如果没有tls / certs文件夹:创建一个并使用chmod 777 -R folderNAME更改权限


1
我尝试了此操作,但这对我不起作用,并且仍然出现相同的错误。有任何想法吗 ?
Anirudh 2015年

6

解决此问题的另一种方法是禁用证书验证:

echo insecure >> ~/.curlrc

1
解决方法,但是经过大量时间使用curl证书后,它对我有帮助。谢谢。
K. Gol

4

curl SSL默认情况下使用“捆绑”的Certificate Authority (CA)公钥(CA证书)执行证书验证。默认捆绑包名为curl-ca-bundle.crt; 您可以使用--cacert选项指定备用文件。

如果此HTTPS服务器使用由捆绑软件中表示的CA签名的证书,则证书验证可能由于证书问题而失败(证书可能已过期,或者名称可能与URL中的域名不匹配)。

如果您想关闭curl对证书的验证,请使用-k(或--insecure)选项。

例如

curl --insecure http://........

3
撇开“信任源”在这里无关紧要,因为如果没有针对CA正确验证证书,您就不知道“源”是谁。
杰夫·艾伦


3

只需创建系统中缺少的文件夹即可。

/ etc / pki / tls / certs /

并使用以下命令创建文件,

sudo apt-get install ca-certificates

然后将证书复制并粘贴到目标文件夹中,该文件夹将显示在您的错误中。.我的“ with message 'error setting certificate verify locations: CAfile: /etc/pki/tls/certs/ca-bundle.crt CApath: none' in”是确保将文件粘贴到错误中提到的确切位置。使用以下命令复制粘贴。

须藤cp /etc/ssl/certs/ca-certificates.crt /etc/pki/tls/certs/ca-bundle.crt

固定。


最重要的答案都不适合我,但这确实有用!
Prachiti Prakash Prabhu

2

就其价值而言,检查which curl的运行也很重要。

我维护的共享计算机上的用户遇到此错误。但结果却是因为他们安装了Anaconda(http://continuum.io)。这样做把蟒蛇的二进制文件路径的标准之前$PATH,它有它自己curl的二进制,这已经很难找到,默认证书安装在此Ubuntu的机器上。


1
我建议检查which -a curl以查看所有可用内容,当然还要注意最重要的是哪一个。
jxramos

2

如果仍然有人遇到问题,请尝试此操作,它对我有用。删除/etc/ssl/certs/目录中的文件,然后重新安装ca-certificates:

sudo apt install ca-certificates --reinstall

当我尝试安装Linuxbrew时这样做了。


1
这对我有帮助,但是我没有删除计算机上的文件。只需运行简单的命令,curl就可以开始工作了。
Josefhu15

1

如果您在macOS上使用自制软件,或者在linux中使用linuxbrew,请尝试重新安装,opensslcurl通过此页面中的以下步骤进行操作。

此错误消息表示curl无法使用openssl建立安全连接。重新安装openssl应该可以解决问题。要临时使用curl和git的不安全连接来下载任何必要的文件,请运行:

echo insecure >> ~/.curlrc
git config --global http.sslVerify false

然后,安装或重新安装openssl并卷曲:

HOMEBREW_CURLRC=1 brew reinstall openssl curl

最后,撤消安全性更改以使curl和git再次使用安全连接:

sed -i '/^insecure$/d' ~/.curlrc
git config --global http.sslVerify true

您可能需要启动一个新的shell会话以验证结果

curl -v https://github.com # or any other https urls.

如果在输出中显示以下输出,则应解决该问题!

* successfully set certificate verify locations:
*   CAfile: /usr/local/etc/openssl/cert.pem
    CApath: /usr/local/etc/openssl/certs

参考文献:


经过数小时的尝试。这救了我。最终,适用于macOS的正确解决方案。非常感谢!:)
mrateb

1

我遇到了同样的问题:我正在构建一个基于高山的docker映像,并且当我想卷曲到组织的网站时,会出现此错误。要解决它,我必须获得我公司的CA证书,然后,必须将其添加到我的映像的CA证书中。

获取CA证书

使用OpenSSL获取与网站相关的证书:

openssl s_client -showcerts -servername my.company.website.org -connect my.company.website.org:443

这将输出类似:

CONNECTED(00000005)
depth=2 CN = UbisoftRootCA
verify error:num=19:self signed certificate in certificate chain
...
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
... 
-----END CERTIFICATE-----
...

获取最后一个证书(在-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----标记之间的内容)并将其保存到文件中(例如,mycompanyRootCA.crt)

建立你的形象

然后,当您从alpine构建您的docker映像时,请执行以下操作:

FROM alpine
RUN apk add ca-certificates curl
COPY mycompanyRootCA.crt  /usr/local/share/ca-certificates/mycompanyRootCA.crt
RUN update-ca-certificates

您的图像现在将正常工作!\ o /


1

只是发现此解决方案非常适合我。

echo 'cacert=/etc/ssl/certs/ca-certificates.crt' > ~/.curlrc

我从这里找到了这个解决方案


0

该错误是由于PKI目录中的SSL链证书文件损坏或丢失。您需要按照以下步骤确定文件是否绑定:在控制台/终端中:

mkdir /usr/src/ca-certificates && cd /usr/src/ca-certificates

输入此站点:https : //rpmfind.net/linux/rpm2html/search.php? query = ca-certificates,获取用于SO的ca证书。复制下载网址并粘贴到网址中:wget now_url_donwload_ca-ceritificated.rpm,立即安装rpm:

rpm2cpio your_url_donwload_ca-ceritificated.rpm | cpio -idmv

现在重新启动服务:我的示例此命令:

sudo service2 httpd restart

0

在git bash中运行以下命令对我来说很好

git config --global http.sslverify "false"




0

我遇到了这个问题,结果证明我的CURL版本无法解析DER编码的证书(也没有注意--cert-type选项)。当我将证书转换为PEM格式时,它可以工作。


0

就我而言,/etc/ssl/certs/ca-certificates.crt文件丢失了。事实证明/etc/ssl/certs,在构建Docker映像时,我已经从Dockerfile中删除了内容。在调整了我的shell脚本/ bash命令之后,它们就可以在Dockerfile中运行了-curl现在可以在新容器中完美运行了。

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.