Ruby и проблемы с OpenSSL

Доводилось ли вам при работе с Ruby видеть подобные ошибки?

openssl::ssl::sslerror: ssl_connect returned=1 errno=0 state=sslv3 read server certificate b: certificate verify failed

could not load openssl. you must recompile ruby with openssl support or change the sources in your gemfile from 'https' to 'http'. instructions for compiling with openssl using rvm are available at rvm.io/packages/openssl.

Дело в том, что при обращении к ресурсам, требующим SSL /TLS  подключение, Ruby использует библиотеку OpenSSL. Описанные выше ошибки возникают когда библиотеке не удается проверить подлинность сертификата на сервере, к которому делается запрос. Такая ситуация может возникнуть скажем при обращении к HTTPS ресурсу. Для решения проблемы необходимо обновить OpenSSL сертификат на своем локальном компьютере.

Решение для Windows

Проблема решается загрузкой сертификата cacert.pem  и настройкой переменных среды.

  1. Скачиваем файл cacert.pem  на свой компьютер, скажем в c:/ruby.
  2. Открыв терминал Windows, добавляем новую переменную среды set SSL_CERT_FILE=c:\ruby\cacert.pem.

Возможно придется перезагрузить систему чтобы изменения вступили в силу.

Решение для Ubuntu

В Ubuntu 12.04 обновление openssl 1.0.1-4ubuntu5 package  решает проблему с сертификатом. Более новые версии данной операционной системы не должны иметь рассматриваемой проблемы.

Универсальное решение

Для начала необходимо скачать все тот же файл cacert.pem . Если вы работаете с Ruby on Rails, то информацию о сертификате можно добавить прямо в код приложения. Например создадим новый инициализатор config/initializers/ssl_configuration.rb и добавим в него следующую строку:

ENV["SSL_CERT_FILE"] = "/path/to/your/cacert.pem"

Данное решение имеет право на жизнь, если приложение разрабатывается и используется на одном компьютере. В противном случае, лучше от него отказаться.