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

我使用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?

谢谢你的帮助。

如果默认的“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中定义导出,或者在你的情况下最适合的东西。

从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 

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

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

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

这现在为我工作。 开始工作,当我跑“酿造医生”,这导致我的线索,如“未设置SSL_CERT_DIR”

检查你的系统时钟!

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

如果你运行的是ntpd那么ntpdate -b -u pool.ntp.org会为你做。