/etc/ssl/certs/ca-certificates.crt 的权限问题

/etc/ssl/certs/ca-certificates.crt 的权限问题

当以普通用户身份尝试通过 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.crtcurl-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

您可以使用chmodchown将所有内容恢复为正确设置:

  • 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

有关的:

相关内容