2017-05-10 113 views
0

从rails控制台(或通常在rails环境中)运行针对SSL站点的get调用时,我得到SSL验证错误。Rails.application.initialize后导致SSL证书验证失败

OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=error: certificate verify failed 

我跟踪的整个Rails应用程序的初始化过程从开始到结束,从config.ru一路经过去,需要环境文件等

的SSL错误只有我跑Rails.application.initialize!后开始发生在config/environment.rb

我清除所有红宝石宝石从制度和只有从Gemfile安装的那些所以它不可能有前需要不同的宝石版/初始化过程之后。

我知道短期修复是将我的HTTPS调用设置为不验证其获得的证书,但由于生产环境中存在安全问题,这是不可能的。

这个问题似乎涉及到因为当我运行

openssl s_client -connect sub.domain.com:443 -showcerts -servername sub.domain.com 

获得正确的CERT SNI(服务器名称指示),但是当我运行

openssl s_client -connect sub.domain.com:443 -showcerts 

我得到一个证书sub2.domain.com这就是验证失败的原因。这是如何被Rails初始化进程改变的,如果有的话,是否有一个选项可以让rails使用SNI?

  • 滑轨v4.2.5.2
  • 红宝石2.3.3p222(2016年11月21日修订版56859)[x86_64的Linux的]
  • OS:Fedora的25
  • CA证书-2017年2月11日-1.1.fc25_2017.2.14-1.0.fc25.noarch.drpm:done
+0

SSL。我感到你的痛苦。你看过这个工具:https://github.com/mislav/ssl-tools/blob/8b3dec4/doctor.rb - 我发现它非常有帮助(我与开发者没有任何关系)。我也发现这个帖子特别有用:http://stackoverflow.com/questions/36966650/ruby-nethttp-responds-with-opensslsslsslerror-certificate-verify-failed/43769753#43769753。祝你好运! – jvillian

+0

谢谢,但不幸的是,这并没有帮助,因为这里的问题是,如果在IRB中运行但是在rails应用程序之后,相同的调用('HTTParty.get('https:// ...')')可以正常工作初始化它会导致此SSL错误。 – Killerpixler

回答

0

最后,这不是一个Rails问题,而是一个google-api-client宝石问题。为了在Windows环境下工作,我们通过初始化文件从google api gem加载cacerts.pem文件。

config/initializers/ga.rb

cert_path = Gem.loaded_specs['google-api-client'].full_gem_path+'/lib/cacerts.pem' 
ENV['SSL_CERT_FILE'] = cert_path 

这解决了CA文件

"/home/user/appname/vendor/bundle/ruby/2.3.0/gems/google-api-client-0.11.1/lib/cacerts.pem" 

而且不支持SNI由LetsEncrypt产生的SSL证书。

相关问题