18

我使用 RVM 在 Ubuntu 12.04 上安装 Ruby 1.9.3

rvm pkg install openssl
rvm install 1.9.3 --with-openssl-dir=$rvm_path/usr

然后当我尝试按照以下方式运行时:

require 'open-uri'
open('https://www.google.com/')

我得到错误:OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

我该如何解决这个问题?我有很多类似的线程,人们在 OSX 中遇到这个问题,但是如何在 Ubuntu 中解决它?

谢谢你的帮助。

4

6 回答 6

25

如果未使用本机 OpenSSL 库正确设置默认的“OpenSSL 目录”,有时会发生这种情况。open-uri 用于OpenSSL::X509::Store#set_default_paths告诉 OpenSSL 在 OpenSSL 目录中查找包含 OpenSSL 默认信任的受信任根证书的文件。

在您的情况下,此查找失败。您可以通过设置一个覆盖默认设置并告诉 OpenSSL 改为查看该目录的环境变量来使其成功:

export SSL_CERT_FILE=/etc/pki/tls/cert.pem

这是我的 Fedora 16 64 位上根 CA 包的默认位置,其他常用位置是 /etc/ssl/ca-bundle.crt 等。在您的情况下,RVM 使用的 OpenSSL 库位于 $rvm_path/usr,所以你应该在那里寻找一个合适的默认根 CA 文件的候选者。环境变量设置正确后,调用open-uri就会成功。

要使环境变量永久化,请使用通常的方法,例如在 .bashrc、/etc/profile 或任何最适合您的情况下定义导出。

于 2012-05-24T00:27:53.187 回答
11

将“认证”gem 添加到您的 Gemfile。

更多信息:https ://rubygems.org/gems/certified

于 2013-03-05T18:52:17.170 回答
10

rvm 安装的 openssl 中缺少 cacert.pem 文件。

$ cd $rvm_path/usr/ssl
$ sudo curl -O http://curl.haxx.se/ca/cacert.pem
$ sudo mv cacert.pem cert.pem
于 2012-06-14T21:09:39.227 回答
5

请参阅http://jjinux.blogspot.nl/2012/02/ruby-working-around-ssl-errors-on-os-x.html作为您问题的替代答案,它应该适用于 Ubuntu 和 Mac OS X用户,它不需要更改环境变量。

来自上述链接的解决方案:

# config/initializers/fix_ssl.rb
# 
# Work around errors that look like:
#
#   SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError)

require 'open-uri'
require 'net/https'

module Net
  class HTTP
    alias_method :original_use_ssl=, :use_ssl=

    def use_ssl=(flag)
      # Ubuntu
      if File.exists?('/etc/ssl/certs')
        self.ca_path = '/etc/ssl/certs'

      # MacPorts on OS X
      # You'll need to run: sudo port install curl-ca-bundle
      elsif File.exists?('/opt/local/share/curl/curl-ca-bundle.crt')
        self.ca_file = '/opt/local/share/curl/curl-ca-bundle.crt'
      end

      self.verify_mode = OpenSSL::SSL::VERIFY_PEER
      self.original_use_ssl = flag
    end
  end
end
于 2013-01-07T15:45:41.023 回答
0

这现在对我有用。当我运行“brew doctor”时,事情开始起作用了,这让我找到了诸如“未设置 SSL_CERT_DIR”之类的线索

于 2015-09-11T17:53:14.610 回答
0

检查你的系统时钟!!

在长时间(1 周)未使用后,在虚拟机上出现此错误。更新我的系统时钟立即解决了这个问题。

如果您正在跑步,ntpd那么ntpdate -b -u pool.ntp.org将为您做到这一点。

于 2017-01-03T16:49:45.500 回答