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

我得到以下错误使用卷曲:

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

如何设置证书验证位置?

316919 次浏览

似乎您的卷曲指向一个不存在的文件与CA证书或类似。

有关CA certs与curl的主要参考,参见:https://curl.haxx.se/docs/sslcerts.html

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

此错误与丢失的包: ca-certificates有关。安装它。

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

# apt-get install ca-certificates

在CygWin通过Apt-Cyg

# apt-cyg install ca-certificates

在Arch Linux下(树莓派)

# pacman -S ca-certificates

文档告诉我们:

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

如在:Debian—压缩中的ca-certificates包的详细信息所见

解决这个错误的最快方法是在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证书。

curl默认执行SSL证书验证,使用“bundle” Certificate Authority (CA)公钥(CA certs)。默认的 Bundle名为curl-ca-bundle.crt;您可以指定一个备用文件

.使用——cacert选项

如果此HTTPS服务器使用由中表示的CA签名的证书 ,证书验证可能失败,由于 证书的问题(它可能过期了,或者名称可能过期了

.域名不匹配URL中的域名)

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

例如

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

这对我很有效

sudo apt-get install ca-certificates

然后进入证书文件夹

sudo cd /etc/ssl/certs

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

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

如果没有“tls/certs”文件夹,请创建一个“tls/certs”文件夹,并使用chmod 777 -R folderNAME修改权限

我还安装了最新版本的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:"后面的路径。

把这个放进你的.bashrc

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

(见罗伯特的评论)

用以下内容创建一个文件~/.curlrc

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

如下

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

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

echo insecure >> ~/.curlrc

值得注意的是,检查which curl正在运行也很重要。

我维护的共享机器上的一个用户得到了这个错误。但原因是他们安装了Anaconda (http://continuum.io)。这样做将Anaconda的二进制路径放在标准的$PATH之前,并且它带有自己的curl二进制文件,它很难找到在这台Ubuntu机器上安装的的默认certs。

对于在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。卡帕特工作)。我还发现cURL站点上的CAbundle对于我要连接的远程站点是不够的,所以使用了一个在http://winampplugins.co.uk/curl/中列出的预编译的Windows版本的cURL 7.47.1

@roens是正确的。这将影响所有水蟒用户,以下错误
curl:(77)错误设置证书验证位置: CAfile: /etc/pki/tls/certs/ca-bundle.crt CApath:没有< /代码> < / p >

解决方法是使用默认的系统curl和避免来打乱前置的Anaconda PATH变量。你可以

  1. 重命名Anaconda curl二进制:)
    mv /path/to/anaconda/bin/curl /path/to/anaconda/bin/curl_anaconda < / p > < / >

  2. remove Anaconda curl
    conda remove curl < / p > < / >

$哪个卷曲 /usr/bin/curl < /代码> < / p >

[0] __abc0 __abc1

我也有同样的问题。事实证明,我的/etc/ssl/certs/ca-certificates.crt文件格式不正确。最后一个条目是这样的:

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

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

这是非常恼人的发现,因为我的update-ca-certificates命令没有给我任何警告。

这可能是也可能不是一个特定版本的curl问题,所以这里是我的版本,只是为了完整性:

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

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

git config --global http.sslverify "false"

只需创建文件夹,这在您的系统中是缺失的..

/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”,请确保将文件粘贴到错误中提到的确切位置。使用以下命令复制粘贴..

sudo cp /etc/ssl/certs/ca-certificates.crt . sh /etc/pki/tls/certs/ca-bundle.crt < / p >

固定的。

我遇到了同样的问题:我正在构建一个基于alpine的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-----
. 0之间的内容) -----END CERTIFICATE-----标记包括),并将其保存到一个文件(mycompanyRootCA。

建立你的形象

然后,当您从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 /

如果有人仍然有问题,试试这个,它对我很有效。 删除你的/etc/ssl/certs/目录中的文件 然后重新安装ca-certificates:

sudo apt install ca-certificates --reinstall

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

只要找到适合我的解决方案。

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

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

我也有这个问题。我的问题是这个文件:

/usr/ssl/certs/ca-bundle.crt

默认情况下只是一个空文件。因此,即使它存在,您仍然会得到错误,因为它不包含任何证书。你可以像这样生成它们:

p11-kit extract --overwrite --format pem-bundle /usr/ssl/certs/ca-bundle.crt

https://github.com/msys2/MSYS2-packages/blob/master/ca-certificates/ca-certificates.install

我使用MobaXterm,实习生使用Cygwin,所以即使在安装ca-certificates后使用apt-cyg install ca-certificates,问题也没有解决。

我仍然得到以下错误:

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

然后我尝试列出文件/etc/ssl/certs/ca-certificates.crt,我找不到它。然而,我可以找到所有标准CA证书的/usr/ssl/certs/ca-bundle.crt,所以我将文件/usr/ssl/certs/ca-bundle.crt复制为/etc/ssl/certs/ca-certificates.crt,问题得到了解决。

视窗:-

  1. https://curl.se/docs/caextract.html下载证书

  2. < p >重命名cacert。Pem到curl-ca-bundle.crt

  3. 将文件添加到下列任意位置

enter image description here

检查详细信息https://curl.se/docs/sslcerts.html

我在Ubuntu 20.04 localhost上试图访问运行在docker容器中的elasticsearch时遇到了这个curl 77问题。集装箱启动后:

  1. 检查curl不带ssl: curl --cacert http_ca.crt -u elastic https://localhost:9200 -k小写-k为不安全连接。

  2. 检查curl配置:curl-config --configure,注意到什么是ca-bundle: --with-ca-bundle=/etc/ssl/certs/ca-certificates.crt

  3. < p > http_ca副本。crt文件从容器到:/usr/local/share/ca-certificates/,原来的命令是在这里

  4. 执行update on ca-certificates: sudo update-ca-certificates

  5. 执行curl: curl -u elastic:<password> https://localhost:9201
    最后得到响应"tagline" : "You Know, for Search".

< p >改变& lt; password>到运行Docker Image时生成的那个。
还要注意,在我的机器上,弹性是在端口9201上启动的(不知道为什么:sudo ss -tlpn | grep 9200给我什么都没有),我发现端口:sudo netstat -ntlp,程序名是docker-proxy.