SSL_connect restituito = 1 errno = 0 stato = SSLv3 letto certificato server B: verifica certificato non riuscita


281

Sto usando Authlogic-Connect per accessi di terze parti. Dopo aver eseguito le migrazioni appropriate, gli accessi a Twitter / Google / yahoo sembrano funzionare correttamente, ma l'accesso a Facebook genera un'eccezione:

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

Viene visualizzato il registro degli sviluppatori

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'

Si prega di suggerire ..



Ecco la soluzione migliore che sono riuscito a trovare finora stackoverflow.com/a/16983443/11792
Pavel Nikolov

Risposte:


138

Ho riscontrato un problema simile durante il tentativo di utilizzare il generatore JQuery per Rails 3

L'ho risolto in questo modo:

  1. Ottieni il bundle CURL Certificate Authority (CA). Puoi farlo con:

    • sudo port install curl-ca-bundle [se stai usando MacPorts]
    • o semplicemente tiralo giù direttamente wget http://curl.haxx.se/ca/cacert.pem
  2. Eseguire il codice Ruby che sta cercando di verificare la certificazione SSL: SSL_CERT_FILE=/opt/local/etc/certs/cacert.pem rails generate jquery:install. Nel tuo caso, vuoi impostare questo come una variabile di ambiente da qualche parte che il server lo prende o aggiungere qualcosa di simile ENV['SSL_CERT_FILE'] = /path/to/your/new/cacert.pemnel tuo file environment.rb.

È anche possibile installare i file CA (non ho provato questo) per il sistema operativo - ci sono lunghe istruzioni qui - questo dovrebbe funzionare in modo simile, ma non l'ho provato personalmente.

Fondamentalmente, il problema che stai colpendo è che alcuni servizi web stanno rispondendo con un certificato firmato contro una CA che OpenSSL non può verificare.


1
Questo ha funzionato anche per me mentre cercavo di connettermi al mio account Gmail usando Ruby Net :: IMAP da uno script ruby. Grazie.
Jignesh Gohel,

4
Sì, funziona perfettamente su ruby-1.9.3. L'ho aggiunto alla mia configurazione di bash. export SSL_CERT_FILE=/usr/local/etc/openssl/certs/cert.pem
Andersjanmyr,

5
Non avevo / usr / local / etc / openssl, quindi ho corso sudo curl http://curl.haxx.se/ca/cacert.pem >> /usr/local/etc/cacert.pemseguito da export SSL_CERT_FILE=/usr/local/etc/cacert.pem
Lilith River

4
Sviluppandomi sul mio Mac ho appena aggiunto SSL_CERT_FILE=/usr/local/etc/openssl/cert.pemal .envfile della mia app e voilà - tutti contenti.
Dave Sag,

8
Apprezzo l'ironia dell'utilizzo di wget per scaricare i certificati di arricciatura.
Trey,

135

Se stai usando RVM su OS X, probabilmente dovrai eseguire questo:

rvm osx-ssl-certs update all

Maggiori informazioni qui: http://rvm.io/support/fixing-broken-ssl-certificates

Ed ecco la spiegazione completa: https://github.com/wayneeseguin/rvm/blob/master/help/osx-ssl-certs.md


Aggiornare

Su Ruby 2.2, potrebbe essere necessario reinstallare Ruby dall'origine per risolvere questo problema. Ecco come (sostituisci 2.2.3con la tua versione di Ruby):

rvm reinstall 2.2.3 --disable-binary

Ringraziamo https://stackoverflow.com/a/32363597/4353 e Ian Connor .


2
Ecco un approfondimento molto più completo con alternative: railsapps.github.io/openssl-certificate-verify-failed.html
Peter P.

ERRORE: l'aggiornamento di rvm è stato rimosso. Guarda invece l'API CLI 'rvm get' e rvm 'rubygems'
yang

@ user432506 Come hai ricevuto questo errore? Sto usando l'ultima RVM stabile e funziona ancora.
htanata,

4
Funzionerebbe per un po ', poi fallirebbe per me. Quello che ha funzionato per me era in esecuzione rvm reinstall 2.2.0 --disable-binaryma poi devi raggruppare l'installazione e ricominciare da capo.
Ian Connor,

2
Questa è stata una grande salvezza e dovrebbe essere la risposta accettata.
Siraris,

129

Ecco come risolverlo su Windows: https://gist.github.com/867550 (creato da Fletcher Nichol)

Estratto:

Il modo manuale (noioso)

Scarica il cacert.pemfile da http://curl.haxx.se/ca/cacert.pem . Salva questo file in C:\RailsInstaller\cacert.pem.

Ora rendi ruby ​​consapevole del tuo pacchetto di autorità di certificazione impostando SSL_CERT_FILE. Per impostarlo nella sessione corrente del prompt dei comandi, digitare:

set SSL_CERT_FILE=C:\RailsInstaller\cacert.pem

Per rendere questa un'impostazione permanente, aggiungila nel tuo pannello di controllo .


6
Grazie. Questo è eccezionalmente utile e anche molto semplice.
Giovanni

La soluzione sopra non mi ha aiutato. Si tratta di una guida migliore per Windows: stackoverflow.com/questions/5720484/...
Sprachprofi

@Sprachprofi La soluzione a cui hai collegato funzionerà solo per 1 progetto di rotaie alla volta (poiché stai puntando direttamente a quel certificato). L'essenza che ho collegato (creato da Fletcher Nichol) gli permetterà di coprire ogni progetto / gemma che sta cercando un certificato.
ryanjones,

31

Ruby non riesce a trovare alcun certificato radice di cui fidarsi.

Dai un'occhiata a questo post sul blog per una soluzione: " Ruby 1.9 e l'errore SSL ".

La soluzione è installare la curl-ca-bundleporta che contiene gli stessi certificati radice utilizzati da Firefox:

sudo port install curl-ca-bundle

e dì al tuo httpsoggetto di usarlo:

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

Nota che se vuoi che il tuo codice venga eseguito su Ubuntu, devi ca_pathinvece impostare l' attributo, con la posizione dei certificati di default /etc/ssl/certs.


8
Questo sembra accadere anche su Windows, nel qual caso la soluzione consigliata non funzionerà.
Bob Aman,

24

Il motivo per cui si ottiene questo errore su OSX è il ruby ​​installato rvm.

Se riscontri questo problema su OSX, puoi trovare una spiegazione molto ampia di questo in questo post del blog:

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

La versione breve è che, per alcune versioni di Ruby, RVM scarica file binari precompilati, che cercano certificati nella posizione sbagliata. Obbligando RVM a scaricare l'origine e la compilazione sul proprio computer, si garantisce che la configurazione per l'ubicazione del certificato sia corretta.

Il comando per farlo è:

rvm install 2.2.0 --disable-binary

se hai già la versione in questione, puoi reinstallarla con:

rvm reinstall 2.2.0 --disable-binary

(ovviamente, sostituisci la tua versione in rubino secondo necessità).


Questo ha funzionato per me. Anche il post sul blog che stai indicando è utile, grazie!
Cristian,

2
Questo ha funzionato per me su El Capitan. Ho implorato rvm (rvm implode). Installato di nuovo con \curl -sSL https://get.rvm.io | bash -s stable --autolibs=homebrewe poi rvm install <ruby-version> --disable-binary A un certo punto ho anche fatto rvm get headcome questi sono alcuni problemi di spurgo.
rylanb,

Solo questa soluzione ha funzionato per me, perché originariamente avevo Ruby 2.0.0 su El Capitan e per qualche motivo che la versione precedente non funzionava nemmeno con il corretto SSL_CERT_FILE. Dopo rvm install 2.2.0 --disable-binary, il problema è stato risolto.
laimison

20

Il problema è che ruby ​​non riesce a trovare un certificato radice di cui fidarsi. A partire da 1.9 ruby ​​controlla questo. Dovrai assicurarti di avere il certificato di arricciatura sul tuo sistema sotto forma di un file pem. Dovrai anche assicurarti che il certificato sia nella posizione in cui Ruby si aspetta che sia. Puoi ottenere questo certificato su ...

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

Se sei un utente RVM e OSX, la posizione del file del certificato varierà in base alla versione di ruby ​​che stai utilizzando. Impostare esplicitamente il percorso con: ca_path è un'idea MALE poiché il tuo codice non sarà portatile quando arriva alla produzione. Lì per te vuoi fornire a ruby ​​un certificato nella posizione predefinita (e presumere che i tuoi sviluppatori sappiano cosa stanno facendo). È possibile utilizzare dtruss per capire dove il sistema sta cercando il file del certificato.

Nel mio caso il sistema stava cercando il file cert in

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

tuttavia il sistema MACOSX prevede un certificato

/System/Library/OpenSSL/cert.pem

Ho copiato il certificato scaricato in questo percorso e ha funzionato. HTH


2
Per me su Ubuntu 12.04, il percorso cert che funziona è~/.rvm/usr/ssl/cert.pem
Nazar Hussain,

Come usi dtruss per capire dove il sistema sta cercando il certificato?
pingu,

@pingu non riesce a ricordare il comando esatto in sostanza esegui druss e gli dici di eseguire qualsiasi processo ruby ​​che vuoi "ispezionare". L'output è molto dettagliato, ma fondamentalmente sarai in grado di vedere ogni chiamata di sistema che ruby ​​sta facendo. Una delle chiamate sarà una chiamata al file di lettura che punta a un file che non esiste. Sposta qui il certificato o crea un collegamento e dovresti essere a posto.
Stewart,

Ruby non dovrebbe cercare un cacert.pemOS X. OS X non lo utilizza cacert.pem. I certificati di sistema e utente sono memorizzati nel KeyChain. Ruby dovrebbe integrarsi con KeyChain su OS X.
jww

Qual è il modo migliore per farlo? Puoi pubblicare un esempio?
Stewart,

19

La nuova gemma certificata è progettata per risolvere questo problema:

https://github.com/stevegraham/certified


Funziona con ruby ​​2.0.0p481 (2014-05-08) [i386-mingw32]
Evmorov

1
Non funziona per me con Rails 4.1.9, ruby-2.1.5. L'ho aggiunto al Gemfile, bundleaggiunto esplicitamente require "certified"solo per essere sicuro, e nulla cambia. Cosa mi sto perdendo?
Isaac Betesh,

Ruby non dovrebbe cercare un cacert.pemOS X. OS X non lo utilizza cacert.pem. I certificati di sistema e utente sono memorizzati nel KeyChain. Ruby dovrebbe integrarsi con KeyChain su OS X. OpenSSL non ha mai distribuito a cacert.pem. Non mi è chiaro il motivo per cui qualsiasi software dovrebbe rimandare a OpenSSL per questo.
1515

18

Aggiungi gem 'certificato' nel tuo file gemm ed esegui il bundle install.

  1. gemma certificata "
  2. installazione in bundle

Confermando che questo ha aiutato El Capitan. Grazie!
mcmlxxxiii,

Funziona perfettamente con Rails e Debian :) Grazie mille!
Szymon Rut,

17

Su Mac OS X Lion con l'ultimo macport:

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

Quindi, rieseguire il processo non riuscito.

Nota, il percorso del file cert sembra essere cambiato da quando Eric G ha risposto il 12 maggio.


Dopo tutta la ricerca e una moltitudine di tentativi, questa è stata l'unica cosa che ha risolto il problema. Grazie!
Shawnwall,

1
bello, questo l'ha riparato. Ma fintanto che openssl è installato con homebrew, devi aggiungere un export SSL_CERT_FILE=/usr/local/etc/openssl/cacert.pemal tuo file .profile o .bashrc
23tux

14

Un liner lo risolve per Windows in un prompt di amministrazione

choco install wget(vedi prima chocolatey.org )

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

O semplicemente fai questo:

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

Metodo di 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]

1
Piccolo miglioramento - devi solo aggiornare ruby ​​e quindi puoi aggiungere nuovamente https source - questo ha funzionato per me come un incantesimo: gem sources -r rubygems.org => gem sources -a rubygems.org => gem update --system => gem sources -r rubygems.org => gem sources -a rubygems.org => gem install [NAME_OF_GEM]
milanio

13

Bene, questo ha funzionato per me

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

Qualcosa non va nell'implementazione di openssl di Ubuntu 12.04


3
Questo funziona, ma dovevo finire con questo: curl -O http://curl.haxx.se/ca/cacert.pem, mv cacert.pem cert.pem,mv cert.pem $rvm_path/usr/ssl
Raf

Ha funzionato per me, Mac OS X Yosemite. Grazie!
anevaude

12

Pur sapendo che è piuttosto una soluzione scadente, lo condivido ancora perché sembra che pochissime persone che rispondono qui utilizzino Windows , e penso che alcuni utenti di Windows (me incluso) apprezzerebbero un approccio semplice e intuitivo.

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

Questo dice dove il tuo openssl sta cercando il file cert. Non mi chiamo Luis, ma il mio lo era C:/Users/Luis/Code/luislavena/knap-build/var/knapsack/software/x86-windows/openssl/1.0.0l/ssl/cert.pem. Il percorso può variare a seconda del proprio ambiente (ad es. openknapsackAnzichéluislavena ).

Il percorso non è cambiato nemmeno dopo set SSL_CERT_FILE=C:\foo\bar\baz\cert.pemtramite la console, quindi ... Ho creato la directory C:\Users\Luis\Code\luislavena\knap-build\var\knapsack\software\x86-windows\openssl\1.0.0l\ssl nel mio disco locale e vi ho inserito un file cert.

Così com'è, sicuramente funzionerà.


2
Brillante. Hacky, ma questa è stata l'unica cosa che ha risolto il mio problema.
Daniel Magliola,

Bel modo di debug ... Per me l'utente era "Justin". Googling mostra che questo sembra essere un problema noto con RubyInstaller. Sfortunatamente, la creazione di quella directory (+ file pem) da sola, non ha risolto il problema per me
Wouter,

12

Ho provato a installare curl-ca-bundlecon brew, ma il pacchetto non è più disponibile:

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

La soluzione che ha funzionato con me su Mac è stata:

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

Aggiungi questa riga nel tuo ~/.bash_profile(o ~/.zshrcper zsh):

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

Quindi aggiorna il tuo terminale:

$ source ~/.bash_profile

1
Questo ha funzionato per me, ma il percorso è sbagliato. Dovrebbe essere:export SSL_CERT_FILE=/usr/local/etc/openssl/certs/cacert.pem
dnlmzw,

2
Questa è una bella soluzione, per la sua semplicità. Inoltre, facendo riferimento al certificato aggiunto ~/.bash_profile, lascia un promemoria di ciò che è stato aggiunto (e, soprattutto, dove) quando sono necessari ulteriori aggiornamenti.
auxbuss,

Questo ha funzionato per me. @dnlmzw il percorso andava bene per me, ma ovviamente questo dipende dalla tua configurazione. Grazie!
entro l'

non ha funzionato per me quando ho provato ad aggiungere un URL del server gem privato che utilizza un certificato autofirmato per le mie fonti gem. OSX 10.11.6 + rbenv
sixty4bit

12

Ecco un'altra opzione per scopi di debug.

Assicurati di non usarlo mai in nessun ambiente di produzione, poiché negherà innanzitutto i vantaggi dell'utilizzo di SSL. È sempre valido farlo nel proprio ambiente di sviluppo locale.

require 'openssl'
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE

26
Downvoted: Sì, funziona, ma la barriera per l'installazione di un bundle CA valido e la risoluzione effettiva del problema è così bassa che una soluzione come questa - che invalida quasi completamente la sicurezza di SSL - non è una soluzione che dovrebbe essere implementata a meno che tu in un ambiente in cui l'autorità di certificazione è completamente inaccessibile (e anche in questo caso, è necessario creare una CA locale accessibile a entrambi gli endpoint).
yaauie,

10
Non ha quasi completamente rimosso la protezione SSL, la rimuove completamente. Non farlo mai.
drbrain,

15
Per il debug è sufficiente
rickyduck,

1
Questo produce un avviso ora in 1.9
Ivan

2
Questa è una cattiva soluzione per il lavoro di produzione su Internet, ma non è assolutamente vero che "potresti non utilizzare affatto SSL". Il traffico crittografato tramite cavo è migliore del traffico in chiaro. Sì, hai la possibilità di attacchi man-in-the-middle, ma quelli sono almeno una tacca più difficili da alzare rispetto al semplice intercettare sul traffico in chiaro mentre scorre.
Mark Reed

10

Ho avuto lo stesso problema mentre lavoravo a un progetto Ruby. Sto usando Windows 7 a 64 bit.

Ho risolto questo problema con:

  1. Download del file cacert.pem da http://curl.haxx.se/ca/cacert.pem .
  2. Ho salvato quel file in Ho C: /RubyCertificates/cacert.pem
  3. Quindi impostare la mia variabile ambientale "SSL_CERT_FILE" su "C: \ RubyCertificates \ cacert.pem"

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


Poiché è Windows, i backslahes dovrebbero essere usati nel valore della variabile d'ambiente.
Christian Baumann,

questa è l'unica soluzione che ha funzionato per correggere "bundle" per me, dopo aver corretto l'errore ssl
rubygems

7

La risposta più semplice che ha funzionato per me è stata questa

sudo apt-get install openssl ca-certificates

E voilà !!!


1
Vorrei poter votare più di una volta perché mi hai risparmiato così tanto tempo!
Stephen,

1
@Stephen - Vorrei che anche tu potessi :-). Mi ha fatto risparmiare un sacco di tempo, quindi ho pensato di pubblicarlo qui e potrebbe aiutare anche qualcun altro.
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

1
Funziona anche per me sul 10.9.
Sami Samhuri,

1
Ok per me, OS X 10.9.1. Eccezionale!
rogeriopradoj,

Qualcosa è gravemente rotto quando devi cercare soluzioni casuali per risolvere questi problemi stupidi. Tutte queste risposte fanno qualcosa di completamente diverso e tutte sembrano aiutare le persone ad un certo punto. WTF?
sergserg,

13
curl-ca-bundle è stato revmoved da brew
Fa11enAngel


4

Questo ha funzionato per me. Se usi rvm e brew:

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

4

Ho riscontrato questo problema e la correzione suggerita di rvm osx-ssl-certs update all non ha funzionato nonostante sia un utente RVM su OSX.

La correzione che ha funzionato per me è stata la reinstallazione dell'ultima versione di openssl:

brew update
brew remove openssl
brew install openssl

4

Ho risolto questo problema eseguendolo nel terminale. La scrittura completa è disponibile qui

rvm install 2.2.0 --disable-binary

3

Soluzione OSX:

installa l'ultima versione stabile di rvm

rvm get stable

utilizzare il comando rvm per risolvere automaticamente i certificati

rvm osx-ssl-certs update all

1
Ho provato questo e non ha funzionato per me. Ecco la mia soluzione: stackoverflow.com/a/16741712/62
Liron Yahdav

Ha funzionato per me dopo aver installato Ruby 2.0.0 tramite RVM.
Chris Peters,

3

Se stai eseguendo l'app rails localmente, aggiungi semplicemente questa riga nella parte inferiore di application.rb.

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

Dopodiché puoi utilizzare l'app senza problemi. Puoi chiamarlo un hack ma non è raccomandato. Utilizzare solo quando è necessario eseguire localmente


2

Ecco cosa ho fatto che mi ha aiutato se hai un problema specifico con Leopard.

Il mio certificato era vecchio e doveva essere aggiornato. Ho scaricato questo:

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

Quindi ho sostituito il mio certificato che è stato trovato qui su Leopard:

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

Ricarica tutto ciò che hai che ti sta accedendo e dovresti essere pronto per partire!


2

Solo perché le istruzioni erano leggermente diverse per ciò che funzionava per me, ho pensato di aggiungere i miei 2 centesimi:

Sono su OS X Lion e utilizzo macports e rvm

Ho installato curl-ca-bundle:

sudo port install curl-ca-bundle

Quindi ho modificato la mia configurazione omniauth per essere questa:

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

Potresti (e probabilmente dovresti) rinunciare all'intero CA Zoo ( ca-bundle.crt) e utilizzare Google Internet Authority G2 in :ssl => {:ca_path => "/share/curl/curl-ca-bundle.crt"}. È l'unico necessario per certificare le connessioni a Google.
JWW

2

Se hai un link simbolico in / usr / local / etc / openssl che punta a cert.pem prova a fare questo:

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)

2

Ciò che ha funzionato per me è una combinazione di risposte, vale a dire:

# 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

1

Ho avuto problemi per un certo numero di giorni e stavo hackerando. Questo link si è rivelato estremamente utile per me. Mi ha aiutato a fare un aggiornamento riuscito dell'SSL su MAC OS X 9.


1

A volte non è sempre il problema di rvm in MAC OSX, se rimuovi .rvm, il problema continua (specialmente mentre esegui il backup dei dati da timemachine), puoi provare in questo modo.

1.brew update
2.brew install openssl

1

L'aggiunta gem 'certified', '~> 1.0'al mio Gemfileed esecuzione bundlerisolto questo problema per me.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.