Сообщение об ошибке
state=error: certificate verify failed (self-signed certificate in certificate chain)
Также выводится как
- OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 peeraddr=127.0.0.1:8443 state=error: certificate verify failed (self-signed certificate in certificate chain)
Полное сообщение: «SSL_connect returned=1 errno=0 peeraddr=<ip>:<port> state=error: certificate verify failed (self-signed certificate in certificate chain)». Сборки Ruby на базе OpenSSL 1.1.1 пишут «self signed» без дефиса.
Ruby openssl (Net::HTTP, Faraday, RubyGems) — OpenSSL::SSL::SSLError from SSL_connect
Что это означает
Цепочка сервера заканчивается самоподписанным корневым сертификатом, которому не доверяет OpenSSL в Ruby. Для публичных хостов вроде rubygems.org это означает, что соединение переподписывает прокси или антивирус с инспекцией TLS; для внутренних хостов — что в хранилище, которым пользуется Ruby, нет корневого сертификата компании.
Почему это происходит
Прокси с инспекцией TLS
частоКорпоративные прокси переподписывают rubygems.org, GitHub и API собственным корневым сертификатом; в хранилище OpenSSL, которым пользуется Ruby, его нет.
Внутренний сервис с частным корневым сертификатом в цепочке
частоСервер отправляет корневой сертификат, но на клиенте он не установлен.
Ruby использует другой пакет сертификатов, не системный
иногдаСборки Ruby, установленные через rbenv/asdf с OpenSSL из Homebrew, и RubyInstaller в Windows используют собственный пакет сертификатов CA.
Как исправить
- 1.
Определите корневой сертификат
Выведите цепочку для публичного хоста; доверять нужно корневому сертификату, названному по имени вашей компании или поставщика средств защиты.
bash openssl s_client -connect rubygems.org:443 -servername rubygems.org -showcerts </dev/null 2>/dev/null \ | grep -E '^ *[0-9]+ s:|^ *i:' - 2.
Укажите в SSL_CERT_FILE файл с объединённым пакетом сертификатов
Объедините публичные корневые сертификаты с корневым сертификатом прокси, потому что SSL_CERT_FILE заменяет пакет сертификатов по умолчанию.
bash # Public roots + the proxy root in one bundle cat /etc/ssl/certs/ca-certificates.crt corp-proxy-root.pem > ~/.config/corp-ca-bundle.pem export SSL_CERT_FILE=~/.config/corp-ca-bundle.pem - 3.
Установите корневой сертификат на уровне системы (Linux)
Сборки Ruby, слинкованные с системным OpenSSL, подхватывают такой корневой сертификат после update-ca-certificates.
bash sudo cp corp-proxy-root.pem /usr/local/share/ca-certificates/corp-proxy-root.crt && sudo update-ca-certificates
Связанные ошибки
state=error: certificate verify failed (unable to get local issuer certificate)Ruby openssl (Net::HTTP, Faraday, HTTParty, RubyGems)Could not verify the SSL certificate for https://gems.example.com/.Bundlercurl: (60) SSL certificate problem: self-signed certificate in certificate chaincurl (OpenSSL backend)