找不到有效的gem:证书验证失败

fea*_*ool 6 ruby ssh openssl ruby-on-rails net-ssh

我正在尝试建立一个到远程服务器的ssh隧道,如下所述:从Heroku到Mysql Db的远程服务器的SSH

但我只是想下载宝石而挂断电话.我补充说:

# file: Gemfile
...
gem 'net-ssh-gateway', '~> 1.2.0'
Run Code Online (Sandbox Code Playgroud)

但是当我这样做bundle install(或者甚至只是gem install net-ssh在命令行上)时,我得到:

ERROR:  Could not find a valid gem 'net-ssh' (>= 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/latest_specs.4.8.gz)
Run Code Online (Sandbox Code Playgroud)

根据net-ssh的README(https://github.com/net-ssh/net-ssh),我检查了我的OpenSSL绑定Ruby - 看起来没问题:

$ ruby -ropenssl -e 'puts OpenSSL::OPENSSL_VERSION'
OpenSSL 1.0.1j 15 Oct 2014
Run Code Online (Sandbox Code Playgroud)

我不确定这是否相关,但是当我尝试下载.pem文件以获得gemfile的高安全性下载时:

$ curl -O https://raw.github.com/net-ssh/net-ssh/master/gem-public_cert.pem
Run Code Online (Sandbox Code Playgroud)

...它没有下载.pem文件,直接访问该URL会导致"未找到".

其他信息:

$ rake about
About your application's environment
Ruby version              2.1.4-p265 (x86_64-darwin14.0)
RubyGems version          2.2.2
Rack version              1.5
Rails version             4.1.7
Run Code Online (Sandbox Code Playgroud)

所以现在,我被困住了.有人认出这个问题吗?

mar*_*cik 12

当我遇到证书问题时,这有助于我的情况:

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
Run Code Online (Sandbox Code Playgroud)


fea*_*ool 6

尽管@the Tin Man的回答很有帮助,但我的问题是我没有在OpenSSL可以找到它们的地方设置证书.

以下SSL错误建议安装rubygems时,无法从'https://rubygems.org/中提取数据:

一个劣等的解决方法

可以通过更改Gemfile的第一行来解决这个问题

source 'https://rubygems.org'
Run Code Online (Sandbox Code Playgroud)

到非https表单:

source 'http://rubygems.org'
Run Code Online (Sandbox Code Playgroud)

然后按常规做bundle install.之后,您应该恢复Gemfile的第一行以使用https表单.这通常被认为是安全风险.

更重要的是,您还没有真正解决缺少有效证书的真正问题,如果您的应用程序调用使用OpenSSL(例如net-ssh),您将遇到麻烦.

更好的解决方案

请参阅SSL错误安装rubygems时,无法从"https://rubygems.org/"中提取数据.对于OS X用户,我们要求Ruby告诉我们它在哪里寻找证书文件,然后security find-certificate用来填充证书文件:

$ cert_file=$(ruby -ropenssl -e 'puts OpenSSL::X509::DEFAULT_CERT_FILE')
$ echo $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"
Run Code Online (Sandbox Code Playgroud)

在我这样做之后,我能够bundle install没有错误地打电话.