OpenSSL :: SSL :: SSLError en Heroku

Estoy intentando autenticar a un usuario a través de Facebook o Twitter, hacer que complete su información, y luego hacer clic en guardar (creando así un registro de usuario). Recibo un error de OpenSSL en ese último paso, luego 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 de ellas funciona. Aquí hay algunas cosas que he intentado:

1) Instalar la gem certified

2) Actualizando la gem Heroku a la v2.30, empujando 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 cert no existe realmente. 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 que ya 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.

Actualización: agregué esta línea al inicializador Omniauth, y ahora “funciona”. Por lo tanto, he diagnosticado que el problema es con Omniauth. Sin embargo, me gustaría tener la verificación SSL … esto obviamente deja un vacío de seguridad.

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

Después de buscar aquí, es lo que encontré:

Si está usando Ruby para abrir conexiones a un servidor externo a través de https, ej. la API Graph de Facebook, puede aparecer 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 (CA Certs) utilizados para verificar la autenticidad de los servidores web seguros. La solución es descargar este ca-bundle.crt en el directorio lib/ su aplicación: A continuación, 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 obligar 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

ACTUALIZAR:

Puede necesitar usar self.ca_path= lugar de self.ca_file= dependiendo de su sistema.

Parece que tienes la configuración de openssl correcta en OmniAuth, pero quizás tu ruta de certificaciones de CA no es correcta.

Puede verificar eso en sus servidores heroku ejecutando:

 heroku run bash 

… y luego ejecuta openssl para mostrar la ruta correcta:

 $ 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é tu código para que coincida.