При попытке подключения через SSL в Rails мы получаем ошибку:
OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=error: certificate verify failed (unable to get local issuer certificate)
Существует ряд других статей StackOverflow, в которых описана та же ошибка, но наблюдаемый нами симптом совсем другой.
Когда мы запускаем тестовую команду в Ruby, она работает, но когда мы запускаем ту же команду, загруженную в среду Rails, мы получаем вышеуказанную ошибку.
Вот пример с выводом (в соответствии с рекомендациями bundler.io: https://bundler.io/v1.16/guides/rubygems_tls_ssl_troubleshooting_guide.html#troubleshooting-certificate-errors)
ruby:
oot@376dd015bcee:/usr/src/app# ruby -ropen-uri -e 'eval open("https://git.io/vQhWq").read'
Here's your Ruby and OpenSSL environment:
Ruby: 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]
RubyGems: 2.7.7
Bundler: 1.16.6
Compiled with: OpenSSL 1.1.0f 25 May 2017
Loaded version: OpenSSL 1.1.0f 25 May 2017
SSL_CERT_FILE: /usr/lib/ssl/cert.pem
SSL_CERT_DIR: /usr/lib/ssl/certs
With that out of the way, let's see if you can connect to rubygems.org...
Bundler connection to rubygems.org: success ✅
RubyGems connection to rubygems.org: success ✅
Ruby net/http connection to rubygems.org: success ✅
Hooray! This Ruby can connect to rubygems.org. You are all set to use Bundler and RubyGems. ?
(eval):136: warning: constant OpenSSL::SSL::SSLContext::METHODS is deprecated
рельсы:
root@376dd015bcee:/usr/src/app# RAILS_ENV=production bundle exec rails r 'eval open("https://git.io/vQhWq").read'
DEPRECATION WARNING: alias_method_chain is deprecated. Please, use Module#prepend instead. From module, you can access the original method using super. (called from require at /usr/local/lib/ruby/gems/2.5.0/gems/bundler-1.16.6/lib/bundler/runtime.rb:81)
no value for ELK DNS -
Expected string default value for '--serializer'; got true (boolean)
Here's your Ruby and OpenSSL environment:
Ruby: 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]
RubyGems: 2.7.7
Bundler: 1.16.6
Compiled with: OpenSSL 1.1.0f 25 May 2017
Loaded version: OpenSSL 1.1.0f 25 May 2017
SSL_CERT_FILE: /usr/lib/ssl/cert.pem
SSL_CERT_DIR: /usr/lib/ssl/certs
With that out of the way, let's see if you can connect to rubygems.org...
Bundler connection to rubygems.org: success ✅
RubyGems connection to rubygems.org: success ✅
Ruby net/http connection to rubygems.org: failed ❌
Unfortunately, this Ruby can't connect to rubygems.org. ?
Your Ruby can't connect to rubygems.org because you are missing the certificate files OpenSSL needs to verify you are connecting to the genuine rubygems.org servers.
Несколько других моментов:
- Это стандартный контейнер док-станции ruby с Amazon Linux AMI
- SSL_CERT_FILE
/usr/lib/ssl/cert.pem
не существует, однако SSL_CERT_DIR существует исодержит все необходимые сертификаты.
Почему это работает для Ruby, а не для Rails?