“Falló la verificación del certificado” Error de OpenSSL al usar Ruby 1.9.3

Estoy usando Ruby 1.9.3p0 en Mac OS 10.6.8 (instalado usando rvm). Cuando bash crear una nueva aplicación de Rails usando una plantilla de aplicación alojada en GitHub , con esto (por ejemplo):

 $ rails new myapp -m https://github.com/RailsApps/rails3-application-templates/raw/master/rails3-mongoid-devise-template.rb -T -O

Recibo este mensaje de error:

  /Users/me/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/net/http.rb:799:in `connect ': SSL_connect 
 returned = 1 errno = 0 state = SSLv3 read server certificate B: certificate verify failed 
 (OpenSSL :: SSL :: SSLError)

Entiendo que el intérprete de idiomas de Ruby está usando OpenSSL para conectarse a GitHub y solicitar el archivo de la plantilla de la aplicación. GitHub requiere que todas las conexiones se realicen con SSL. La conexión falló porque OpenSSL no pudo verificar el certificado del servidor.

Pude resolver el problema descargando un archivo de certificados:

  $ cd / opt / local / etc / openssl
 $ sudo curl -O http://curl.haxx.se/ca/cacert.pem
 $ sudo mv cacert.pem cert.pem

No tuve problemas para usar Ruby 1.9.2. ¿Por qué recibí el problema “Certificate verify failed” para Ruby 1.9.3? ¿Es esto un error de Ruby 1.9.3? ¿Es específico para Mac OS 10.6.8? ¿Mi solución es la forma correcta de resolver esto?

Hay muchas partes móviles involucradas en la respuesta correcta. Depende de su sistema operativo, la versión de Ruby, la versión de OpenSSL, la versión de Rubygems. Terminé escribiendo un artículo después de investigarlo. Mi artículo explica los motivos del error, ofrece pasos para un diagnóstico posterior, muestra varias soluciones y sugiere posibles soluciones. Esto será útil:

Errores y Rails de OpenSSL: verificación de certificado fallida

También hay enlaces a las confirmaciones y problemas relevantes en GitHub.

Para mí, esto ocurrió en OS X con homebrew después de actualizar al último RVM (rvm 1.20.12) y luego instalar ruby-1.9.3-p429. Podría reproducir el problema simplemente ejecutando:

$ rvm use ruby-1.9.3-p429 $ irb 1.9.3p429 :001 > require 'open-uri'; open 'https://google.com' OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/net/http.rb:800:in `connect' from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/net/http.rb:800:in `block in connect' from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/timeout.rb:55:in `timeout' from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/timeout.rb:100:in `timeout' from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/net/http.rb:800:in `connect' from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/net/http.rb:756:in `do_start' from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/net/http.rb:745:in `start' from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/open-uri.rb:306:in `open_http' from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/open-uri.rb:775:in `buffer_open' from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/open-uri.rb:203:in `block in open_loop' from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/open-uri.rb:201:in `catch' from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/open-uri.rb:201:in `open_loop' from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/open-uri.rb:146:in `open_uri' from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/open-uri.rb:677:in `open' from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/open-uri.rb:33:in `open' from (irb):1 from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/bin/irb:16:in `
'1.9.3p429 :002 >

La solución fue similar a la de la pregunta, pero el camino fue incorrecto. Ejecutar esto lo solucionó:

 curl https://curl.haxx.se/ca/cacert.pem -o /usr/local/etc/openssl/cert.pem 

La pista sobre la ruta correcta fue que cuando estaba instalando ruby-1.9.3-p429 a través de RVM esto se muestra en la salida:

 Certificates in '/usr/local/etc/openssl/cert.pem' already are up to date. 

Tenía la ruta /usr/local/etc/openssl , pero no el archivo cert.pem en ese directorio, así que no estoy seguro de por qué RVM afirmó que los certificados estaban actualizados. Sería bueno saber por qué tuve que hacer esto en primer lugar, pero no tengo tiempo para investigar ahora.

Tuve el mismo problema al comstackr mi RVM Ruby con una instalación RVM de OpenSSL. Moví el archivo cacerts.pem tal como lo descargó el póster original en ~ / .rvm / usr / ssl / cert.pem para que el problema desaparezca.

Estaba teniendo el mismo problema.

La forma en que finalmente lo solucioné fue actualizando mi versión de OpenSSL que había instalado a través de MacPorts. Estaba ejecutando una versión de OpenSSL desde 2009, así que actualicé la instalación de mi MacPorts y luego actualicé mi instalación de OpenSSL a través de la interfaz de línea de comandos de los ports y el error desapareció.

Debe haber alguna integración entre Ruby / Rails y OpenSSL en instalaciones basadas en Mac, eso es evidente. En mi caso, estaba teniendo problemas para obtener el inicio de sesión con Facebook para que funcione correctamente cuando Facebook enviaba el token oAuth / Login a mi aplicación, Devise & OmniAuth debe haber necesitado un graph.facebook.com SSL válido para graph.facebook.com que no estaba en mi versión anterior de OpenSSL.

El directorio de certificación Openssl es /usr/lib/ssl/ en Debian. Entonces, seguir tres líneas fue suficiente para mí,

 $ cd /usr/lib/ssl/ $ sudo curl -O http://curl.haxx.se/ca/cacert.pem $ sudo mv cacert.pem cert.pem 

Posiblemente podría deberse a cómo construiste 1.9.2 y 1.9.3, tal vez sea cual sea la herramienta que utilizaste para construir cada una de las cosas configuradas de forma ligeramente diferente. O tal vez usan versiones diferentes de OpenSSL.

Este es el único cambio potencialmente relevante que pude detectar en Net: HTTP entre 1.9.2 y 1.9.3

  require 'net/protocol' -autoload :OpenSSL, 'openssl' require 'uri' +autoload :OpenSSL, 'openssl' 

(si quieres ver el diff …)

 git clone https://github.com/ruby/ruby.git
 cd ruby
 git diff origin / ruby_1_9_2 origin / ruby_1_9_3 - http.rb

Tuve un problema similar, pero no en Rails, sino solo en Ruby en Windows. Lo resolví utilizando el certificado cacert.pem y estableciendo la ubicación del certificado en la variable ambiental “SSL_CERT_FILE”

Respuesta detallada aquí: https://stackoverflow.com/a/35429863/4747587