ruby-on-rails - google - rails devise omniauth facebook
Cómo deshacerse de OpenSSL:: SSL:: SSLError (7)
Estoy intentando autenticar usuarios con Facebook usando OmniAuth. Inicialmente, estaba funcionando, pero en el camino simplemente dejó de funcionar y comenzó a darme este mensaje de error:
OpenSSL :: SSL :: SSLError SSL_connect returned = 1 errno = 0 state = SSLv3 read server certificate B: certificate verify failed
El mismo código funciona bien para Twitter y no puedo entender por qué no funciona para Facebook. He buscado ayuda en línea, pero no he tenido éxito.
Este es el enlace al sitio web que estoy construyendo: http://www.bestizz.com/
Y esta url le daría el mensaje de error: http://www.bestizz.com/auth/facebook
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 = "/etc/pki/tls/certs/ca-bundle.crt" # for Centos/Redhat
self.verify_mode = OpenSSL::SSL::VERIFY_PEER
self.original_use_ssl = flag
end
end
end
Nota:
Muchos sistemas operativos ya vienen con un paquete de certificados suministrado. Por ejemplo, en Red Hat Enterprise Linux y CentOS está instalado en:
/etc/pki/tls/certs/ca-bundle.crt
Para Ubuntu está en:
/etc/ssl/certs/ca-certificates.crt
Este enlace debería funcionar. https://gist.github.com/fnichol/867550 Solo sigue las instrucciones. Deberá descargar el instalador de Rails y ejecutar dos funciones de línea de comando.
Haga esto, obtendrá el error de certificado con openssl
sudo curl http://curl.haxx.se/ca/cacert.pem -o /opt/local/etc/openssl/cert.pem
He estado enfrentando el mismo problema después de actualizar Ruby ejecutando en Yosemite, pero al intentar autenticar con Google.
Después de esto: https://toadle.me/2015/04/16/fixing-failing-ssl-verification-with-rvm.html
pareció resolver mi problema.
Por el bien de la historia citaré:
Entonces, el ruby instalado por el rvm busca en el directorio incorrecto los certificados, mientras que el OSX-ruby buscará en el correcto. En su caso, es un directorio de sistema OSX.
Entonces el rubí instalado por el rvm es el problema.
Esta discusión sobre Github finalmente dio la solución: de alguna manera, RVM viene con una versión precompilada de ruby que está enlazada estáticamente contra un openssl que examina / etc / openssl para sus certificados.
Lo que quieres hacer es NO UTILIZAR ninguno de los rubíes precompilados y compilar Ruby en tu máquina local, así: rvm install 2.2.0 --disable-binary
Al final, tuve que correr:
rvm uninstall ruby-2.2.4
rvm install ruby-2.2.4 --disable-binary
gem pristine --all
Espero que esto ayude
Parece que la verificación SSL está fallando para Facebook. No soy maestro de OpenSSL, pero creo que esto debería funcionar para ti.
Asumiendo que estás usando una versión actualizada de OmniAuth (> = 0.2.2, supongo que lo eres) y una versión de Faraday> = 0.6.1 (el seguimiento de la pila dice que eres), puedes pasar la ubicación de su paquete de certificados de CA. Modifique su configuración de OmniAuth para Facebook en consecuencia:
Rails.application.config.middleware.use OmniAuth::Builder do
provider :facebook, ''appid'', ''appsecret'', {:scope => ''publish_stream,email'', :client_options => {:ssl => {:ca_path => ''/etc/ssl/certs''}}}
# other providers...
end
y reemplace ''/etc/ssl/certs''
con la ruta a su paquete. Si necesita uno, creo que este archivo funcionará para usted; simplemente colóquelo en algún lugar, asígnele los permisos necesarios y apúntele su aplicación.
Gracias a Alex Kremer en esta respuesta SO por las instrucciones detalladas.
Ruby no puede encontrar ningún certificado raíz. Aquí hay una opción para propósitos de depuración . Ponga el siguiente código al comienzo de su script:
require ''openssl''
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
Una fea solución que acabo de hacer es anular la clase en Net :: HTTP y establecer la variable que le dice que no verifique los certificados SSL:
require ''net/http''
require ''openssl''
class Net::HTTP alias_method :origConnect, :connect
def connect
@ssl_context.verify_mode = OpenSSL::SSL::VERIFY_NONE
origConnect
end
end
Lo hice de esta manera porque no quiero ensuciar con el código fuente de la gema que llama a la gema que llama a la gema que llama a Net :: HTTP. Realmente debería volver y descubrir cómo empujarlo para mirar un archivo cacert.pem separado en su lugar. No puedo modificar el archivo cacert.pem del servidor, o esa sería la mejor ruta.