【问题标题】:cURL not working (Error #77) for SSL connections on CentOS for non-root users对于非 root 用户在 CentOS 上的 SSL 连接 cURL 不起作用(错误 #77)
【发布时间】:2013-06-12 11:42:57
【问题描述】:

就在最近,我的服务器停止处理对我的 Web 服务器的 https:// 地址的 curl 请求。经过一番挖掘,似乎是网络服务器正在运行的用户存在问题。

如果我以 root 身份 SSH 到服务器并调用

curl -I -v https://google.com

...我得到以下响应...

* About to connect() to google.com port 443 (#0)
*   Trying 173.194.67.113... connected
* Connected to google.com (173.194.67.113) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
*   CAfile: /etc/pki/tls/certs/ca-bundle.crt
  CApath: none
* SSL connection using SSL_RSA_WITH_RC4_128_SHA
* Server certificate:
*       subject: CN=*.google.com,O=Google Inc,L=Mountain View,ST=California,C=US
*       start date: May 22 15:50:20 2013 GMT
*       expire date: Oct 31 23:59:59 2013 GMT
*       common name: *.google.com
*       issuer: CN=Google Internet Authority,O=Google Inc,C=US
> HEAD / HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Host: google.com
> Accept: */*

但是,如果我以任何 cPanel 帐户(也用于通过 Web 服务器运行时)登录,我会得到以下信息...

* About to connect() to google.com port 443 (#0)
*   Trying 173.194.67.101... connected
* Connected to google.com (173.194.67.101) port 443 (#0)
* Initializing NSS with certpath: none
* NSS error -5978
* Closing connection #0
* Problem with the SSL CA cert (path? access rights?)
curl: (77) Problem with the SSL CA cert (path? access rights?)

我无法找到问题的明确答案,并且我的托管公司拒绝提供帮助,因为它“失去支持”,尽管上周运行良好!

我确实在http://curl.haxx.se/docs/sslcerts.html 上找到了提及

"如果 libcurl 是在 NSS 支持下构建的,那么取决于操作系统发行版, 可能需要采取一些额外的步骤来使用系统范围的 CA 证书数据库。 RedHat 附带了一个附加模块 libnsspem.so,它支持 NSS 读取 OpenSSL PEM CA 包。 OpenSuSE 中缺少该库,并且 没有它,NSS 只能使用它自己的内部格式。 NSS 也有一个新的 数据库格式:https://wiki.mozilla.org/NSS_Shared_DB"

...但我找不到有关如何在我的 CentOS 服务器上获得此工作系统范围的信息。

信息

curl 7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
Protocols: tftp ftp telnet dict ldap ldaps http file https ftps scp sftp 
Features: GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz 

谁能解释一下为什么这可能会突然改变,或者更好的是如何解决它?

谢谢

【问题讨论】:

    标签: curl ssl centos nss


    【解决方案1】:

    我刚刚在 CentOS7 上遇到了与 Error#77 类似的问题。我错过了与 ca-certificates RPM 一起安装的软链接 /etc/pki/tls/certs/ca-bundle.crt

    'curl' 试图打开此路径以获取证书颁发机构。 我发现:

    strace curl https://example.com
    

    并清楚地看到该链接上的打开失败。

    我的解决方法是:

    yum reinstall ca-certificates
    

    这应该会重新设置所有内容。如果您有供企业或自签名使用的私有 CA,请确保它们位于 /etc/pki/ca-trust/source/anchors 中,以便重新添加它们。

    【讨论】:

    • 甜蜜!重新安装也解决了我的问题。
    • 谢谢完美的解决方案,经过大量搜索,2个月后得到了这个解决方案。
    【解决方案2】:

    如果您最近到达这里,就像我在徒劳地搜索相同的错误时所做的那样,您可能会发现它是 NSS 的更新导致 CentOS 上的故障。通过运行 yum update 进行测试,看看是否出现错误,curl 也会产生此错误。解决方案很简单,只需手动安装 NSS。

    继续阅读...

    如果你和我一样,它会抛出类似这样的错误:

    curl: (77) Problem with the SSL CA cert (path? access rights?)
    

    这需要一些时间来解决,但发现它不是 CA 证书,因为通过重新创建它们并检查所有配置,我已经排除了它。可能是 libcurl,所以我去寻找更新。

    如前所述,我重新创建了 CA 证书。你也可以这样做,但这可能是浪费时间。 http://wiki.centos.org/HowTos/Https

    下一步(可能应该是我的第一步)是通过简单地运行 yum 来检查所有内容是否是最新的。

    $ yum update
    $ yum upgrade
    

    这给了我一个肯定的答案,即有一个更大的问题在起作用: Downloading Packages: error: rpmts_HdrFromFdno: Header V3 RSA/SHA1 Signature, key ID c105b9de: BAD Problem opening package nss-softokn-freebl-3.14.3–19.el6_6.x86_64.rpm 我开始阅读有关使用 NSS 进行证书验证以及此新更新可能与我的问题有关的内容。 所以yum坏了。这是因为 nss-softokn-* 需要 nss-softokn-freebl-* 需要彼此才能发挥作用。问题是他们不检查彼此版本的兼容性,在某些情况下它最终会破坏 yum。 让我们去解决问题:

    $ wget http://mirrors.linode.com/centos/6.6/updates/x86_64/Packages/nsssoftokn-freebl-3.14.3-19.el6_6.x86_64.rpm
    $ rpm -Uvh nss-softokn-freebl-3.14.3–19.el6_6.x86_64.rpm
    $ yum update
    

    您当然应该从最近的镜像下载并检查正确的版本/操作系统等。我们基本上从 rpm 下载并安装更新以修复 yum。正如@grumpysysadmin 指出的那样,您可以缩短命令。 @cwgtex 建议您应该使用 RPM 命令安装升级,使过程更加简单。

    要使用 wordpress 修复问题,您需要重新启动 http 服务器。

    $ service httpd restart
    

    再试一次,成功!

    【讨论】:

    • 在安装 Java 后,我只需要调用 service httpd restart,这个简单的命令就解决了 curl 错误 #77 的问题。
    • 这个问题是在将 CentOS 从 7.3 升级到 7.9 后出现的。我遵循了上述两个答案..重新安装了ca证书并重新启动了httpd。有效。谢谢。
    【解决方案3】:

    对于 Ubuntu:

    sudo apt-get install ca-certificates
    

    尝试在 Dockerfile 中将内容卷曲为 ROOT 时遇到此问题

    【讨论】:

      【解决方案4】:

      事实证明,问题在于脚本是从 cPanel“通过电子邮件传送到脚本”运行的,因此是以用户身份运行的,因此是用户问题,但根本没有影响 Web 服务器。

      用户无法访问 /etc/pki 目录的原因是他们只有被监禁的 ssh 访问权限。在我授予完全访问权限后,一切正常。

      谢谢你的信息,雷米。

      【讨论】:

        【解决方案5】:

        我在 CentOS-7 上遇到了同样的问题。 这对我很有效。

        创建空文件。

        touch /etc/sysconfig/64bit_strstr_via_64bit_strstr_sse2_unaligned
        

        CentOS-7 的发行版镜像中有一个 curl 错误。

        https://bugs.centos.org/view.php?id=16282

        【讨论】:

        • 在我遇到的所有解决方案中,这个解决方案解决了它。该死的,非常感谢!
        【解决方案6】:

        检查您是否在 CA 证书包上设置了正确的权限。 通常,这意味着每个人都可以读取 /etc/ssl/certs 目录中的 CA 文件,例如 /etc/ssl/certs/ca-certificates.crt。

        你可以看到已经为你的curl版本配置了哪些文件

        curl-config --configure
        命令:
        $ curl-config --configure
         '--prefix=/usr' 
         '--mandir=/usr/share/man' 
         '--disable-dependency-tracking' 
         '--disable-ldap' 
         '--disable-ldaps' 
         '--enable-ipv6' 
         '--enable-manual' 
         '--enable-versioned-symbols' 
         '--enable-threaded-resolver' 
         '--without-libidn' 
         '--with-random=/dev/urandom' 
         '--with-ca-bundle=/etc/ssl/certs/ca-certificates.crt' 
         'CFLAGS=-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector --param=ssp-buffer-size=4' 'LDFLAGS=-Wl,-O1,--sort-common,--as-needed,-z,relro' 
         'CPPFLAGS=-D_FORTIFY_SOURCE=2'
        

        这里你需要读取/etc/ssl/certs/ca-certificates.crt

        $ curl-config --configure
         '--build' 'i486-linux-gnu' 
         '--prefix=/usr' 
         '--mandir=/usr/share/man' 
         '--disable-dependency-tracking' 
         '--enable-ipv6' 
         '--with-lber-lib=lber' 
         '--enable-manual' 
         '--enable-versioned-symbols' 
         '--with-gssapi=/usr' 
         '--with-ca-path=/etc/ssl/certs' 
         'build_alias=i486-linux-gnu' 
         'CFLAGS=-g -O2' 
         'LDFLAGS=' 
         'CPPFLAGS='
        

        这里也一样。

        【讨论】:

          【解决方案7】:

          每当我尝试在我的 https 服务器上执行 curl 时,我都遇到了同样的问题。

          About to connect() to localhost port 443 (#0)
          Trying ::1...
          Connected to localhost (::1) port 443 (#0)
          Initializing NSS with certpath: sql:/etc/pki/nssdb
          

          当我错误地配置密钥库路径时发现了这个问题。更正密钥库路径后,它起作用了。

          【讨论】:

            【解决方案8】:

            该错误是由于 PKI 目录中的 SSL 链证书文件损坏或丢失所致。 您需要确保文件 ca-bundle,执行以下步骤: 在您的控制台/终端中:

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

            进入这个网站:https://rpmfind.net/linux/rpm2html/search.php?query=ca-certificates,获取你的 ca-certificate,给你 SO,例如: ftp://rpmfind.net/linux/fedora/linux/updates/24/x86_64/c/ca-certificates-2016.2.8-1.0.fc24.noarch.rpm

            rpm2cpio your_url_donwload_ca-ceritificated.rpm | cpio -idmv
            

            现在重新启动您的服务: 我的例子是这个命令:

            sudo service2 httpd restart
            

            非常棒 好看

            【讨论】:

              【解决方案9】:

              请检查服务器上安装的 ca 证书的权限。

              【讨论】:

                【解决方案10】:

                Windows 用户,将其添加到 PHP.ini:

                curl.cainfo = "C:/cacert.pem";
                

                路径需要改成你自己的,你可以从谷歌搜索下载cacert.pem

                (是的,我知道这是一个 CentOS 问题)

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-08-15
                  • 1970-01-01
                  • 2015-08-21
                  • 1970-01-01
                  • 2018-10-08
                  • 2019-02-13
                  • 2018-06-16
                  相关资源
                  最近更新 更多