“Errore di verifica certificato fallito” Errore OpenSSL quando si utilizza Ruby 1.9.3

Sto usando Ruby 1.9.3p0 su Mac OS 10.6.8 (installato usando rvm). Quando provo a creare una nuova applicazione Rails utilizzando un modello di applicazione ospitato su GitHub , con questo (ad esempio):

 $ rails new myapp -m https://github.com/RailsApps/rails3-application-templates/raw/master/rails3-mongoid-devise-template.rb -T -O

Ottengo questo messaggio di errore:

  /Users/me/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/net/http.rb:799:in `connect ': SSL_connect 
 restituito = 1 errno = 0 stato = certificato server di lettura SSLv3 B: verifica certificato non riuscita 
 (OpenSSL :: SSL :: SSLError)

Comprendo che l’interprete di linguaggio Ruby sta usando OpenSSL per connettersi a GitHub per richiedere il file modello dell’applicazione. GitHub richiede che tutte le connessioni vengano effettuate utilizzando SSL. La connessione non è riuscita perché OpenSSL non è stato in grado di verificare il certificato del server.

Sono stato in grado di risolvere il problema scaricando un file di certificati:

  $ cd / opt / local / etc / openssl
 $ sudo curl -O http://curl.haxx.se/ca/cacert.pem
 $ sudo mv cacert.pem cert.pem

Non ho avuto problemi con l’uso di Ruby 1.9.2. Perché ho ottenuto il problema “Verifica certificato non riuscita” per Ruby 1.9.3? È un bug di Ruby 1.9.3? È specifico per Mac OS 10.6.8? La mia soluzione è il modo giusto per risolvere questo?

Ci sono molte parti mobili coinvolte nella risposta corretta. Dipende dal tuo sistema operativo, dalla versione di Ruby, dalla versione OpenSSL, dalla versione di Rubygems. Ho finito per scrivere un articolo dopo averlo fatto. Il mio articolo spiega i motivi dell’errore, offre passaggi per un’ulteriore diagnosi, mostra diversi soluzioni alternative e suggerisce possibili soluzioni. Questo sarà utile:

OpenSSL Errors and Rails – Certificate Certificate Failed

Ci sono anche collegamenti ai commit e ai problemi rilevanti su GitHub.

Per me ciò si è verificato su OS X con homebrew dopo l’aggiornamento all’ultima RVM (rvm 1.20.12) e quindi l’installazione di ruby-1.9.3-p429. Potrei riprodurre il problema semplicemente eseguendo:

$ rvm use ruby-1.9.3-p429 $ irb 1.9.3p429 :001 > require 'open-uri'; open 'https://google.com' OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/net/http.rb:800:in `connect' from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/net/http.rb:800:in `block in connect' from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/timeout.rb:55:in `timeout' from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/timeout.rb:100:in `timeout' from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/net/http.rb:800:in `connect' from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/net/http.rb:756:in `do_start' from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/net/http.rb:745:in `start' from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/open-uri.rb:306:in `open_http' from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/open-uri.rb:775:in `buffer_open' from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/open-uri.rb:203:in `block in open_loop' from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/open-uri.rb:201:in `catch' from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/open-uri.rb:201:in `open_loop' from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/open-uri.rb:146:in `open_uri' from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/open-uri.rb:677:in `open' from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/open-uri.rb:33:in `open' from (irb):1 from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/bin/irb:16:in `
'1.9.3p429 :002 >

La soluzione era simile a quella nella domanda, ma il percorso era sbagliato. L’esecuzione di questo risolto:

 curl https://curl.haxx.se/ca/cacert.pem -o /usr/local/etc/openssl/cert.pem 

L’indizio sul percorso corretto era che quando stavo installando Ruby-1.9.3-p429 tramite RVM, questo mostrava nell’output:

 Certificates in '/usr/local/etc/openssl/cert.pem' already are up to date. 

Ho avuto il percorso /usr/local/etc/openssl , ma nessun file cert.pem in quella directory, quindi non sono sicuro del motivo per cui RVM ha affermato che i certificati erano aggiornati. Sarebbe bello sapere perché ho dovuto farlo al primo posto, ma non ho il tempo di indagare ora.

Ho avuto lo stesso problema, dopo aver compilato il mio Ruby RVM contro un’installazione RVM di OpenSSL. Ho spostato il file cacerts.pem come scaricato dal poster originale in ~ / .rvm / usr / ssl / cert.pem per risolvere il problema.

Avevo lo stesso problema.

Il modo in cui l’ho finalmente risolto è stato l’aggiornamento della mia versione di OpenSSL che avevo installato tramite MacPorts. Stavo eseguendo una versione di OpenSSL dal 2009, quindi ho aggiornato l’installazione di MacPorts, quindi ho aggiornato la mia installazione di OpenSSL tramite l’interfaccia della riga di comando delle ports e l’errore è scomparso.

Ci deve essere una certa integrazione tra Ruby / Rails e OpenSSL su installazioni basate su Mac che è ovvio. Nel mio caso ho riscontrato problemi nel far funzionare correttamente il Login con Facebook quando Facebook stava inviando il token oAuth / Login alla mia app, Devise e OmniAuth devono aver avuto bisogno di un certificato SSL valido per graph.facebook.com che non era in la mia vecchia versione di OpenSSL.

La directory di certificazione Openssl è /usr/lib/ssl/ in Debian. Quindi, seguire tre linee era abbastanza per me,

 $ cd /usr/lib/ssl/ $ sudo curl -O http://curl.haxx.se/ca/cacert.pem $ sudo mv cacert.pem cert.pem 

Potrebbe essere a causa di come hai costruito 1.9.2 e 1.9.3 – forse qualunque strumento tu abbia usato per build ogni cosa configurata in modo leggermente diverso. O forse usano versioni diverse di OpenSSL.

Ecco l’unica modifica potenzialmente rilevante che potrei individuare su Net: HTTP tra 1.9.2 e 1.9.3

  require 'net/protocol' -autoload :OpenSSL, 'openssl' require 'uri' +autoload :OpenSSL, 'openssl' 

(se vuoi vedere la diff …)

 git clone https://github.com/ruby/ruby.git
 cd ruby
 git diff origin / ruby_1_9_2 origine / ruby_1_9_3 - http.rb

Ho avuto un problema simile ma non su Rails, ma solo su Ruby su Windows. Ho risolto il problema utilizzando il certificato cacert.pem e impostando il percorso del certificato sulla variabile ambientale “SSL_CERT_FILE”

Risposta dettagliata qui: https://stackoverflow.com/a/35429863/4747587