从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 回答
我添加了以下宝石,它对我有用 . 宝石'认证'
最后,它不是Rails问题,而是
google-api-client
gem问题 . 为了在Windows环境中工作,我们通过初始化文件从google api gem加载cacerts.pem
文件 .config/initializers/ga.rb
:这会将CA文件解析为
这不支持LetsEncrypt生成的SSL证书的SNI .