无法在Mac OS上安装任何ruby gems - SSL_connect错误

时间:2016-10-13 19:17:06

标签: ruby macos ssl rubygems

我的环境是Mac OS 10.10.5,ruby版本2.2.4(或2.2.2或2.2.0)gem(升级后)是2.6.7,rvm版本1.27.0。

即使在最近几天,这也有几个重复,但这比我在评论中提供的信息更多。

在任何版本的ruby上安装任何宝石时,我都会得到以下结果:

$ gem install bundler
ERROR:  Could not find a valid gem 'bundler' (>= 0), here is why:
          Unable to download data from https://rubygems.org/ - SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (https://api.rubygems.org/specs.4.8.gz)

有很多关于此的信息,特别是对于Windows上的问题。有关建议的解决方案,请参阅http://guides.rubygems.org/ssl-certificate-update/。我遵循这一点,但我继续得到同样的错误。

问题似乎在于将文件GlobalSignRootCA.pem放在适当的位置,这一点并不完全清楚。上面的链接解释了如何找到合适的ssl_certs目录,其中有2个在我的系统中,但都没有工作。

我忘了在哪里学到了以下内容:

$ ruby -ropenssl -e 'puts OpenSSL::X509::DEFAULT_CERT_DIR'
/etc/openssl/certs
$ ruby -ropenssl -e 'puts OpenSSL::X509::DEFAULT_CERT_FILE'
/etc/openssl/cert.pem

可能提供了一个提示但是将.pem文件附加到后者或复制到前者没有效果。

当我重新安装openssl(自制软件)时,它有用地告诉我:

A CA file has been bootstrapped using certificates from the system
keychain. To add additional certificates, place .pem files in
  /usr/local/etc/openssl/certs

and run
  /usr/local/opt/openssl/bin/c_rehash

但这也无法解决问题。

来自另一个SO问题:

rvm osx-ssl-certs update all

不起作用。也不是:

security find-certificate -a -p /Library/Keychains/System.keychain > "$cert_file"
security find-certificate -a -p /System/Library/Keychains/SystemRootCertificates.keychain >> "$cert_file"

有谁知道如何了解rubygems在这里的期望?它想要这个文件在哪里,或者甚至是它想要的文件?我应该将.pem文件导入OSX钥匙串吗?如何做到这一点?

或者有没有办法获取gem文件并在本地安装? rubygems对rubygems本身有帮助,但对于我能说的单个宝石却没有。

- 解决方法

好的 - 获取宝石的问题的答案:转到https://rubygems.org/gems/[package name]并选择版本并下载 - 目前位于右侧的链接下。下载文件和gem install --local [downloaded gem file]。加上所有依赖项。

自动化:

# start by adding insecure source for --explain - thanks to @tnum
gem source -a http://rubygems.org/
while read x 
do
wget https://rubygems.org/downloads/$x.gem
gem install --local $x.gem 
rm $x.gem
done < <(gem install --explain [package name] | grep "^  ")
# remove insecure source
gem source -r http://rubygems.org/

更好的grep regex可以缓解一些缺乏安全性的问题,但它仍然不安全。请注意wget https://有效,所以ssl问题肯定是rubygems。

3 个答案:

答案 0 :(得分:5)

根据https://rvm.io/support/fixing-broken-ssl-certificates,上面的运行命令可以解决您的问题:

rvm osx-ssl-certs update all

答案 1 :(得分:2)

我遇到了同样的问题并使用了以下“工作” - 进入您的rails app目录并运行以下

gem source -a http://rubygems.org/ 

当您运行'gem install ...'命令时,这将使用不安全的http连接而不是安全的https。这不是理想的,但它是一个短期的工作。

您可能还需要从

更改gemfile中的源代码行
source 'https://rubygems.org'

source 'http://rubygems.org'

答案 2 :(得分:1)

@ tnum的回答让我得到了我需要的东西而没有安全但我想解释这个问题。

我安装了ruby 2.3.1,并且该版本的所有功能都有效。我试图找出差异是什么,并想出了这个:

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

提出了两个答案。对于2.2.4,它似乎使用自己的目录/etc/openssl/,但对于2.3.1,它使用openssl version -d在我的计算机上/etc/local/etc/openssl/

我将文件cert.pem从后者复制到前者,现在gem工作在ruby 2.2.4上。

这些证书可能存在的选项太多了,这太混乱了。