Ruby Net :: HTTP responde con OpenSSL :: SSL :: SSLError "verificación de certificado fallida" después de la renovación del certificado

Recientemente renovamos el certificado SSL de nuestro sitio, y ocurre lo siguiente en 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 mis búsquedas en Google y StackOverflow presentan respuestas que sugieren un problema con la instalación de Ruby, pero parecen estar relacionadas con versiones anteriores de Ruby y no creo que este sea el caso aquí. Esto es lo que he intentado:

brew updatebrew upgrade opensslrvm osx-ssl-certs update allrvm install ruby-2.3.1 --disable-binary --with-openssl-dir="$(brew --prefix openssl)" (No tenía esta versión antes)rvm requirementscrlrefresh rpv para purgar la caché CRL amplia del sistema OSX, según la sugerencia de Uzbekjon.

¿Cómo puedo resolver esto?

Notas:

El problema no ocurre en un contenedor Linux Docker recién instalado que tenga Ruby 2.2.3 desnudo. Entonces, tal vez sea algo relacionado con Mac OS o el almacenamiento en caché local SSL.Este problema podría haber existido antes de la renovación del certificado. No puedo estar seguro. Sin embargo, la renovación sí causó un problema similar con un tercero que estamos utilizando, como lo menciono enesta pregunta.Namecheap verificó que la instalación del certificado era correcta, los verificadores en línea muestran que todo funciona y todos los principales navegadores muestran que el certificado es válido.Solución

Con mucha ayuda de BoraMa, ahora está claro lo que estaba sucediendo. COMODO agregó una nueva raíz llamadaCOMODO RSA Certification Authority en lugar del anteriorCOMODO Certification Authority. La nueva raíz no se registró en el llavero de Mac, lo que causó este problema.

Una forma en que intentamos depurar esto fue ejecutando:

openssl s_client -connect www.mysite.com:443

Que mostró una advertenciaverify error:num=20:unable to get local issuer certificate. Esta advertencia no es un problema, ya queopenssl s_client no utiliza ningún certificado por defecto. Ejecutar lo siguiente pudo evitar la advertencia después de descargar el certificadode COMODO dentrocomodo.pem (índiceaquí):

openssl s_client -connect www.mysite.com:443 -CAfile comodo.pem

Sin embargo, esto no pudo y no afectó a la interfaz Ruby OpenSSL.Este artículo me hizo las cosas mucho más claras, y elScript médico SSL creado por su autor también fue útil, ya que confirmó la hipótesis. El artículo sugirió mirarOpenSSL::X509::DEFAULT_CERT_FILEque para mi fue/usr/local/etc/openssl/cert.pem. Ese archivo no existía en mi máquina, lo que significaba que el parche de Apple para OpendSSL estaba usando la aplicación Keychain. Por alguna razón, importandocomodo.pem en mi llavero y marcarlo como confiable basado enesta publicación no funcionó.

Entonces, la solución fue crear elcert.pem archivo de forma manual. Fui a la aplicación de llavero y exporté todos los certificados de raíz del sistema asystem_root.pem. Entonces:cat system_root.pem comodo.pem > cert.pem y moviendo ese archivo a/usr/local/etc/openssl/ Hizo el truco. CorriendoNet::HTTP.get en Ruby ya no falló.

Respuestas a la pregunta(3)

Su respuesta a la pregunta