Ruby Net :: HTTP responde com OpenSSL :: SSL :: SSLError “certificado de verificação falhou” após a renovação do certificado
Renovamos recentemente o certificado SSL do nosso site e o seguinte ocorre no Mac OS El Capitan 10.11.3:
require 'net/http'
Net::HTTP.get URI('https://www.google.com')
# => "<HTML>...</HTML>"
# The site whose certificate got renewed
Net::HTTP.get URI('https://www.example.com')
# => OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=error: certificate verify failed
Todas as minhas pesquisas no Google e StackOverflow apresentam respostas sugerindo um problema com a instalação do Ruby, mas elas parecem estar relacionadas a versões mais antigas do Ruby e não acho que seja esse o caso aqui. Aqui está o que eu tentei:
brew update
brew upgrade openssl
rvm osx-ssl-certs update all
rvm install ruby-2.3.1 --disable-binary --with-openssl-dir="$(brew --prefix openssl)"
(Eu não tinha essa versão antes)rvm requirements
crlrefresh rpv
para limpar o cache da CRL do sistema OSX, de acordo com a sugestão do Uzbekjon.Como posso resolver isto?
Notas:
O problema não ocorre em um contêiner do Linux Docker instalado recentemente que possui o Ruby 2.2.3. Portanto, talvez seja algo relacionado ao cache local do Mac OS ou SSL.Esse problema pode ter existido antes da renovação do certificado. Não sei ao certo. No entanto, a renovação causou um problema semelhante a um terceiro que estamos usando, conforme discutido emessa questão.A instalação do certificado foi verificada pela Namecheap como correta, os verificadores online mostram que tudo funciona e todos os principais navegadores mostram o certificado como válido.SoluçãoCom muita ajuda da BoraMa, agora está claro o que estava acontecendo. COMODO adicionou uma nova raiz chamadaCOMODO RSA Certification Authority
em vez do anteriorCOMODO Certification Authority
. A nova raiz não foi registrada nas chaves do Mac, causando esse problema.
Uma maneira de tentarmos depurar isso era executando:
openssl s_client -connect www.mysite.com:443
Que mostrou um avisoverify error:num=20:unable to get local issuer certificate
. Este aviso não é um problema, poisopenssl s_client
não usa nenhum certificado por padrão. A execução do seguinte foi capaz de impedir o aviso após o download do certificadode COMODO para dentrocomodo.pem
(índiceaqui):
openssl s_client -connect www.mysite.com:443 -CAfile comodo.pem
No entanto, isso não pôde e não afetou a interface do Ruby OpenSSL.Este artigo tornou as coisas muito mais claras para mim, e oScript médico SSL criado por seu autor também foi útil, pois confirmou a hipótese. O artigo sugeriu examinarOpenSSL::X509::DEFAULT_CERT_FILE
, o que para mim foi/usr/local/etc/openssl/cert.pem
. Esse arquivo não existia na minha máquina, o que significava que o patch da Apple para o OpendSSL estava usando o aplicativo Keychain. Por qualquer motivo, importarcomodo.pem
no meu chaveiro e marcá-lo como confiável com base emesta postagem não funcionou.
Portanto, a solução foi criar ocert.pem
arquivo manualmente. Fui ao aplicativo de chaves e exportou todos os certificados de raiz do sistema parasystem_root.pem
. Então:cat system_root.pem comodo.pem > cert.pem
e movendo esse arquivo para/usr/local/etc/openssl/
fez o truque. CorridaNet::HTTP.get
em Ruby não falhou mais.