从rails控制台(或一般在rails环境中)对SSL站点运行get调用时,我收到SSL验证错误。
OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=error: certificate verify failed
我从头到尾跟踪整个rails应用程序初始化过程,一直从config.ru
开始,需要环境文件等。
仅在Rails.application.initialize!
config/environment.rb
后才会发生SSL错误
我清除了系统中的所有红宝石,只有Gemfile
中安装的宝石,所以在初始化过程之前/之后不可能有不同的宝石版本。
我知道短期修复是将我的HTTPS调用设置为不验证它正在获取的证书,但由于生产环境中的安全问题,这是不可能的。
当我运行
时,问题似乎与SNI(服务器名称指示)有关openssl s_client -connect sub.domain.com:443 -showcerts -servername sub.domain.com
我得到了正确的CERT,但是当我运行时
openssl s_client -connect sub.domain.com:443 -showcerts
我获得了sub2.domain.com
的证书,这就是验证失败的原因。如何通过Rails init进程改变这个问题,如果有的话,是否可以选择告诉rails使用SNI?
答案 0 :(得分: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"
这不支持LetsEncrypt生成的SSL证书的SNI。
答案 1 :(得分:0)
我添加了以下宝石,它对我有用。 宝石“认证”