首页 文章

Rails.application.initialize之后Rails ssl证书验证失败

提问于
浏览
0

从rails控制台(或通常在rails环境中)对SSL站点运行get调用时,我收到SSL验证错误 .

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

我从头到尾跟踪了整个rails应用程序初始化过程,从 config.ru 一直到需要环境文件等 .

我在 config/environment.rb 中运行 Rails.application.initialize! 后才开始发生SSL错误

我清除了系统中的所有红宝石,只有_480791中安装的宝石,所以在初始化过程之前/之后不可能有不同的宝石版本 .

我知道短期修复是将我的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?

  • Rails v4.2.5.2

  • ruby 2.3.3p222(2016-11-21修订版56859)[x86_64-linux]

  • 操作系统:Fedora 25

  • ca-certificates-2017.2.11-1.1.fc25_2017.2.14-1.0.fc25.noarch.drpm:完成

2 回答

  • 0

    我添加了以下宝石,它对我有用 . 宝石'认证'

  • 0

    最后,它不是Rails问题,而是 google-api-client gem问题 . 为了在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 .

相关问题