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.