在尝试访问 HTTPS url 时如何使用 cURL 处理证书?
Posted
技术标签:
【中文标题】在尝试访问 HTTPS url 时如何使用 cURL 处理证书?【英文标题】:How do I deal with certificates using cURL while trying to access an HTTPS url? 【发布时间】:2011-03-10 19:24:04 【问题描述】:我在使用 curl 时遇到以下错误:
curl:(77)错误设置证书验证位置: CAfile:/etc/ssl/certs/ca-certificates.crt CApath:无如何设置此证书验证位置?
【问题讨论】:
您使用的是什么操作系统/发行版?你应该安装 ca-certificates 包(这就是它在 debian/ubuntu 上的名称)。 为了将来参考,我已经安装了ca-certificates
,但错误仍然存在。问题是我的证书位于/etc/ssl/certs/ca-certificates.crt
而不是/etc/pki/tls/certs/ca-bundle.crt
,所以我只需要将环境变量CURL_CA_BUNDLE
设置为正确的路径。
酷!当我设置 export CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt
时,它对我有用。
【参考方案1】:
对于窗户:-
从https://curl.se/docs/caextract.html下载证书
将 cacert.pem 重命名为 curl-ca-bundle.crt
将文件添加到以下任意位置
查看详情https://curl.se/docs/sslcerts.html
【讨论】:
【参考方案2】:我也有这个问题。我的问题是这个文件:
/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
【讨论】:
【参考方案3】:我使用 MobaXterm,而实习生使用 Cygwin,所以即使在使用 apt-cyg install ca-certificates
安装 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
并且问题得到了解决。
【讨论】:
【参考方案4】:创建一个文件~/.curlrc
,内容如下
cacert=/etc/ssl/certs/ca-certificates.crt
如下
echo "cacert=/etc/ssl/certs/ca-certificates.crt" >> ~/.curlrc
【讨论】:
最佳答案,这在 Linux Mint 17 上对我有用 在 Mac 上,它与~/.curlrc
cacert=/etc/openssl/cert.pem
中的关注者一起使用
对我不起作用/ubuntu 18【参考方案5】:
只要发现这个解决方案对我来说非常有效。
echo 'cacert=/etc/ssl/certs/ca-certificates.crt' > ~/.curlrc
我从here找到了这个解决方案
【讨论】:
【参考方案6】:如果还有人遇到问题,试试这个,它对我有用。
删除/etc/ssl/certs/
目录中的文件
然后重新安装 ca 证书:
sudo apt install ca-certificates --reinstall
当我尝试安装 Linuxbrew 时这样做了。
【讨论】:
这对我有帮助,但我没有删除我机器上的文件。只需运行简单的命令,curl 就开始工作了。 这就是我的解决方案?【参考方案7】:我遇到了同样的问题:我正在构建一个基于 alpine 的 docker 映像,当我想 curl 到我组织的网站时,会出现此错误。要解决它,我必须获得我公司的 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/
【讨论】:
【参考方案8】:只需创建系统中缺少的文件夹..
/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 /etc/pki/tls/certs/ca-bundle.crt
固定。
【讨论】:
没有一个最适合我的答案,但确实如此!【参考方案9】:在 git bash 中运行以下对我来说很好的命令
git config --global http.sslverify "false"
【讨论】:
【参考方案10】:此错误与缺少包有关: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 -- Details of package ca-certificates in squeeze
【讨论】:
ca-certificates 已经是最新版本,但我仍然收到错误 当然,如果您尝试使用 curl 和 raw.github.com 的推荐方法安装 apt-cyg,您会遇到同样的错误。 在 Arch Linux 上,您可能还需要pacman -S ca-certificates-utils
。我做到了。
这个包已经安装了。这个答案没有帮助。
@PastorBones 我遇到了同样的问题,该软件包已经是最新的,但我认为它已损坏,因此 sudo apt install --reinstall ca-certificates
重新安装了该软件包并解决了我看到的错误【参考方案11】:
我遇到了完全相同的问题。事实证明,我的/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
【讨论】:
【参考方案12】:您的 curl 似乎指向具有 CA 证书或类似证书的不存在文件。
有关使用 curl 的 CA 证书的主要参考资料,请参阅:https://curl.haxx.se/docs/sslcerts.html
【讨论】:
【参考方案13】:@roens 是正确的。这会影响所有 Anaconda 用户,并出现以下错误curl: (77) error setting certificate verify locations:
CAfile: /etc/pki/tls/certs/ca-bundle.crt
CApath: none
解决方法是使用默认的系统 curl 并避免弄乱前面的 Anaconda PATH
变量。你可以
重命名 Anaconda curl 二进制文件 :)mv /path/to/anaconda/bin/curl /path/to/anaconda/bin/curl_anaconda
或删除 Anaconda curlconda remove curl
$ which curl
/usr/bin/curl
[0] Anaconda Ubuntu curl Github 问题 https://github.com/conda/conda-recipes/issues/352
【讨论】:
好发现,我没有意识到 Anaconda 正在窃取我的路径优先级。一旦我用完整路径/usr/bin/curl
替换curl
,它就起作用了【参考方案14】:
不管怎样,检查 which curl
是否正在运行也很重要。
我维护的共享计算机上的用户收到此错误。但原因原来是因为他们安装了 Anaconda (http://continuum.io)。这样做会将 Anaconda 的二进制路径放在标准 $PATH
之前,并且它带有自己的 curl
二进制文件,它无法找到安装在这台 Ubuntu 机器上的默认证书。
【讨论】:
我建议检查which -a curl
以查看所有可用的内容,当然还要注意哪个排在首位。【参考方案15】:
对于在 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/ 上列出的带有 curl 7.47.1 预编译 Windows 版本的 CAbundle。
【讨论】:
在windows上你也可以像这样在php之前添加“xampp”:curl.cainfo = "C:\xampp\php\extras\cacert.pem"【参考方案16】:curl 默认执行SSL
证书验证,使用“bundle”
Certificate Authority (CA)
公钥(CA 证书)。默认
bundle 被命名为 curl-ca-bundle.crt;您可以指定一个备用文件
使用 --cacert 选项。
如果此 HTTPS
服务器使用由 CA 签名的证书
捆绑包,证书验证可能由于以下原因而失败
证书有问题(它可能已过期,或者名称可能
与 URL 中的域名不匹配)。
如果您想关闭 curl 对证书的验证,请使用
-k(或--insecure
)选项。
例如
curl --insecure http://........
【讨论】:
顺便说一句,“信任来源”在这里是无关紧要的,因为如果没有针对 CA 正确验证证书,您将不知道“来源”是谁。【参考方案17】:解决此问题的另一种方法是禁用证书验证:
echo insecure >> ~/.curlrc
【讨论】:
解决方法,但在使用 curl 证书的时间过长之后,它可以帮助我。谢谢。【参考方案18】:解决该错误的最快方法是在 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,仍然不太可能存在风险。 是的,真的。 “-k”选项是“--insecure”的简写。如果你有中间人,你认为他在用你的数据做什么?剧透警报:他正在解密它,窃取它,并可能修改它并注入回不安全的流中。直接来自手册页:“-k, --insecure (SSL) 此选项明确允许 curl 执行“不安全”的 SSL 连接和传输。所有 SSL 连接都试图通过使用默认安装的 CA 证书包来确保安全。这使得所有被认为是“不安全”的连接都会失败,除非使用 -k, --insecure。” 如果您需要 SSL,您需要隐私和验证 --k
标志意味着您正在丢失验证。根据您的需要,这可能是可以接受的。如果您假设您的网络和您正在与之通信的服务器受到入侵者的保护(您能做出这样的假设吗?),那么 MITM 是不平凡的攻击。风险会根据您的数据类型而增加(源代码和证书比图像风险更大)。您可以在传输后验证数据的完整性(校验和等),但现在您将信任转移到该校验和通道上。最后-k
给了你更多的工作。
这是否意味着如果我使用的是自签名证书。我应该使用选项-k。因为可能无法验证自签名证书?【参考方案19】:
把这个放到你的.bashrc
# fix CURL certificates path
export CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt
(见罗伯特的评论)
【讨论】:
感谢您提供了一种不需要我手动清理系统文件,但仍然保证使用证书的安全性的方法! 谢谢。这解决了我与 pyenv & curl 的类似问题。我使用的是 Ubuntu 14.04,并且已经安装了 ca-certificates。 此方法也适用于 xonsh(将$CURL_CA_BUNDLE = "/etc/ssl/certs/ca-certificates.crt"
添加到 .xonshrc
)。
以防万一:这个的一个班轮版本:CURL_CA_BUNDLE=/path/to/bundle.crt curl http://example.com
【参考方案20】:
我还安装了最新版本的 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:”后面的路径。
【讨论】:
如果不想在每次更新时重新复制,也可以使用ln -s
创建符号链接。
在 Fedora 25 上的 rescuetime
应用程序遇到了同样的问题。sudo ln -s /etc/pki/tls/certs/ca-bundle.crt /etc/pki/tls/certs/ca-certificates.crt
解决了这个问题。 (CURL_CA_BUNDLE
env var 不起作用)
在我的 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 ...
)引起的。【参考方案21】:
这对我有用
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 更改权限
【讨论】:
我试过这个,但这对我不起作用,我仍然得到同样的错误。有什么想法吗?chmod 777
非常不安全(任何人 - 任何进程 - 在那个盒子上都可以更改证书和 MitM 攻击你) - chmod 755
要好得多【参考方案22】:
来自$ 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.
【讨论】:
以上是关于在尝试访问 HTTPS url 时如何使用 cURL 处理证书?的主要内容,如果未能解决你的问题,请参考以下文章