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 updatebrew upgrade opensslrvm osx-ssl-certs update allrvm install ruby-2.3.1 --disable-binary --with-openssl-dir="$(brew --prefix openssl)" (Eu não tinha essa versão antes)rvm requirementscrlrefresh 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ção

Com 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.

questionAnswers(3)

yourAnswerToTheQuestion