OpenSSL::SSL::SSLError en Heroku [duplicado]
Frecuentes
Visto 21,827 equipos
23
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
2 Respuestas
41
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
7
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 ruby-on-rails heroku openssl omniauth or haz tu propia pregunta.
echa un vistazo a mi respuesta a continuación. Aún conserva la verificación. - Pavel Nikolov
@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. - Pavel Nikolov