安装cocoapods时出现SSL验证错误

12

我执行了sudo gem install cocoapods

这是终端返回的完整信息

ERROR:  You must add /C=BE/O=GlobalSign nv-sa/CN=AlphaSSL CA - SHA256 - G2 to your local trusted store
ERROR:  Could not find a valid gem 'cocoapods' (>= 0), here is why:
          Unable to download data from https://rubygems.org/ - hostname "rubygems.org" does not match the server certificate (https://rubygems.org/specs.4.8.gz)
ERROR:  SSL verification error at depth 0: unable to get local issuer certificate (20)

我没有SSL的经验,但是我看了几个与我的问题类似的问题,但是没有运气。

我尝试过:

  • 下载并安装新的SHA256中间证书
  • 将主机名从https更改为http
  • 按照 此指南,但无法将 GlobalSignRootCA.pem 复制到 ruby 文件夹中
  • 使用HomeBrew,但在安装时遇到另一个错误

使用\curl -sSL https://get.rvm.io | bash -s stable安装RVM;重启你的shell;使用rvm install 2.7安装Ruby。不要使用系统自带的Ruby - anothermh
@anothermh,在安装了rvm之后,我是否仍需使用“sudo gem install cocoapods”命令?因为我用该命令仍然遇到了相同的错误。 - bao le
3
不要使用sudo。 - anothermh
7个回答

18

MichaelHuelsen给出了正确的答案。在这里,我将提供逐步说明,对我而言有效,但会用一个大的pem文件覆盖原来的文件,所以如果这个文件包含敏感信息,您可能不想破坏它。

  1. 确定证书文件的ID。
$ ruby -ropenssl -e 'p OpenSSL::X509::DEFAULT_CERT_FILE'
"/etc/pki/tls/cert.pem"

告诉我我的证书文件在哪里。

  1. 备份证书文件
cp /etc/pki/tls/cert.pem /tmp/cert.pem.bak
  1. 通过curl复制完整的证书文件

见:https://curl.se/docs/caextract.html

curl --remote-name --time-cond cacert.pem https://curl.se/ca/cacert.pem
将新的cacert.pem文件移动到替换旧文件的位置。
mv cacert.pem /etc/pki/tls/cert.pem

然后我运行了gem update --system来更新东西,但你可能只需要运行原始的gem命令。


1
2022年运行良好。 - Ali Raza
我能够按照这些步骤进行,但错误仍然存在。 - Ray
1
在2023年工作 - Binoy Babu

5

我建议仔细阅读错误信息。通常,Ruby证书存储中的默认根CA缺少证书链中重要的证书。例如,如果您在(公司)代理后面。

由于Ruby依赖于openssl,因此您需要找到证书文件的位置。

ruby -ropenssl -e 'p OpenSSL::X509::DEFAULT_CERT_FILE'

它会输出Ruby和Gem正在使用的文件。在我的情况下,我使用的是Windows 10和Ruby 3.0,它看起来类似于这样:
"C:/Your_Local_Ruby_Install_Path/Ruby30-x64/ssl/cert.pem"

cert.pem是一个包含证书信息的纯文本文件。您需要下载并提供缺失的证书,然后将其添加到cert.pem文件中。

之后,您就可以使用gem install your_package而不会出现由于之前缺少的证书而导致的SSL问题。


2

解决问题的方法:

https://rubygems.org/pages/download下载(Windows ZIP)

解压缩到一个目录并进入该目录,使用以下命令安装:ruby setup.rb(您可能需要管理员/ root权限)

对我来说它解决了问题。


0

在Ubuntu 22.04上,我不得不遵循这个家伙编写的修改脚本:https://deanpcmad.com/2022/installing-older-ruby-versions-on-ubuntu-22-04/

@MichaelHuelsen的答案指引了我正确的方向,并向我揭示了Dean安装提供的预编译版本中包含他的主目录路径。

因此,我自己编译了一份,并进行了一些调整,成功地在Ubuntu 22.04中安装了旧版本的Ruby。

这可能是对这个问题的一个轻微的离题,但仍然希望它能帮助任何为同样的原因而来到这里的人。

我的安装说明版本:

mkdir ~/.openssl
wget https://www.openssl.org/source/openssl-1.1.1g.tar.gz
tar zxvf openssl-1.1.1g.tar.gz
cd openssl-1.1.1g
./config --prefix=/home/$USER/.openssl/openssl-1.1.1g --openssldir=/home/$USER/.openssl/openssl-1.1.1g
make
make test
make install
rm -rf ~/.openssl/openssl-1.1.1g/certs
ln -s /etc/ssl/certs ~/.openssl/openssl-1.1.1g/certs
# Ruby 3.0
RUBY_CONFIGURE_OPTS=--with-openssl-dir=/home/$USER/.openssl/openssl-1.1.1g rbenv install 3.0.4
# Ruby 2.7
RUBY_CONFIGURE_OPTS=--with-openssl-dir=/home/$USER/.openssl/openssl-1.1.1g rbenv install 2.7.6
# Ruby 2.6
RUBY_CONFIGURE_OPTS=--with-openssl-dir=/home/$USER/.openssl/openssl-1.1.1g rbenv install 2.6.9
# Ruby 2.5 (No Longer Supported)
RUBY_CONFIGURE_OPTS=--with-openssl-dir=/home/$USER/.openssl/openssl-1.1.1g rbenv install 2.5.9
# Ruby 2.4 (No Longer Supported)
RUBY_CONFIGURE_OPTS=--with-openssl-dir=/home/$USER/.openssl/openssl-1.1.1g rbenv install 2.4.10

0

对我的情况:

错误

sudo gem install cocoapods 但是出错了:

ERROR:  SSL verification error at depth 0: ok (0)
ERROR:  Could not find a valid gem 'cocoapods' (>= 0), here is why:
          Unable to download data from https://ruby.taobao.org/ - SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (certificate rejected) (https://ruby.taobao.org/specs.4.8.gz)

原因

旧源代码无效(用于签名?)

解决方案

删除旧源代码,添加新的有效源代码

步骤

gem sources --remove https://ruby.taobao.org/
gem sources -a https://gems.ruby-china.com/

注意:

gem sources -l

可以检查当前源。


0

尽管提供了解决方法,但最好深入挖掘问题的根源。您的系统在受信任的CA池中缺少AlphaSSL中间证书。您需要更新计算机上的受信任CA根和中间证书。其中一个最好的来源是从Firefox拉取的{{link1:curl不断更新的CA证书存储}}。否则,您可以手动导入证书。


0
对我来说,我遇到了类似的错误。它告诉我需要安装我的公司证书文件。查看SSL错误,找到CN=-- 我认为这是“证书名称”。我在Mac OS上,所以我打开了“钥匙串访问”并导出了证书。
然后,要找到Ruby使用的证书位置,我运行了: ruby -ropenssl -e 'p OpenSSL::X509::DEFAULT_CERT_FILE' 在通过homebrew安装了openssl的Mac OS上,得出了这个结果:

/opt/homebrew/etc/openssl@1.1/cert.pem

当我查看这个文件时,我发现它实际上是另一个证书文件的符号链接。这是因为我正在使用 certifi Python 库(以及 pyenv)。在 openssl@1.1 目录中运行 l 命令会显示符号链接:

cert.pem -> ../../../../Users/<USERNAME>/.pyenv/versions/3.10.4/lib/python3.10/site-packages/certifi/cacert.pem

在将我的公司证书连接到原始证书文件后,我成功安装了 gem。我通过在 ~/.pyenv/versions/3.10.4/lib/python3.10/site-packages/certifi/ 目录下运行以下命令来实现:

cat ~/path/to/my/exported/cert/MyCompanyCert.pem cacert.pem > cacert.pem

这将公司证书追加到现有证书文件的末尾。Et voila。您可以放心地运行 gem install <package>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接