vigencia verificar verificador validar tiene sitio seguridad saber gratis como certificado ruby api openssl certificate

ruby - verificador - verificar certificado ssl openssl



¿Por qué Ruby no puede verificar un certificado SSL? (2)

Esta es la primera vez que trato de usar la biblioteca XMLRPC :: Client para interactuar con una API remota y sigo recibiendo este error:

warning: peer certificate won''t be verified in this SSL session

Buscando alrededor he encontrado mucha gente que ha recibido ese error. Por lo general, es con certificados autofirmados y solo quieren que desaparezca, por lo que hacen algo sucio como el parche del mono de la misma manera en que XMLRPC :: Client abre su sesión http.

Primero asumí que esto era simplemente al cliente que no le importaba si el certificado era válido o no, así que continué mi búsqueda y encontré esta joya . Simplemente fuerza la verificación de todos los certificados SSL y arroja un error grave si no es posible también. Esto era exactamente lo que yo quería. Lo incluí, volví a ejecutar el código y ahora estoy obteniendo esto:

OpenSSL:SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

¡Por supuesto! ¡El certificado es malo! Pero comprobé solo para asegurarme de que ssoftclient integrado de openssl así:

openssl s_client -connect sub.example.com:443

y que obtengo:

CONNECTED(00000003) --- Certificate chain <snip> Verify return code: 0 (ok)

Entonces ahora llegamos a mi pregunta. OpenSSL (la versión de línea de comandos) dice que el certificado es bueno. OpenSSL (la biblioteca Ruby) no está de acuerdo. Todos mis navegadores web dicen que el certificado es bueno.

Algunos detalles adicionales que podrían ser de utilidad. El certificado es un comodín pero es válido para el dominio. El openssl s_client se ejecutó en la misma máquina segundos aparte del código de Ruby. Este es Ruby 1.8.7 p357 que está instalado con RVM.

¿Utiliza Ruby algo que no sea el paquete de CA provisto por el sistema operativo host? ¿Hay alguna manera de decirle a Ruby que use un paquete de CA específico o el del sistema?


Si solo está interesado en cómo hacer que Ruby se comporte de la misma manera que OpenSSL s_client o su navegador, puede saltar a la última sección, voy a cubrir la letra pequeña en lo que sigue.

De forma predeterminada, OpenSSL::X509::Store utilizada para realizar la conexión no utiliza ningún certificado de confianza. Según su conocimiento del dominio de la aplicación, normalmente alimentará una instancia de X509::Store con los certificados de confianza que sean relevantes para su aplicación. Hay varias opciones para esto:

  • La tienda # add_file toma una ruta hacia un certificado codificado en PEM / DER
  • La tienda # add_cert toma una instancia de X509 :: Certificado
  • La tienda # add_path toma una ruta a un directorio donde se pueden encontrar certificados de confianza

El enfoque del "navegador"

Esto está en contraste con los navegadores de aproximación, Java (cacerts) o Windows con su propio almacén interno de certificados de confianza, take. Allí el software está pre-equipado con un conjunto de certificados confiables que se consideran "buenos" en opinión del proveedor de software. En general, esta no es una mala idea, pero si realmente observa estos conjuntos, pronto notará que hay demasiados certificados. Un individuo realmente no puede decir si todos estos certificados deben ser confiables a ciegas o no.

El enfoque de Ruby

Los requisitos de su aplicación Ruby típica, por otro lado, son muy diferentes a los de un navegador. Un navegador debe poder permitirle navegar a cualquier sitio web "legítimo" que venga con un certificado TLS y se sirva a través de https. Pero en una aplicación típica de Ruby, solo tendrá que ocuparse de unos pocos servicios que usan TLS o que de otro modo requerirían la validación del certificado.

Y está el beneficio del enfoque Ruby: aunque requiere más trabajo manual, terminará con una solución hecha a la medida que confía exactamente en los certificados en los que debería confiar en el contexto de su aplicación. Esto es tedioso, pero la seguridad es mucho más alta de esta manera porque expone una superficie de ataque mucho menor. Tome los eventos recientes: si nunca tuvo que incluir DigiNotar o cualquier otra raíz comprometida en su conjunto de confianza, entonces no hay manera de que tales incumplimientos puedan afectarlo.

La desventaja de esto, sin embargo, como ya habrás notado, es que de forma predeterminada, si no agregas activamente certificados de confianza, la extensión de OpenSSL no podrá validar ningún certificado de igual. Para que todo funcione, debes configurar la configuración manualmente.

Este inconveniente ha dado lugar a una gran cantidad de medidas dudosas para eludirlo, y lo peor de todo es establecer globalmente OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE . Por favor no hagas esto Incluso hemos hecho bromas sobre la adición de código que permite que su aplicación falle al azar si nos encontramos con ese truco :)

Si la configuración de confianza manual parece demasiado complicada, ofreceré una alternativa fácil ahora que hace que la extensión de OpenSSL se comporte exactamente igual que los comandos de CLI de OpenSSL como s_client .

Por qué s_client puede verificar el certificado

OpenSSL utiliza un enfoque similar para navegadores y Windows. Una instalación típica incluirá un paquete de certificados de confianza en algún lugar de su disco duro (algo así como /etc/ssl/certs/ca-bundle.crt ) y esto servirá como el conjunto predeterminado de certificados de confianza. Ahí es donde se ve s_client cuando necesita verificar certificados de pares y por eso tu experimento fue exitoso.

Hacer que Ruby actúe como s_client

Si aún desea tener la misma comodidad al validar certificados con Ruby, puede indicarle que use el paquete OpenSSL de certificados de confianza, si está disponible en su sistema, llamando a OpenSSL::X509::Store#set_default_paths . Información adicional se puede encontrar here . Para usar esto con XMLRPC::Client , simplemente asegúrese de que se llame a X509::Store en el X509::Store que usa.


Si tiene un archivo de certificados ca, simplemente haga esto:

http.ca_file = <YOUR CA-CERT FILE PATH> http.verify_mode = OpenSSL::SSL::VERIFY_PEER http.verify_depth = 5