安装RubyGems时出现SSL错误,无法从'https://rubygems.org/'获取数据。

277

我正在尝试完成Michael Hartl的教程。当我尝试在我的gemset中安装rails 3.2.14时,我遇到了以下问题:

 

$ gem install rails -v 3.2.14

   

错误:找不到有效的gem 'rails'(= 3.2.14),原因如下:

   

无法从https://rubygems.org/下载数据-SSL_connect返回= 1 errno = 0 state = SSLv3 read server certificate B:certificate verify failed (https://s3.amazonaws.com/production.s3.rubygems.org/specs.4.8.gz)

通过谷歌搜索,我发现可以使用非SSL源来获取rubygems,所以我运行了:

sudo gem sources -a http://rubygems.org

然后,当我再次尝试安装Rails时,成功了。但是,我仍然遇到了上述问题,但是作为警告:

警告:无法从 'https://rubygems.org/' 拉取数据:SSL_connect 返回=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (https://s3.amazonaws.com/production.s3.rubygems.org/specs.4.8.gz)

我应该如何完全解决这个警告/错误?

我正在使用以下工具:

  • rvm 1.22.15
  • ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin12.3.0]
  • OSX 10.8.5

这几乎看起来像是一个回归错误。我今天注意到我的一个学生在OS X上遇到了同样的问题。仍在解决这个问题。去年SO上也有其他相关的问题(相同的吗?)。 - vgoff
这是在过时的(2.0.*)版本的 rubygems 中已知的 bug。尝试更新到最新的 rubygems 版本:gem update --system,然后重新运行 gem install - Aleksei Matiushkin
如果可以更新您的Ruby版本,那么请更新它。这个问题在较新的Ruby版本中已经修复。 - Hong
在添加了http源之后,运行gem sources -r https://rubygems.org/对我来说是有效的(至少消除了警告)。 - BrainSlugs83
在Linux/Mac上,这个问题可以用一行代码解决,而不是写很多长的答案:https://dev59.com/M2Ik5IYBdhLWcg3wku9n#56993071 - laimison
26个回答

388

对于RVM和OSX用户

请确保您使用最新的rvm:

rvm get stable

那么你可以做两件事情:

  1. 更新证书:

    rvm osx-ssl-certs update all
    
  2. 更新RubyGems:

    rvm rubygems latest
    

对于非使用RVM的用户

查找证书的路径:

cert_file=$(ruby -ropenssl -e 'puts OpenSSL::X509::DEFAULT_CERT_FILE')

生成证书:

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

整个代码:https://github.com/wayneeseguin/rvm/blob/master/scripts/functions/osx-ssl-certs


对于非OSX用户

确保更新软件包ca-certificates(在旧系统上可能不可用,不要使用不再接收安全更新的旧系统)

Windows注意事项

Ruby Installer在Windows上的版本是由Luis Lavena准备的,证书路径将显示类似于C:/Users/Luis/...,请查看https://github.com/oneclick/rubyinstaller/issues/249获取更多详细信息,以及此答案https://dev59.com/M2Ik5IYBdhLWcg3wku9n#27298259进行修复。


运行 rvm rubygems latest 时出现了一个错误,抱怨缺少校验和。然而,即使没有这个也开始工作了...显然,如果需要的话,你可以用 --verify-downloads 1 强制执行它。有什么想法为什么会这样吗?它试图检索版本 rubygems-2.1.6 - Timo
rvm 在其代码中硬编码了下载的 md5 值,我刚刚将它们添加到“head”版本中,并将很快发布“stable”版本。 - mpapis
我还加入了一个 rvm get stable 的命令。 - Archit Baweja
2
我在Windows上运行它,得到了一个在我的电脑上甚至不存在的路径"C:/Users/Luis/Code/openknapsack/knap-build/var/knapsack/software/x86-windows/openssl/1.0.0k/ssl/cert.pem"。也没有叫Luis的用户。这是怎么回事? - isimmons
5
针对Mac Mojave用户出现“permission denied:/private/etc/ssl/cert.pem”错误的情况,有以下建议:
  1. 确认您有管理员权限并已正确输入密码。
  2. 如果是在终端中运行命令,请尝试使用sudo命令以管理员身份运行该命令。
  3. 检查cert.pem文件是否存在并且您具有访问权限。可以使用ls -l /private/etc/ssl/cert.pem命令来检查。
  4. 如果缺少证书,请尝试重新安装或更新openssl。
  5. 最后,您可以尝试更改cert.pem文件的所有者和权限,例如sudo chown root:wheel /private/etc/ssl/cert.pem,然后sudo chmod 644 /private/etc/ssl/cert.pem。
请根据实际情况选择适合您的解决方案。
- Chandrew
显示剩余9条评论

243

8
请确保以 .pem 扩展名保存,而不是 .pem.txt - Dan Dascalescu
3
如果不行怎么办?我按照你的答案做了,但是仍然出现了错误!1)我得到了文件AddTrustExternalCARoot-2048.pem,2)我将文件放到了C:\Ruby193\lib\ruby\1.9.1\rubygems\ssl_certs,3)我运行gem install susy,但还是出现了同样的错误:无法从 https://rubygems.org/ 下载数据 - SSL_connect 返回了=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed - Green
1
关于您提供的Luis Lavena链接,有一些注意事项。您可能希望从gem文件而不是他提到的zip文件中安装rubygems。我没有找到从未打包的gem或zip文件安装的命令。这里是Gem - https://rubygems.org/pages/download。命令是 - gem install --local C:\Downloads\rubygems-update-2.4.5.gem - Erran Morad
10
下载链接已失效。对于仍然面临此问题的用户,请参考Dheerendra的答案以获得解决方案。 - Llama.new
1
https://bundler.io/v2.0/guides/rubygems_tls_ssl_troubleshooting_guide.html#updating-ca-certificates 能够下载GlobalSignRootCA.pem并对我有用。其他参考资料请见 https://bundler.io/v2.0/guides/rubygems_tls_ssl_troubleshooting_guide.html#the-solutions - Bhaveshkumar
显示剩余2条评论

185

针对Windows用户

前往链接http://rubygems.org/pages/download下载最新的zip文件(我的是2.4.5版本)。

  1. 解压缩该文件。
  2. 在解压后的文件夹中运行“ruby setup.rb”。
  3. 现在可以运行 gem install 命令了。

9
Windows用户的最佳解决方案 - Sorin Haidau
1
这对我不起作用。Devkit与Windows 7上最新版本的Ruby不兼容。 - actual_kangaroo
1
@EruPenkman 可能尝试以下1或2个版本,或者使用2.4.5版本,因为我在win 7上使用它是可行的。 - Dheerendra Kulkarni
2
在我的Windows 10和Ruby 2.1.0上运行良好。谢谢! - MSC
1
工作得很好/Win 10,非常感谢! - Max
显示剩余7条评论

55

如果您想使用非SSL源,请先尝试删除HTTPS源,然后添加HTTP源:

sudo gem sources -r https://rubygems.org
sudo gem sources -a http://rubygems.org  

更新:

正如mpapis所述,这应该只被用作临时解决方案。如果您通过非SSL源访问RubyGems,可能会存在一些安全问题。

一旦不再需要这个解决方法,您应该恢复SSL源:

sudo gem sources -r http://rubygems.org
sudo gem sources -a https://rubygems.org

不要将其降级,因为这只是解决了当前的问题,但会使你的 Ruby 使用旧证书,这仍然是不好的。 - mpapis
1
我更新了答案,试图澄清这只是解决根本问题的权宜之计。只是试图解决Terin在尝试使用非SSL源时遇到的问题。 - Eduardo
5
我需要执行 sudo gem sources -r https://rubygems.org/sudo gem sources -r http://rubygems.org/ 命令。请注意末尾的 / 符号。 - Ross Rogers
是的,这是可能的。我认为这取决于源代码最初添加的方式。我的意思是,如果源代码是以尾随的“/”添加的,那么它也应该以尾随的“/”被删除。 - Eduardo
唯一对我有效的解决方案是下载这个该死的 gem。非常感谢! - Genarito

18

在Windows上,你需要使用 HTTP 源来更新 gem,然后再切换回使用 HTTPS

gem sources -r https://rubygems.org/
gem sources -a http://rubygems.org/
gem update --system
gem sources -r http://rubygems.org/
gem sources -a https://rubygems.org/

编辑:警告 我不确定这是否安全。有人知道ruby软件包是否已签名吗?接受的答案似乎是更好的解决方案。


感谢分享;暂时将https更改为http可以解决问题,但我需要直接更改gemfile。 - Noha Kareem
2
在我的情况下,我需要在 https URL 中添加一个尾随的 /。 - Alwyn Schoeman
1
作为对这个答案的更新,在开始之前最好做 gem sources -l 来查看更新系统之前和之后的源。如果更新失败,请在 --system 后面指定一个版本号。请参阅 https://rubygems.org/gems/rubygems-update/versions 或向同事询问 gem -v 报告的内容。 - Gary S. Weaver

11

适用于Windows用户(可能也适用于其他用户)

Rubygems.org提供了一份指南,不仅说明如何解决这个问题,还解释了为什么很多人会遇到这个问题:SSL证书更新 问题的原因是rubygems.org已经切换到更安全的SSL证书(SHA-2,使用256位加密)。Rubygems命令行工具捆绑了对正确证书的引用。因此,不能使用旧版本的rubygems来更新rubygems本身。必须手动先更新rubygems。

首先找出你有哪个版本的rubygems:

rubygems –v

根据您的版本是1.8.x、2.0.x还是2.2.x,您需要下载一个名为“rubygems-update-X.Y.Z.gem”的更新gem包,其中X.Y.Z是您需要的版本号。 运行1.8.x:下载链接:https://github.com/rubygems/rubygems/releases/tag/v1.8.30 运行2.0.x:下载链接:https://github.com/rubygems/rubygems/releases/tag/v2.0.15 运行2.2.x:下载链接:https://github.com/rubygems/rubygems/releases/tag/v2.2.3 安装更新gem包:
gem install –-local full_path_to_the_gem_file

运行更新 gem 命令:
update_rubygems --no-ri --no-rdoc

检查 RubyGems 是否已更新:

rubygems –v

卸载 update gem:

gem uninstall rubygems-update -x

在这一点上,你可能没问题。但是你可能没有新证书的最新公钥文件。要做到这一点:
https://rubygems.org/pages/download下载最新的证书(目前为AddTrustExternalCARoot-2048.pem)。 所有证书也位于:https://github.com/rubygems/rubygems/tree/master/lib/rubygems/ssl_certs 找出应该把它放在哪里:
gem which rubygems

将此文件放置在“rubygems\ssl_certs”目录下。

根据rubygems提交, 证书已移动到更具体的目录。因此,当前期望证书(AddTrustExternalCARoot-2048.pem)位于以下路径:lib/rubygems/ssl_certs/rubygems.org/AddTrustExternalCARoot-2048.pem


3
https://raw.githubusercontent.com/rubygems/rubygems/master/lib/rubygems/ssl_certs/AddTrustExternalCARoot-2048.pem 不再存在。 - Phil O

9

尝试使用宝石源网站,即rubygems.org。请使用http而不是https。这种方法不需要安装证书等任何工作。

示例 -

gem install typhoeus --source http://rubygems.org

这个可以运行,但是有一个注意点。
宝石已经安装了,但由于证书错误,文档没有安装。这里是我收到的错误信息。
Parsing documentation for typhoeus-0.7.0 WARNING: Unable to pull 
data from 'https://rubygems.org/': SSL_connect returned=1 errno=0 
state=SSLv3 read server certificate B: certificate verify failed 
(https://rubygems.org/latest_specs.4.8.gz)

7

gem update --system 对我有用。


6
这对我在Windows上也起作用了。我不得不暂时切换到经典HTTP,然后进行更新,然后再切换回SSL。 - Tom Mayfield
1
错误。SSL_connect返回=1 errno=0状态=SSLv3读取服务器证书B: 证书验证失败(https://api.rubygems.org/specs.4.8.gz) - Green
gem sources --remove https://rubygems.org/ gem sources -a http://rubygems.org gem update --system - Stefan Steiger

5

确保您的系统时钟正确

今天我在VirtualBox上运行的Ubuntu虚拟机上遇到了这个确切的错误。在注意到我从一个非常旧的挂起状态恢复后,我尝试了上面显示的大多数解决方案,发现我的时钟差了很多天。

立即更新时钟可以解决我的问题。以下是我在这种情况下使用的命令:

sudo service ntp stop && sudo ntpdate pool.ntp.org && sudo service ntp start


4

我只是简单地使用homebrew卸载和重新安装openssl,问题就得到了解决。

brew uninstall --force openssl

brew install openssl


1
使用更新版本的Homebrew,您可能需要这样运行命令: brew uninstall --ignore-dependencies openssl (相当于旧的force标志)。 - Batkins

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