SSL_connect devuelto = 1 errno = 0 estado = SSLv3 lee el certificado del servidor B: la verificación del certificado falló

281

Estoy usando Authlogic-Connect para inicios de sesión de terceros. Después de ejecutar las migraciones apropiadas, los inicios de sesión de Twitter / Google / yahoo parecen funcionar bien, pero el inicio de sesión de Facebook arroja una excepción:

SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

El registro de desarrollo muestra

OpenSSL::SSL::SSLError (SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed):
  app/controllers/users_controller.rb:37:in `update'

Por favor recomiende..

Vikash
fuente
2
¿Esto ayuda: stackoverflow.com/q/3977303/382818
Zabba
Aquí está la mejor solución que pude encontrar hasta ahora stackoverflow.com/a/16983443/11792
Pavel Nikolov

Respuestas:

138

Me encontré con un problema similar al intentar usar el generador JQuery para Rails 3

Lo resolví así:

  1. Obtenga el paquete CURL Certificate Authority (CA). Puedes hacer esto con:

    • sudo port install curl-ca-bundle [si está utilizando MacPorts]
    • o simplemente tire hacia abajo directamente wget http://curl.haxx.se/ca/cacert.pem
  2. Ejecutar el código de rubí que está tratando de verificar la certificación SSL: SSL_CERT_FILE=/opt/local/etc/certs/cacert.pem rails generate jquery:install. En su caso, desea establecer esto como una variable de entorno en algún lugar donde el servidor lo recoge o agregar algo como ENV['SSL_CERT_FILE'] = /path/to/your/new/cacert.pemen su archivo environment.rb.

También se puede simplemente instalar los archivos de CA (no he probado este) para el sistema operativo - hay largas instrucciones aquí - esto debería funcionar de una manera similar, pero no he probado esto personalmente.

Básicamente, el problema que está enfrentando es que algunos servicios web están respondiendo con un certificado firmado contra una CA que OpenSSL no puede verificar.

Erik G.
fuente
1
Esto también funcionó para mí al intentar conectarme a mi cuenta de gmail usando Ruby Net :: IMAP desde un script de ruby. Gracias.
Jignesh Gohel
44
Sí, esto funciona bien en ruby-1.9.3. Lo agregué a mi configuración bash. export SSL_CERT_FILE=/usr/local/etc/openssl/certs/cert.pem
andersjanmyr
55
No tenía / usr / local / etc / openssl locales, por lo que corrí sudo curl http://curl.haxx.se/ca/cacert.pem >> /usr/local/etc/cacert.pemseguido por export SSL_CERT_FILE=/usr/local/etc/cacert.pem
Lilith río
44
Desarrollando en mi Mac, acabo de agregar SSL_CERT_FILE=/usr/local/etc/openssl/cert.pemal .envarchivo de mi aplicación y listo, todo feliz.
Dave Sag
8
Aprecio la ironía de usar wget para descargar certificados curl.
Trey
135

Si está utilizando RVM en OS X, probablemente necesite ejecutar esto:

rvm osx-ssl-certs update all

Más información aquí: http://rvm.io/support/fixing-broken-ssl-certificates

Y aquí está la explicación completa: https://github.com/wayneeseguin/rvm/blob/master/help/osx-ssl-certs.md


Actualizar

En Ruby 2.2, es posible que deba reinstalar Ruby desde el origen para solucionar esto. Así es como (reemplace 2.2.3con su versión Ruby):

rvm reinstall 2.2.3 --disable-binary

Crédito a https://stackoverflow.com/a/32363597/4353 e Ian Connor .

htanata
fuente
2
Aquí hay un artículo mucho más completo con alternativas: railsapps.github.io/openssl-certificate-verify-failed.html
Peter P.
ERROR: se ha eliminado la actualización de rvm. Ver 'rvm get' y rvm 'rubygems' CLI API en su lugar
yang
@ user432506 ¿Cómo obtuvo ese error? Estoy usando el último RVM estable y todavía funciona.
htanata
44
Esto funcionaría por un tiempo, luego fallará para mí. Lo que funcionó para mí se estaba ejecutando, rvm reinstall 2.2.0 --disable-binarypero luego tienes que agrupar la instalación y comenzar de cero.
Ian Connor
2
Este fue un gran salvavidas y debería ser la respuesta aceptada.
Siraris
129

Así es como puede solucionarlo en Windows: https://gist.github.com/867550 (creado por Fletcher Nichol)

Extracto:

La forma manual (aburrida)

Descargue el cacert.pemarchivo de http://curl.haxx.se/ca/cacert.pem . Guarda este archivo en C:\RailsInstaller\cacert.pem.

Ahora haga que Ruby conozca su paquete de autoridad de certificación mediante la configuración SSL_CERT_FILE. Para configurar esto en su sesión actual de símbolo del sistema, escriba:

set SSL_CERT_FILE=C:\RailsInstaller\cacert.pem

Para hacer esto una configuración permanente, agregue esto en su panel de control .

ryanjones
fuente
66
Gracias. Esto es excepcionalmente útil y también muy simple.
John
La solución anterior no me ayudó. Esta es una mejor guía para Windows: stackoverflow.com/questions/5720484/…
Sprachprofi
@Sprachprofi La solución a la que se ha vinculado solo funcionará para un proyecto de 1 riel a la vez (ya que está apuntando directamente a ese certificado). La esencia a la que me he vinculado (creada por Fletcher Nichol) le permitirá cubrir cada proyecto / gema que esté buscando un certificado.
ryanjones
31

Ruby no puede encontrar ningún certificado raíz en el que confiar.

Eche un vistazo a esta publicación de blog para encontrar una solución: " Ruby 1.9 y el error SSL ".

La solución es instalar el curl-ca-bundlepuerto que contiene los mismos certificados raíz utilizados por Firefox:

sudo port install curl-ca-bundle

y dile a tu httpsobjeto que lo use:

https.ca_file = '/opt/local/share/curl/curl-ca-bundle.crt'

Tenga en cuenta que si desea que su código se ejecute en Ubuntu, debe establecer el ca_pathatributo en su lugar, con la ubicación predeterminada de los certificados /etc/ssl/certs.

martoche
fuente
8
Esto parece suceder también en Windows, en cuyo caso la solución recomendada allí no funcionará.
Bob Aman
24

La razón por la que obtiene este error en OSX es el ruby ​​instalado por rvm.

Si se encuentra con este problema en OSX, puede encontrar una explicación realmente amplia en esta publicación de blog:

http://toadle.me/2015/04/16/fixing-failing-ssl-verification-with-rvm.html

La versión corta es que, para algunas versiones de Ruby, RVM descarga binarios precompilados, que buscan certificados en la ubicación incorrecta. Al obligar a RVM a descargar la fuente y compilar en su propia máquina, se asegura de que la configuración de la ubicación del certificado sea correcta.

El comando para hacer esto es:

rvm install 2.2.0 --disable-binary

Si ya tiene la versión en cuestión, puede reinstalarla con:

rvm reinstall 2.2.0 --disable-binary

(obviamente, sustituya su versión ruby ​​según sea necesario).

paulmorar
fuente
Esto funcionó para mí. La publicación de blog a la que apunta también es útil, ¡gracias!
Cristian
2
Esto funcionó para mí en El Capitán. Implosioné rvm (implosión rvm). Instalado nuevamente con \curl -sSL https://get.rvm.io | bash -s stable --autolibs=homebrewy luego rvm install <ruby-version> --disable-binary En un momento también lo hice, rvm get headya que estos son algunos problemas de vanguardia.
rylanb
Solo esta solución funcionó para mí, porque originalmente tenía Ruby 2.0.0 en El Capitan y, por alguna razón, la versión anterior no funcionaba incluso con la correcta SSL_CERT_FILE. Después rvm install 2.2.0 --disable-binary, el problema se resolvió.
laimison
20

El problema es que Ruby no puede encontrar un certificado raíz en el que confiar. A partir de 1.9 ruby ​​comprueba esto. Deberá asegurarse de tener el certificado curl en su sistema en forma de archivo pem. También deberá asegurarse de que el certificado esté en la ubicación que Ruby espera que esté. Puede obtener este certificado en ...

http://curl.haxx.se/ca/cacert.pem

Si es un usuario de RVM y OSX, la ubicación de su archivo de certificado variará según la versión de ruby ​​que esté utilizando. Establecer la ruta explícitamente con: ca_path es una idea MALA ya que su código no será portátil cuando llegue a producción. Allí, para proporcionarle a Ruby un certificado en la ubicación predeterminada (y asumir que sus desarrolladores saben lo que están haciendo). Puede usar dtruss para averiguar dónde está buscando el sistema el archivo del certificado.

En mi caso, el sistema estaba buscando el archivo cert en

/Users/stewart.matheson/.rvm/usr/ssl/cert.pem

sin embargo, el sistema MACOSX esperaría un certificado en

/System/Library/OpenSSL/cert.pem

Copié el certificado descargado en esta ruta y funcionó. HTH

Stewart
fuente
2
Para mí en Ubuntu 12.04, la ruta de certificación que funciona es~/.rvm/usr/ssl/cert.pem
Nazar Hussain
¿Cómo utiliza dtruss para determinar dónde está buscando el certificado el sistema?
pingu
@pingu no recuerda el comando exacto, básicamente ejecutas druss y le dices que ejecute cualquier proceso de ruby ​​que quieras que "inspeccione". Su salida es muy detallada, pero básicamente podrá ver cada llamada al sistema que realiza Ruby. Una de las llamadas será una llamada de lectura de archivo que apuntará a un archivo que no existe. Mueva el certificado aquí o cree un enlace y debería estar listo para comenzar.
Stewart
Ruby no debería estar buscando un cacert.pemOS X. OS X no lo usa cacert.pem. Los certificados de sistema y usuario se almacenan en KeyChain. Ruby debería integrarse con KeyChain en OS X.
jww
¿Cuál es la mejor manera de hacer esto? Puede publicar un ejemplo?
Stewart
19

La nueva gema certificada está diseñada para solucionar esto:

https://github.com/stevegraham/certified

Kevin
fuente
Funciona con ruby ​​2.0.0p481 (2014-05-08) [i386-mingw32]
Evmorov
1
No funciona para mí con Rails 4.1.9, ruby-2.1.5. Lo agregué al Gemfile``, bundlelo agregué explícitamente require "certified"solo para estar seguro, y nada cambia. ¿Qué me estoy perdiendo?
Isaac Betesh
Ruby no debería estar buscando un cacert.pemOS X. OS X no lo usa cacert.pem. Los certificados de sistema y usuario se almacenan en KeyChain. Ruby debería integrarse con KeyChain en OS X. OpenSSL nunca ha distribuido a cacert.pem. No está claro para mí por qué cualquier software diferiría a OpenSSL para ello.
jww
18

Simplemente agregue gema 'certificada' en su archivo de gemas y ejecute la instalación del paquete.

  1. joya ' certificada '
  2. paquete de instalación
Nitish Kumar
fuente
Confirmando que esto ayudó en El Capitán. ¡Gracias!
mcmlxxxiii
Funciona perfectamente con Rails y Debian :) muchas gracias.
Szymon Rut
17

En Mac OS X Lion con el último macport:

sudo port install curl-ca-bundle  
export SSL_CERT_FILE=/opt/local/share/curl/curl-ca-bundle.crt  

Luego, vuelva a ejecutar el trabajo fallido.

Tenga en cuenta que la ubicación del archivo cert parece haber cambiado desde que Eric G respondió el 12 de mayo.

Miguel
fuente
Después de toda la búsqueda y una multitud de intentos, esto fue lo único que resolvió el problema. ¡Gracias!
shawnwall
1
genial, eso lo solucionó. Pero siempre que openssl esté instalado con homebrew, debe agregar un export SSL_CERT_FILE=/usr/local/etc/openssl/cacert.pemarchivo a su archivo .profile o .bashrc
23 de
14

Un one liner lo arregla para Windows en una solicitud de administrador

choco install wget(primero ver chocolatey.org )

wget http://curl.haxx.se/ca/cacert.pem -O C:\cacert.pem && setx /M SSL_CERT_FILE "C:\cacert.pem"

O simplemente haz esto:

gem sources -r https://rubygems.org/
gem sources -a http://rubygems.org/

Método de Milanio:

gem sources -r https://rubygems.org
gem sources -a http://rubygems.org 
gem update --system
gem sources -r http://rubygems.org
gem sources -a https://rubygems.org

gem install [NAME_OF_GEM]
Jonathan
fuente
1
Pequeña mejora: solo necesita actualizar Ruby y luego puede volver a agregar la fuente https. Esto me funcionó de maravilla: gem sources -r rubygems.org => gem sources -a rubygems.org => gem update --system => fuentes de gemas -r rubygems.org => fuentes de gemas -a rubygems.org => instalación de gemas [NAME_OF_GEM]
milanio
13

Bueno, esto funcionó para mí.

rvm pkg install openssl
rvm reinstall 1.9.2 --with-openssl-dir=$rvm_path/usr

Algo está mal con la implementación de openssl de mi ubuntu 12.04

ramasamy
fuente
3
Esto funciona, pero que tenía que terminar con esto: curl -O http://curl.haxx.se/ca/cacert.pem, mv cacert.pem cert.pem,mv cert.pem $rvm_path/usr/ssl
Raf
Trabajó para mí, Mac OS X Yosemite. ¡Gracias!
anevaude
12

Si bien sé que es una solución poco convincente, sigo compartiendo esto porque parece que muy pocas personas que responden aquí usan Windows , y creo que algunos de los usuarios de Windows (incluido yo) apreciarían un enfoque simple e intuitivo.

require 'openssl'
puts OpenSSL::X509::DEFAULT_CERT_FILE

Eso indica dónde está buscando su openssl el archivo cert. Mi nombre no es Luis, pero el mío sí C:/Users/Luis/Code/luislavena/knap-build/var/knapsack/software/x86-windows/openssl/1.0.0l/ssl/cert.pem. La ruta puede ser diferente dependiendo de cada entorno propio (por ejemplo, en openknapsacklugar de luislavena).

La ruta no cambió incluso después a set SSL_CERT_FILE=C:\foo\bar\baz\cert.pemtravés de la consola, así que ... Creé el directorio C:\Users\Luis\Code\luislavena\knap-build\var\knapsack\software\x86-windows\openssl\1.0.0l\ssl en mi disco local y puse un archivo cert en él.

Cojo como es, esto seguramente funcionará.

Quv
fuente
2
Brillante. Hacky, pero esto fue lo único que resolvió mi problema.
Daniel Magliola
Buena forma de depurar ... Para mí, el usuario era "Justin". Google muestra que esto parece ser un problema conocido con RubyInstaller. Desafortunadamente, crear ese directorio (+ archivo pem) por mí mismo, no resolvió el problema por mí
Wouter
12

Intenté instalar curl-ca-bundlecon brew, pero el paquete ya no está disponible:

$ brew install curl-ca-bundle
Error: No available formula for curl-ca-bundle 
Searching formulae...
Searching taps...

La solución que me funcionó en Mac fue:

 $ cd /usr/local/etc/openssl/certs/
 $ sudo curl -O http://curl.haxx.se/ca/cacert.pem

Agregue esta línea en su ~/.bash_profile(o ~/.zshrcpara zsh):

export SSL_CERT_FILE=/usr/local/etc/openssl/certs/cacert.pem

Luego actualice su terminal:

$ source ~/.bash_profile
monteirobrena
fuente
1
Esto funcionó para mí, pero el camino está equivocado. Debería ser:export SSL_CERT_FILE=/usr/local/etc/openssl/certs/cacert.pem
dnlmzw
2
Esta es una buena solución, debido a su simplicidad. Además, al hacer referencia al certificado agregado en ~/.bash_profile, deja un recordatorio de lo que se agregó (y, de manera crucial, dónde) cuando se requieren actualizaciones adicionales.
auxbuss
Esto funcionó para mí. @dnlmzw el camino estaba bien para mí pero, por supuesto, esto depende de su configuración. ¡Gracias!
theartofbeing
no funcionó para mí al intentar agregar una URL de servidor de gemas privada que utiliza un certificado autofirmado para mis fuentes de gemas. OSX 10.11.6 + rbenv
sixty4bit
12

Aquí hay otra opción para fines de depuración.

Asegúrese de nunca usar esto en ningún entorno de producción, ya que negará los beneficios de usar SSL en primer lugar. Solo es válido hacerlo en su entorno de desarrollo local.

require 'openssl'
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
Scott
fuente
26
Votación negativa: Sí, esto funciona, pero la barrera para instalar un paquete de CA válido y realmente resolver el problema es tan baja que una solución como esta, que invalida casi por completo la seguridad de SSL, no es una solución que deba implementarse a menos que usted se encuentra en un entorno donde la Autoridad de certificación es completamente inaccesible (e incluso entonces, debe crear una CA local que sea accesible para ambos puntos finales).
yaauie
10
No eliminó por completo la protección SSL, la eliminó por completo. Nunca hagas esto.
drbrain
15
Para la depuración es suficiente
rickyduck
1
Esto produce una advertencia ahora en 1.9
Ivan
2
Esta es una mala solución para el trabajo de producción a través de Internet, pero no es del todo cierto que "es mejor que no uses SSL en absoluto". El tráfico encriptado por cable es mejor que el tráfico en claro. Sí, tiene la posibilidad de ataques de hombre en el medio, pero esos son al menos una muesca más difícil de defender que simplemente escuchar a escondidas el tráfico de texto sin formato a medida que se desliza.
Mark Reed
10

Tuve este mismo problema mientras trabajaba en un proyecto Ruby. Estoy usando Windows 7 de 64 bits.

Resolví esto por:

  1. Descargando el archivo cacert.pem de http://curl.haxx.se/ca/cacert.pem .
  2. Guarde ese archivo en C: /RubyCertificates/cacert.pem
  3. Luego establezca mi variable de entorno "SSL_CERT_FILE" en "C: \ RubyCertificates \ cacert.pem"

fuente: https://gist.github.com/fnichol/867550

Enrique
fuente
Como se trata de Windows, las barras invertidas deben usarse en el valor de la variable de entorno.
Christian Baumann
esta es la única solución que funcionó para solucionar el "paquete" para mí, después de corregir el error de rubygems ssl
DonBecker
7

La respuesta más directa que funcionó para mí fue esta

sudo apt-get install openssl ca-certificates

¡¡¡Y voilá!!!

Pratik Bothra
fuente
1
¡Ojalá pudiera votar más de una vez porque me has ahorrado tanto tiempo!
Stephen
1
@Stephen - Me gustaría que tú también pudieras :-). Me ahorró mucho tiempo, así que pensé en publicarlo aquí, y podría ayudar a alguien más también.
Pratik Bothra
7

OS X 10.8.x con Homebrew:

brew install curl-ca-bundle
brew list curl-ca-bundle
cp /usr/local/Cellar/curl-ca-bundle/1.87/share/ca-bundle.crt /usr/local/etc/openssl/cert.pem
Síntesis
fuente
1
Funciona para mí en 10.9 también.
Sami Samhuri
1
Ok para mí, OS X 10.9.1. ¡Increíble!
rogeriopradoj
Algo se rompe gravemente cuando tienes que buscar soluciones aleatorias para solucionar estos problemas tontos. Todas estas respuestas hacen algo completamente diferente y todas parecen ayudar a las personas en algún momento. WTF?
sergserg
13
curl-ca-bundle fue retirado de brew
Fa11enAngel
4

Esto funcionó para mí. Si usa rvm y brew:

rvm remove 1.9.3
brew install openssl
rvm install 1.9.3 --with-openssl-dir=`brew --prefix openssl`
Rahul
fuente
4

Me encontré con este problema y la solución sugerida de rvm osx-ssl-certs update all no funcionó a pesar de que soy un usuario de RVM en OSX.

La solución que funcionó para mí fue reinstalar la última versión de openssl:

brew update
brew remove openssl
brew install openssl
Dave Brace
fuente
4

Solucioné este problema ejecutando esto en la terminal. El informe completo está disponible aquí.

rvm install 2.2.0 --disable-binary
Buscador de espectros
fuente
3

Solución OSX:

instalar la última versión estable de rvm

rvm get stable

use el comando rvm para resolver los certificados automáticamente

rvm osx-ssl-certs update all
Alston
fuente
1
Intenté esto y no funcionó para mí. Aquí está mi solución: stackoverflow.com/a/16741712/62
Liron Yahdav
Trabajó para mí después de instalar Ruby 2.0.0 a través de RVM.
Chris Peters
3

Si está ejecutando su aplicación de rieles localmente, simplemente agregue esta línea en la parte inferior de application.rb.

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

Después de esto, puede usar la aplicación sin ningún problema. Puede llamarlo pirateo, pero no se recomienda. Úselo solo cuando necesite ejecutarlo localmente

Tarun Rathi
fuente
2

Esto es lo que hice que ayudó si específicamente tienes un problema con Leopard.

Mi certificado era antiguo y necesitaba ser actualizado. Descargué esto:

http://curl.haxx.se/ca/cacert.pem

Luego reemplacé mi certificado que se encontró aquí en Leopard:

/usr/share/curl/curl-ca-bundle.crt

¡Vuelva a cargar lo que tenga que esté accediendo y debería estar listo para comenzar!

Musicalmindz
fuente
2

Solo porque las instrucciones fueron un poco diferentes para lo que funcionó para mí, pensé agregar mis 2 centavos:

Estoy en OS X Lion y uso macports y rvm

Instalé curl-ca-bundle:

sudo port install curl-ca-bundle

Luego ajusté mi configuración omniauth para que sea esto:

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :google_oauth2, APP_CONFIG['CONSUMER_KEY'], APP_CONFIG['CONSUMER_SECRET'],
           :scope => 'https://www.google.com/m8/feeds https://www.googleapis.com/auth/userinfo.profile',
           :ssl => {:ca_path => "/share/curl/curl-ca-bundle.crt"}
end
Hortitude
fuente
Podrías (y probablemente deberías) renunciar a todo el zoológico de CA ( ca-bundle.crt) y usar Google Internet Authority G2 en :ssl => {:ca_path => "/share/curl/curl-ca-bundle.crt"}. Ese es el único necesario para certificar las conexiones a Google.
jww
2

Si tiene un enlace simbólico en / usr / local / etc / openssl que apunta a cert.pem, intente hacer esto:

ruby -ropenssl -e "p OpenSSL::X509::DEFAULT_CERT_FILE" (should be /usr/local/etc/openssl)
cd /usr/local/etc/openssl
wget http://curl.haxx.se/ca/cacert.pem
ln -s cacert.pem 77ee3751.0 (77ee3751.0 is my symbolic link, should depend on the openssl version)
Duccio Giovannelli
fuente
2

Lo que funcionó para mí es una combinación de respuestas, a saber:

# Reinstall OpenSSL
brew update
brew remove openssl
brew install openssl
# Download CURL CA bundle
cd /usr/local/etc/openssl/certs
wget http://curl.haxx.se/ca/cacert.pem
/usr/local/opt/openssl/bin/c_rehash
# Reinstall Ruby from source
rvm reinstall 2.2.3 --disable-binary
suda
fuente
1

Tuve problemas durante varios días y estaba hackeando. Este enlace resultó ser extremadamente útil para mí. Me ayudó a hacer una actualización exitosa de SSL en MAC OS X 9.

Empacado
fuente
1

En ocasiones, no siempre es el problema de rvm en MAC OSX, si elimina .rvm, el problema persiste (especialmente mientras realiza una copia de seguridad de los datos de timemachine), puede intentarlo de esta manera.

1.brew update
2.brew install openssl
Albert.Qing
fuente
1

Agregar gem 'certified', '~> 1.0'a mi Gemfiley ejecutar bundleresolvió este problema para mí.

usuario2573222
fuente