我使用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
会为你做。