OpenSSL::SSL::SSLError en Heroku [duplicado]

Estoy tratando de autenticar a un usuario a través de Facebook o Twitter, hacer que completen su información y luego hacer clic en guardar (creando así un registro de usuario). Recibo un error de OpenSSL en ese paso final, después de hacer clic en Guardar. Esto sucede en el método Devise RegistrationsController#create.

Así que recibo este error en mi aplicación Rails, alojada en Heroku:

2012-07-28T18:25:13+00:00 app[web.1]: OpenSSL::SSL::SSLError (SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed)

He visto muchas soluciones, ninguna funciona. Aquí hay algunas cosas que he probado:

1) Instalación del certified joya

2) Actualizar la gema Heroku a v2.30, presionando nuevamente

3) Esto:

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :twitter, TWITTER_KEY, TWITTER_SECRET, {:client_options => {:ssl => {:ca_file => "/usr/lib/ssl/certs/ca-certificates.crt"}}}
  provider :facebook, FACEBOOK_KEY, FACEBOOK_SECRET, {:scope => "publish_actions,user_location,email", :client_options => {:ssl => {:ca_file => "/usr/lib/ssl/certs/ca-certificates.crt"}}}
end

Parece que un problema podría ser que este archivo de certificado en realidad no existe; lo he visto en varios lugares y parece que esa es la ruta predeterminada al archivo ca_cert para Heroku, pero podría estar equivocado.

Por extraño que parezca, esto está sucediendo después de Ya me he autenticado a través de FB/Twitter y estoy tratando de crear una cuenta de usuario. ¿Por qué sería esto y cómo puedo resolver/depurar esto? Sinceramente confundido.

Actualizar: Agregué esta línea al inicializador de Omniauth y ahora "funciona". Por lo tanto, he diagnosticado que el problema es con Omniauth. Sin embargo, todavía me gustaría tener la verificación SSL... esto obviamente deja una brecha de seguridad.

OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE

preguntado el 28 de julio de 12 a las 19:07

echa un vistazo a mi respuesta a continuación. Aún conserva la verificación. -

@Simone Carletti marcó esta pregunta como duplicada, pero no lo es. La otra pregunta es sobre problemas para actualizar Ruby Gems y esta es por no poder llamar a servicios https:// de terceros desde Heroku. -

2 Respuestas

Después de buscar un poco aquí está lo que encontré:

Si está utilizando Ruby para abrir conexiones a un servidor externo a través de https, p. la API Graph de Facebook, es posible que te encuentres con el siguiente error:

OpenSSL::SSL::SSLError:SSL_connectreturned=1errno=0state=SSLv3readservercertificateB:certificateverifyfailed

Este error se debe a que Ruby no pudo encontrar los certificados de la autoridad de certificación (certificados de CA) utilizados para verificar la autenticidad de los servidores web seguros. La solución es descargar este ca-bundle.crt en su aplicación lib/ directorio: luego agregue el siguiente código a config/initializers/fix_ssl.rb:

require 'open-uri'
require 'net/https'

module Net
  class HTTP
    alias_method :original_use_ssl=, :use_ssl=

    def use_ssl=(flag)
      self.ca_file = Rails.root.join('lib/ca-bundle.crt').to_s
      self.verify_mode = OpenSSL::SSL::VERIFY_PEER
      self.original_use_ssl = flag
    end
  end
end

Esto debería forzar a Ruby a usar el paquete CA del directorio lib/ de su aplicación.

Tomado de: http://jimneath.org/2011/10/19/ruby-ssl-certificate-verify-failed.html

ACTUALIZACIÓN:

Puede que necesite utilizar self.ca_path= en lugar de self.ca_file= dependiendo de su sistema.

Respondido el 07 de junio de 13 a las 14:06

Intenté esto y no funcionó. ¿Cómo se mantiene actualizado el archivo .crt? - red

Tienes que mantenerlo actualizado manualmente. Si está alojando en Heroku, creo que puede usar su archivo CA /usr/lib/ssl/certs/ca-certificates.crt - pavel nikolov

Trabajó para mí en Heroku usando /usr/lib/ssl/certs/ca-certificates.crt - ¡gracias! - Todd

Esto funcionó para mí en Windows 7 usando el código exacto publicado. - Nicola Peluchetti

Acabo de empezar a recibir este error en Heroku: nada ha cambiado en mi aplicación... Probé la solución de Pavel con self.ca_path y self.ca_file y la ruta cableada a los certificados, no funcionó para mí. Estoy usando Ruby 1.9.3 y Rails 3.2.12. La versión de OpenSSL es OpenSSL 0.9.8k del 25 de marzo de 2009. ¿Alguna otra idea? - craic.com

Parece que tiene la configuración de openssl correcta en OmniAuth, pero tal vez su ruta de certificados de CA no sea correcta.

Puede verificar eso en sus servidores heroku ejecutando:

heroku run bash

... y luego ejecutar openssl para mostrar la ruta adecuada:

$ openssl version -a
OpenSSL 1.0.0e 6 Sep 2011
OPENSSLDIR: "/usr/lib/ssl"

... Debería encontrar el archivo ca_certificates.crt en $OPENSSLDIR/certs/ca-certificates.crt

Confirmaría esa ruta y actualizaría su código para que coincida.

Respondido 30 Jul 12, 22:07

Sí, los certificados CA están ahí... (en /usr/lib/ssl/certs). Gracias por heroku run bash.. no sabia de eso - Varatis

¿Es esto algo que requiere Omniauth, o cada solicitud externa? Tal vez ese sea el problema... ¿Estoy haciendo otra solicitud externa que no funciona? - Varatis

Sí, ¿puede proporcionar más contexto de sus registros sobre dónde arroja el error SSL? ¿Quizás un rastro de pila? - Winfield

Desafortunadamente, eso es todo lo que me dio hasta ahora, intentaré establecer el nivel de depuración más alto y se lo haré saber. Pero también, verifique la actualización, es algo útil. - Varatis

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.