OpenSSL :: SSL :: SSLError:SSL_connect返回= 1 errno = 0状态= SSLv3读取服务器证书B:证书验证失败

时间:2012-05-23 21:54:38

标签: ruby-on-rails ubuntu ssl openssl rvm

我使用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中解决它?

感谢您的帮助。

6 个答案:

答案 0 :(得分: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中定义导出或在您的情况下最适合的任何方式。

答案 1 :(得分: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

答案 2 :(得分:9)

添加'认证'宝石到你的Gemfile。

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

答案 3 :(得分:4)

请参阅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

答案 4 :(得分:0)

现在这对我有用。当我跑步时开始工作的事情"酿造医生",这让我得到线索,例如"取消设置SSL_CERT_DIR"

答案 5 :(得分:0)

检查系统时钟!!

长时间(1周)后在虚拟机上发生此错误而不使用。更新系统时钟可以立即解决问题。

如果您正在运行ntpd,则ntpdate -b -u pool.ntp.org会为您执行此操作。