SSL_connect retornado = 1 errno = 0 state = certificado do servidor de leitura SSLv3 B: falha na verificação do certificado


281

Estou usando o Authlogic-Connect para logins de terceiros. Após executar as migrações apropriadas, os logins do Twitter / Google / Yahoo parecem funcionar bem, mas o login do Facebook gera uma exceção:

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

O log do desenvolvedor mostra

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 sugira..



Aqui é um a melhor solução eu era capaz de encontrar até agora stackoverflow.com/a/16983443/11792
Pavel Nikolov

Respostas:


138

Encontrei um problema semelhante ao tentar usar o gerador JQuery para o Rails 3

Eu resolvi assim:

  1. Obtenha o pacote CA (autoridade de certificação) CURL. Você pode fazer isso com:

    • sudo port install curl-ca-bundle [se você estiver usando MacPorts]
    • ou simplesmente puxe-o para baixo diretamente wget http://curl.haxx.se/ca/cacert.pem
  2. Executar o código ruby que está tentando verificar a certificação SSL: SSL_CERT_FILE=/opt/local/etc/certs/cacert.pem rails generate jquery:install. No seu caso, você deseja definir isso como uma variável de ambiente em algum lugar que o servidor a apanha ou adicionar algo como ENV['SSL_CERT_FILE'] = /path/to/your/new/cacert.pemno seu arquivo environment.rb.

Você também pode instalar os arquivos da CA (não tentei isso) no sistema operacional - há instruções longas aqui - isso deve funcionar de maneira semelhante, mas não tentei pessoalmente.

Basicamente, o problema que você está enfrentando é que alguns serviços da Web estão respondendo com um certificado assinado em uma CA que o OpenSSL não pode verificar.


1
Isso funcionou para mim também ao tentar conectar-me à minha conta do Gmail usando Ruby Net :: IMAP a partir de um script ruby.
Jignesh Gohel

4
Sim, isso funciona bem no ruby-1.9.3. Eu o adicionei à minha configuração do bash. export SSL_CERT_FILE=/usr/local/etc/openssl/certs/cert.pem
andersjanmyr

5
Eu não tenho / usr / local / etc / openssl, então eu corri 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 Rio

4
Desenvolvendo no meu Mac, acabei de adicionar SSL_CERT_FILE=/usr/local/etc/openssl/cert.pemo .envarquivo e o aplicativo do meu aplicativo - todos felizes.
Dave Sag

8
Aprecio a ironia de usar o wget para baixar certificados de curl.
Trey

135

Se você estiver usando o RVM no OS X, provavelmente precisará executar o seguinte:

rvm osx-ssl-certs update all

Mais informações aqui: http://rvm.io/support/fixing-broken-ssl-certificates

E aqui está a explicação completa: https://github.com/wayneeseguin/rvm/blob/master/help/osx-ssl-certs.md


Atualizar

No Ruby 2.2, talvez seja necessário reinstalar o Ruby da fonte para corrigir isso. Veja como (substitua 2.2.3pela sua versão do Ruby):

rvm reinstall 2.2.3 --disable-binary

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


2
Aqui é um writeup muito mais abrangente com alternativas: railsapps.github.io/openssl-certificate-verify-failed.html
Peter P.

ERRO: a atualização do rvm foi removida. Veja API CLI 'rvm get' e rvm 'rubygems'
yang

@ user432506 Como você recebeu esse erro? Estou usando o RVM estável mais recente e ainda funciona.
htanata

4
Isso funcionaria por um tempo e depois falharia para mim. O que funcionou para mim estava em execução, rvm reinstall 2.2.0 --disable-binarymas você deve instalar a instalação e começar do zero.
21815 Ian

2
Este foi um grande salva-vidas e deve ser a resposta aceita.
Siraris 7/09/16

129

Veja como você pode corrigi-lo no Windows: https://gist.github.com/867550 (criado por Fletcher Nichol)

Excerto:

A maneira manual (chata)

Faça o download do cacert.pemarquivo em http://curl.haxx.se/ca/cacert.pem . Salve este arquivo em C:\RailsInstaller\cacert.pem.

Agora torne o ruby ​​ciente do seu pacote de autoridade de certificação configurando SSL_CERT_FILE. Para definir isso na sessão atual do prompt de comando, digite:

set SSL_CERT_FILE=C:\RailsInstaller\cacert.pem

Para tornar essa configuração permanente, adicione-a no seu painel de controle .


6
Obrigado. Isso é excepcionalmente útil e também muito simples.
John

A solução acima não me ajudou. Este é um guia melhor para o Windows: stackoverflow.com/questions/5720484/…
Sprachprofi

@Sprachprofi A solução à qual você vinculou funcionará apenas para 1 projeto de trilhos por vez (como você está apontando diretamente para esse certificado). A essência à qual eu vinculei (criada por Fletcher Nichol) permitirá que ela cubra todos os projetos / gemas que procuram um certificado.
Ryanjones

31

O Ruby não consegue encontrar nenhum certificado raiz para confiar.

Dê uma olhada nesta postagem do blog para obter uma solução: " Ruby 1.9 e o erro SSL ".

A solução é instalar a curl-ca-bundleporta que contém os mesmos certificados raiz usados ​​pelo Firefox:

sudo port install curl-ca-bundle

e diga ao seu httpsobjeto para usá-lo:

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

Observe que se você deseja que seu código seja executado no Ubuntu, você precisa definir o ca_pathatributo, com o local padrão dos certificados /etc/ssl/certs.


8
Isso também parece acontecer no Windows; nesse caso, a solução recomendada não funcionará.
Bob Aman

24

A razão pela qual você obteve esse erro no OSX é o ruby ​​instalado no rvm.

Se você se deparar com esse problema no OSX, poderá encontrar uma explicação realmente ampla sobre este post no blog:

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

A versão curta é que, para algumas versões do Ruby, o RVM baixa binários pré-compilados, que procuram certificados no local errado. Ao forçar o RVM a baixar a fonte e compilar em sua própria máquina, você garante que a configuração do local do certificado esteja correta.

O comando para fazer isso é:

rvm install 2.2.0 --disable-binary

se você já possui a versão em questão, pode reinstalá-la com:

rvm reinstall 2.2.0 --disable-binary

(obviamente, substitua sua versão ruby ​​conforme necessário).


Isso funcionou para mim. A postagem do blog que você está apontando também é útil, obrigado!
Cristian

2
Isso funcionou para mim no El Capitan. Eu implodi rvm (rvm implode). Instalado novamente com\curl -sSL https://get.rvm.io | bash -s stable --autolibs=homebrew e depois rvm install <ruby-version> --disable-binary Em um ponto, eu também fiz, rvm get headpois esses são alguns problemas de ponta.
Rllanb

Somente essa solução funcionou para mim, porque originalmente eu tinha o Ruby 2.0.0 no El Capitan e por algum motivo a versão mais antiga não funcionava mesmo com a correção SSL_CERT_FILE. Depois rvm install 2.2.0 --disable-binary, o problema foi resolvido.
laimison

20

A questão é que o ruby ​​não consegue encontrar um certificado raiz em que possa confiar. A partir de 1,9 ruby ​​verifica isso. Você precisará ter o certificado de ondulação no seu sistema na forma de um arquivo pem. Você também precisará garantir que o certificado esteja no local que o ruby ​​espera que esteja. Você pode obter este certificado em ...

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

Se você é um usuário RVM e OSX, a localização do arquivo de certificado varia de acordo com a versão do ruby ​​que você está usando. Definir o caminho explicitamente com: ca_path é uma idéia MAU, pois seu código não será portátil quando chegar à produção. Lá, você deseja fornecer ao ruby ​​um certificado no local padrão (e suponha que seus desenvolvedores saibam o que estão fazendo). Você pode usar o dtruss para descobrir onde o sistema está procurando o arquivo de certificado.

No meu caso, o sistema estava procurando o arquivo cert em

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

no entanto, o sistema MACOSX esperaria um certificado em

/System/Library/OpenSSL/cert.pem

Copiei o certificado baixado para esse caminho e funcionou. HTH


2
Para mim no Ubuntu 12.04, o caminho cert que funciona é~/.rvm/usr/ssl/cert.pem
Nazar Hussain

Como você usa o dtruss para descobrir onde o sistema está procurando o certificado?
pingu

O @pingu não consegue se lembrar do comando exato, basicamente você executa o druss e diz para executar o processo de ruby ​​que você deseja que "inspecione". Sua saída é muito detalhada, mas basicamente você poderá ver cada chamada do sistema que o ruby ​​está fazendo. Uma das chamadas será uma chamada de arquivo de leitura que apontará para um arquivo que não existe. Mova o certificado aqui ou crie um link e você deve estar pronto.
Stewart

Ruby não deve estar procurando um cacert.pemno OS X. O OS X não usa cacert.pem. Os certificados do sistema e do usuário são armazenados no KeyChain. Ruby deve estar se integrando ao KeyChain no OS X.
jww 12/12

Qual é a melhor maneira de fazer isso? Você pode postar um exemplo?
Stewart

19

A nova jóia certificada foi projetada para corrigir isso:

https://github.com/stevegraham/certified


Funciona com ruby ​​2.0.0p481 (08-05-2014) [i386-mingw32]
Evmorov

1
Não estou trabalhando para mim com o Rails 4.1.9, ruby-2.1.5. Eu o adicionei ao Gemfile, bundleexplicitamente, require "certified"apenas para ter certeza, e nada muda. o que estou perdendo?
Isaac Betesh

Ruby não deve estar procurando um cacert.pemno OS X. O OS X não usa cacert.pem. Os certificados do sistema e do usuário são armazenados no KeyChain. Ruby deve estar se integrando ao KeyChain no OS X. O OpenSSL nunca distribuiu a cacert.pem. Não está claro para mim o porquê de qualquer software adiar o OpenSSL por isso.
JWW

18

Basta adicionar a gem 'certificada' no seu gemfile e executar a instalação do pacote.

  1. gem ' certificado '
  2. instalação do pacote

Confirmando que isso ajudou no El Capitan. Obrigado!
Mcmlxxxiii

Funciona perfeitamente com Rails e Debian :) muito obrigado!
Szymon Rut

17

No Mac OS X Lion com o macport mais recente:

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

Em seguida, execute novamente o trabalho com falha.

Observe que o local do arquivo de certificação parece ter sido alterado desde que Eric G respondeu em 12 de maio.


Depois de toda a pesquisa e uma infinidade de tentativas, essa foi a única coisa que resolveu o problema. Obrigado!
shawnwall

1
legal, isso consertou. Mas enquanto openssl é instalado com homebrew, você tem que adicionar um export SSL_CERT_FILE=/usr/local/etc/openssl/cacert.pema seu .profile ou .bashrc
23tux

14

Um liner o corrige no Windows em um prompt do administrador

choco install wget(veja pela primeira vez chocolatey.org )

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

Ou apenas faça o seguinte:

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]

1
Pequena melhoria - você só precisa atualizar o ruby ​​e adicionar novamente a fonte https - isso funcionou para mim como um encanto: gem sources -r rubygems.org => fontes gem -a rubygems.org => atualização gem --system => fontes de gem -r rubygems.org => fontes de gem -a rubygems.org => instalação de gem [NAME_OF_GEM]
milanio 6/16

13

Bem, isso funcionou para mim

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

Algo está errado com a implementação openssl do meu ubuntu 12.04


3
Isso funciona, mas eu tinha que terminar com isso: curl -O http://curl.haxx.se/ca/cacert.pem, mv cacert.pem cert.pem,mv cert.pem $rvm_path/usr/ssl
Raf

Trabalhou para mim, Mac OS X Yosemite. Obrigado!
Anevaude 14/03/2015

12

Apesar de saber que é uma solução esfarrapada, ainda estou compartilhando isso porque parece que poucas pessoas que respondem aqui usam Windows e acho que alguns usuários do Windows (inclusive eu) gostariam de uma abordagem simples e intuitiva.

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

Isso indica onde o seu openssl está procurando o arquivo cert. Meu nome não é Luis, mas o meu eraC:/Users/Luis/Code/luislavena/knap-build/var/knapsack/software/x86-windows/openssl/1.0.0l/ssl/cert.pem . O caminho pode ser diferente dependendo de cada ambiente (por exemplo, em openknapsackvez deluislavena ).

O caminho não mudou mesmo depois set SSL_CERT_FILE=C:\foo\bar\baz\cert.pemdo console, então ... eu criei o diretório C:\Users\Luis\Code\luislavena\knap-build\var\knapsack\software\x86-windows\openssl\1.0.0l\ssl no meu disco local e coloquei um arquivo cert nele.

Por pior que seja, certamente funcionará.


2
Brilhante. Hacky, mas essa foi a única coisa que resolveu meu problema.
Daniel Magliola

Ótima maneira de depurar ... Para mim, o usuário era "Justin". O Google mostra que esse parece ser um problema conhecido no RubyInstaller. Infelizmente, a criação desse diretório (arquivo pem +) eu mesmo, não resolveu o problema para mim
Wouter

12

Eu tentei instalar curl-ca-bundlecom brew, mas o pacote não está mais disponível:

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

A solução que funcionou para mim no Mac foi:

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

Adicione esta linha no seu ~/.bash_profile(ou ~/.zshrcno zsh):

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

Atualize seu terminal:

$ source ~/.bash_profile

1
Isso funcionou para mim - mas o caminho está errado. Deve ser:export SSL_CERT_FILE=/usr/local/etc/openssl/certs/cacert.pem
dnlmzw

2
Esta é uma boa solução, devido à sua simplicidade. Além disso, ao fazer referência ao certificado adicionado ~/.bash_profile, ele deixa um lembrete do que foi adicionado (e, crucialmente, onde) quando novas atualizações são necessárias.
Auxbuss 12/08/2015

Isso funcionou para mim. @dnlmzw o caminho foi bom para mim, mas é claro que isso depende da sua configuração. Obrigado!
theartofbeing

não funcionou para mim ao tentar adicionar um URL de servidor gem privado que usa um certificado autoassinado nas minhas fontes gem. OSX 10.11.6 + rbenv
sixty4bit 17/08

12

Aqui está outra opção para fins de depuração.

Certifique-se de nunca usar isso em qualquer ambiente de produção, pois isso negará os benefícios do uso do SSL em primeiro lugar. Só é válido fazer isso no seu ambiente de desenvolvimento local.

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

26
Classificação negativa: Sim, isso funciona, mas a barreira para instalar um pacote CA válido e realmente resolver o problema é tão baixa que uma solução como essa - que invalida quase completamente a segurança do SSL - não é uma solução que deve ser implementada, a menos que você está em um ambiente em que a autoridade de certificação é completamente inacessível (e mesmo assim, você deve criar uma autoridade de certificação local que seja acessível aos dois pontos de extremidade).
yaauie

10
Não removeu completamente a proteção SSL, remove-a completamente. Nunca faça isso.
Drbrain

15
Para depuração é suficiente
rickyduck

1
Isso produz um aviso agora em 1.9
Ivan

2
Essa é uma péssima solução para o trabalho de produção na Internet real, mas não é verdade que "é melhor você não usar SSL". O tráfego criptografado por cabo é melhor que o tráfego livre. Sim, você tem a possibilidade de ataques do tipo man-in-the-middle, mas esses são pelo menos um ponto mais difíceis de resistir do que simplesmente espionar o tráfego de texto simples à medida que desliza.
Mark Reed

10

Eu tive esse mesmo problema enquanto trabalhava em um projeto Ruby. Estou usando o Windows 7 64bit.

Eu resolvi isso da seguinte maneira:

  1. Fazendo o download do cacert.pem arquivo em http://curl.haxx.se/ca/cacert.pem .
  2. Salve esse arquivo em Salve C: /RubyCertificates/cacert.pem
  3. Em seguida, defina minha variável ambiental "SSL_CERT_FILE" como "C: \ RubyCertificates \ cacert.pem"

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


Como é o Windows, as barras invertidas devem ser usadas no valor da variável de ambiente.
Christian Baumann

esta é a única solução que funcionou para correção "pacote" para mim, depois de corrigir os rubygems SSL erro
DonBecker

7

A resposta mais direta que funcionou para mim foi esta

sudo apt-get install openssl ca-certificates

E pronto !!!


1
Gostaria de poder votar mais de uma vez porque você me salvou tanto tempo!
Stephen

1
@ Stephen - Eu gostaria que você pudesse também :-). Isso me salvou muito tempo, então pensei em publicá-lo aqui, e isso poderia ajudar outra pessoa também.
Pratik Bothra

7

OS X 10.8.x com 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
Funciona para mim no 10.9 também.
Sami Samhuri 13/11/2013

1
Ok para mim, OS X 10.9.1. Impressionante!
Rogeriopradoj

Algo está gravemente quebrado quando você precisa procurar soluções aleatórias para corrigir esses problemas idiotas. Todas essas respostas fazem algo totalmente diferente e todas elas parecem ajudar as pessoas em algum momento. WTF?
sergserg

13
curl-ca-feixe foi revmoved de fermentação
Fa11enAngel


4

Isso funcionou para mim. Se você estiver usando rvm e brew:

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

4

Encontrei este problema e a correção sugerida de rvm osx-ssl-certs update all não funcionou, apesar de eu ser um usuário RVM no OSX.

A correção que funcionou para mim foi reinstalar a versão mais recente do openssl:

brew update
brew remove openssl
brew install openssl

4

Corrigi esse problema executando isso no terminal. O artigo completo está disponível aqui

rvm install 2.2.0 --disable-binary

3

Solução OSX:

instale a última versão estável do rvm

rvm get stable

use o comando rvm para resolver os certificados automaticamente

rvm osx-ssl-certs update all

1
Eu tentei isso e não funcionou para mim. Aqui está a minha solução: stackoverflow.com/a/16741712/62
Liron Yahdav

Trabalhou para mim depois de instalar o Ruby 2.0.0 via RVM.
22413 Chris Chris

3

Se você estiver executando seu aplicativo rails localmente, basta adicionar esta linha na parte inferior do application.rb.

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

Depois disso, você pode usar o aplicativo sem problemas. Você pode chamá-lo de hack, mas não é recomendado. Use somente quando precisar executar localmente


2

Aqui está o que eu fiz que ajudou se você está especificamente tendo um problema no Leopard.

Meu certificado era antigo e precisava ser atualizado. Eu baixei este:

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

Em seguida, substituí o meu certificado, encontrado aqui no Leopard:

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

Recarregue o que você tem que está acessando e você deve estar pronto!


2

Só porque as instruções eram um pouco diferentes para o que funcionou para mim, pensei em adicionar meus 2 centavos:

Estou no OS X Lion e uso macports e rvm

Eu instalei o curl-ca-bundle:

sudo port install curl-ca-bundle

Então eu ajustei minha configuração omniauth para esta:

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

Você pode (e provavelmente deveria) renunciar a todo o CA Zoo ( ca-bundle.crt) e usar o Google Internet Authority G2 no :ssl => {:ca_path => "/share/curl/curl-ca-bundle.crt"}. Esse é o único necessário para certificar as conexões com o Google.
JWW

2

Se você possui um link simbólico no / usr / local / etc / openssl apontando para cert.pem, tente fazer o seguinte:

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

O que funcionou para mim é uma combinação de respostas, 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

1

Eu tive problemas por vários dias e estava hackeando. Este link provou ser extremamente útil para mim. Isso me ajudou a fazer uma atualização bem-sucedida do SSL no MAC OS X 9.


1

Às vezes, nem sempre é o problema do rvm no MAC OSX; se você remover o .rvm, o problema ainda (especialmente enquanto você faz backup dos dados do timemachine), você pode tentar dessa maneira.

1.brew update
2.brew install openssl

1

Adicionar gem 'certified', '~> 1.0'ao meu Gemfilee executando bundleresolveu esse problema para mim.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.