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

Vikash
fonte
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.

Erik G.
fonte
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 .

htanata
fonte
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 .

ryanjones
fonte
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.

martoche
fonte
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).

paulmorar
fonte
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

Stewart
fonte
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

Kevin
fonte
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
Nitish Kumar
fonte
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.

Mike
fonte
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]
Jonathan
fonte
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

ramasamy
fonte
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á.

Quv
fonte
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
monteirobrena
fonte
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
Scott
fonte
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

Henry
fonte
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 !!!

Pratik Bothra
fonte
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
Síntese
fonte
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`
Rahul
fonte
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
Dave Brace
fonte
4

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

rvm install 2.2.0 --disable-binary
Wraithseeker
fonte
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
Alston
fonte
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

Tarun Rathi
fonte
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!

Musicalmindz
fonte
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
Hortitude
fonte
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)
Duccio Giovannelli
fonte
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
suda
fonte
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.

Empacotaram
fonte
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
Albert.Qing
fonte
1

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

user2573222
fonte