当以普通用户身份尝试通过 HTTPS 执行curl
某些操作时,会失败并显示以下错误:git clone
fatal: unable to access 'https://github.com/mikemackintosh/xxx/': Problem with the SSL CA cert (path? access rights?)
笔记:如果我以 root 身份运行命令,它可以正常工作,但 root 不应该是唯一能够通过 ssl 进行通信的用户。
所以我心想,好吧,curl 在幕后做什么:
$ GIT_CURL_VERBOSE=1 git clone https://github.com/mikemackintosh/xxx
Cloning into 'xxx'...
* Couldn't find host github.com in the .netrc file; using defaults
* Hostname was NOT found in DNS cache
* Trying 192.30.252.130...
* Connected to github.com (192.30.252.130) port 443 (#0)
* error reading ca cert file /etc/ssl/certs/ca-certificates.crt (Error while reading file.)
* Closing connection 0
fatal: unable to access 'https://github.com/mikemackintosh/xxx/': Problem with the SSL CA cert (path? access rights?)
因此,我们可以确认ca-certificate
文件是:/etc/ssl/certs/ca-certificates.crt
与curl-config -ca
输出匹配。
下一步是尝试读取该文件。作为一名普通的非 root 用户:
$ cat /etc/ssl/certs/ca-certificates.crt
cat: /etc/ssl/certs/ca-certificates.crt: Permission denied
现在这看起来很奇怪。
$ sudo ls -la /etc/ssl/certs/ca-certificates.crt
-rw-r--r-- 1 root root 273790 Jun 15 22:35 /etc/ssl/certs/ca-certificates.crt
$ sudo lsattr /etc/ssl/certs/ca-certificates.crt
-------------e-- /etc/ssl/certs/ca-certificates.crt
因此,从权限来看,它是全球可读的。访问它应该没有问题。没有阻止访问的疯狂属性。
做一个ls -la /etc/ssl/certs/
回报:
...
l????????? ? ? ? ? ? Verisign_Class_4_Public_Primary_Certification_Authority_-_G3.pem
l????????? ? ? ? ? ? VeriSign_Universal_Root_Certification_Authority.pem
l????????? ? ? ? ? ? Visa_eCommerce_Root.pem
l????????? ? ? ? ? ? WellsSecure_Public_Root_Certificate_Authority.pem
l????????? ? ? ? ? ? WoSign_China.pem
l????????? ? ? ? ? ? WoSign.pem
...
如果我运行sudo cat /etc/ssl/certs/ca-certificates.pem
,它会按预期吐出内容。
哦,这肯定是权限问题。
经过谷歌搜索,我发现有一个ssl-cert
组,但是该组没有该/etc/ssl/certs
目录的权限。
update-ca-certificates (w/wo -f)
排除了 apparmor,排除了磁盘损坏,如果我运行等等,则没有任何改进。
有人见过这种行为吗?
我以前从未见过这样的事情,但我在两台不同的机器上重复了它。需要注意的是,我确实有 CentOS/RHEL 背景,所以这可能是 Ubuntu 的正常行为,但我很想找到一个真正的解决方案。
答案1
运行namei -mo /etc/ssl/certs/ca-certificates.crt
。 将其输出与以下内容匹配:
f: /etc/ssl/certs/ca-certificates.crt
drwxr-xr-x root root /
drwxr-xr-x root root etc
drwxr-xr-x root root ssl
drwxr-xr-x root root certs
-rw-r--r-- root root ca-certificates.crt
您可以使用chmod
和chown
将所有内容恢复为正确设置:
sudo chown root / && chown root /etc/ && chown root /etc/ssl/ && chown root /etc/ssl/certs/ && chown root /etc/ssl/certs/ca-certificates.crt
sudo chmod 755 /
sudo chmod 755 /etc/
sudo chmod 755 /etc/ssl/
sudo chmod 755 /etc/ssl/certs
sudo chmod 644 /etc/ssl/certs/ca-certificates.crt
答案2
我今天遇到了同样的问题。以下是我所做的:
GIT_CURL_VERBOSE=1 git 克隆https://github.com/robbyrussell/oh-my-zsh.git
这将以 curl 详细模式克隆存储库(curl 现在导致问题)
这是我得到的
Cloning into 'oh-my-zsh'...
* Couldn't find host github.com in the .netrc file; using defaults
* Hostname was NOT found in DNS cache
* Trying 192.30.252.131...
* Connected to github.com (192.30.252.131) port 443 (#0)
* error reading ca cert file /bin/curl-ca-bundle.crt (Error while reading file.)
* Closing connection 0
fatal: unable to access 'https://github.com/robbyrussell/oh-my-zsh.git/': Problem with the SSL CA cert (path? access rights?)
请注意以下这一行:
- 读取 ca 证书文件 /bin/curl-ca-bundle.crt 时出错(读取文件时出错。)
我在本节中遇到了一个配置问题~/.gitconfig
[HTTP]->sslCAinfo
。您可能不会遇到同样的问题,但它将为您提供足够的信息来进行自行调试。
答案3
在 unix 中,会检查整个路径,所以在我看来,你应该检查路径中的文件夹是否具有权限,我认为它们至少应该具有 rw-,不要惊慌,如果谈论文件夹,w 并不意味着写入...因为如果你有 /a/b/c/certificate.pem 而你无法通过“b”,你就无法通过 b :D
希望能帮助到你 :)
答案4
确保您拥有 CA 证书,以允许基于 SSL 的应用程序检查 SSL 连接的真实性。它们可以通过以下方式安装:
sudo apt-get install ca-certificates openssl
这一点在 Docker 或 CI 容器中尤其容易缺失。
如果有的话,请考虑重新安装它。
您也可以尝试运行:sudo update-ca-certificates
。
有关的: