Eu estou recebendo o seguinte erro:
Exception in thread Thread-3:
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 810, in __bootstrap_inner
self.run()
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 763, in run
self.__target(*self.__args, **self.__kwargs)
File "/Users/Matthew/Desktop/Skypebot 2.0/bot.py", line 271, in process
info = urllib2.urlopen(req).read()
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 154, in urlopen
return opener.open(url, data, timeout)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 431, in open
response = self._open(req, data)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 449, in _open
'_open', req)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 409, in _call_chain
result = func(*args)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1240, in https_open
context=self._context)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1197, in do_open
raise URLError(err)
URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)>
Este é o código que está causando este erro:
if input.startswith("!web"):
input = input.replace("!web ", "")
url = "https://domainsearch.p.mashape.com/index.php?name=" + input
req = urllib2.Request(url, headers={ 'X-Mashape-Key': 'XXXXXXXXXXXXXXXXXXXX' })
info = urllib2.urlopen(req).read()
Message.Chat.SendMessage ("" + info)
A API que estou usando exige que eu use HTTPS. Como faço para ignorar a verificação?
python
python-2.7
ssl
ssl-certificate
urllib
user3724476
fonte
fonte
Respostas:
Se você quiser apenas ignorar a verificação, poderá criar um novo SSLContext . Por padrão, os contextos recém-criados usam CERT_NONE .
Tenha cuidado com isso, conforme indicado na seção 17.3.7.2.1
Mas se você quer que ele funcione agora por algum outro motivo, você pode fazer o seguinte, também precisará
import ssl
:Isso deve contornar o seu problema, mas você realmente não está resolvendo nenhum deles, mas não o verá
[SSL: CERTIFICATE_VERIFY_FAILED]
porque agora não está verificando o certificado!Para adicionar ao exposto, se você quiser saber mais sobre o motivo de estar vendo esses problemas, consulte o PEP 476 .
Existe uma opção recomendada de exclusão que não é diferente do meu conselho acima:
Ele também possui uma opção altamente desencorajada via monkeypatching, que você geralmente não vê em python:
Que substitui a função padrão para criação de contexto pela função de criar um contexto não verificado.
Observe com isso, conforme declarado no PEP:
Se você quiser ler um artigo sobre por que não validar certificados é ruim em software, você pode encontrá-lo aqui !
fonte
setup.py upload
como posso corrigir isso?certifi
e atualizar o openssl nas caixas.context
é o que eu precisava # 10Esta não é uma solução para o seu problema específico, mas estou colocando aqui porque este tópico é o principal resultado do Google para "SSL: CERTIFICATE_VERIFY_FAILED" e me levou a uma loucura.
Se você instalou o Python 3.6 no OSX e está recebendo o erro "SSL: CERTIFICATE_VERIFY_FAILED" ao tentar se conectar a um site https: //, é provável que o Python 3.6 no OSX não possua nenhum certificado e não possa validar nenhum SSL conexões. Esta é uma alteração para 3.6 no OSX e requer uma etapa pós-instalação, que instala o
certifi
pacote de certificados. Isso está documentado no Leia-me, que você deve encontrar em/Applications/Python\ 3.6/ReadMe.rtf
O ReadMe solicitará que você execute este script pós-instalação, que apenas instala
certifi
:/Applications/Python\ 3.6/Install\ Certificates.command
As notas de versão têm mais algumas informações: https://www.python.org/downloads/release/python-360/
fonte
/Applications/Python\ 3.7/Install\ Certificates.command
executando isso diretamente noterminal
! Obrigado @CraigGlennie & @muyong Agradeço aout-of-the-box-thinking
sua colocação aqui!Para expandir a resposta de Craig Glennie:
no Python 3.6.1 no MacOs Sierra
Inserir isso no terminal bash resolveu o problema:
fonte
sudo /Applications/Python\ 3.6/Install\ Certificates.command
se as permissões forem negadas.No Windows, o Python não analisa o certificado do sistema, ele usa o seu próprio localizado em
?\lib\site-packages\certifi\cacert.pem
.A solução para o seu problema:
cacert.pem
localização:from requests.utils import DEFAULT_CA_BUNDLE_PATH; print(DEFAULT_CA_BUNDLE_PATH)
cacert.pem
arquivo e cole seu certificado de validação de domínio no final do arquivo.fonte
lib\site-packages\certifi\cacert.pem
não existe no Python 2.7.10. E a pergunta é sobreurllib2
nãorequests
/usr/local/lib/python2.7/dist-packages/certifi-2015.09.06.2-py2.7.egg/certifi/cacert.pem
. Obrigado!Minha solução para Mac OS X:
1) Atualize para o Python 3.6.5 usando o instalador nativo do aplicativo Python baixado do site oficial da linguagem Python https://www.python.org/downloads/
Descobri que este instalador está cuidando da atualização dos links e links simbólicos para o novo Python muito melhor do que o homebrew.
2) Instale um novo certificado usando "./Install Certificates.command", que está no diretório Python 3.6 atualizado
fonte
Você pode tentar adicionar isso às suas variáveis de ambiente:
Observe que isso desabilitará toda a verificação HTTP, o que é um pouco uma abordagem de marreta; no entanto, se a verificação não for necessária, pode ser uma solução eficaz.
fonte
Eu estava tendo um problema semelhante, embora estivesse usando
urllib.request.urlopen
no Python 3.4, 3.5 e 3.6 . (Essa é uma parte do equivalente ao Python 3urllib2
, conforme nota na cabeça daurllib2
página de documentação do Python 2. )Minha solução foi
pip install certifi
instalarcertifi
, que possui:Então, no meu código, onde anteriormente eu tinha:
Eu a revisei para:
Se eu li a
urllib2.urlopen
documentação corretamente, ela também tem umcafile
argumento. Portanto,urllib2.urlopen([...], certifi.where())
pode funcionar para o Python 2.7 também.UPDATE (2020-01-01): A partir do Python 3.6, o
cafile
argumento tourlopen
foi descontinuado e ocontext
argumento deveria ser especificado. Eu encontrei o seguinte para trabalhar igualmente bem em 3.5 a 3.8:fonte
load_verify_locations
muda aSSLContext
instância e retornaNone
. Você deve usar em seucontext=ssl.create_default_context(cafile=certifi.where())
lugar. Veja osssl
documentos para mais informações.ssl
função errada . Veja editar; OK?Retirado daqui https://gist.github.com/michaelrice/a6794a017e349fc65d01
fonte
Como escrevi em um comentário, esse problema provavelmente está relacionado a esta resposta do SO .
Em resumo: existem várias maneiras de verificar o certificado. A verificação usada pelo OpenSSL é incompatível com os certificados raiz confiáveis que você possui no seu sistema. O OpenSSL é usado pelo Python.
Você pode tentar obter o certificado ausente da Autoridade de Certificação Primária Pública da Classe 3 da Verisign e usar a
cafile
opção de acordo com a documentação do Python :fonte
Eu tive um problema semelhante em uma das minhas máquinas Linux. A geração de certificados novos e a exportação de uma variável de ambiente apontando para o diretório de certificados corrigiram isso para mim:
fonte
Preciso adicionar outra resposta, porque, assim como Craig Glennie, fui atrás de um ganso selvagem devido às muitas postagens referentes a esse problema na Web.
Estou usando o MacPorts, e o que originalmente pensei ser um problema do Python era de fato um problema do MacPorts: ele não instala um certificado raiz com a instalação do openssl. A solução é
port install curl-ca-bundle
, como mencionado nesta postagem do blog .fonte
Eu encontrei isso aqui
Encontrei esta solução, insira este código no início do seu arquivo de origem:
Esse código faz a verificação desfeita para que a certificação ssl não seja verificada.
fonte
Para o Python 3.4+ no Centos 6/7 , Fedora , basta instalar a CA confiável desta maneira:
/etc/pki/ca-trust/source/anchors/
update-ca-trust force-enable
update-ca-trust extract
fonte
Solução para Anaconda
Minha configuração é o Anaconda Python 3.7 no MacOS com um proxy. Os caminhos são diferentes.
que no meu sistema produziu
Depois de saber para onde o certificado vai, concatenará o certificado usado pelo proxy até o final desse arquivo.
Eu já havia configurado o conda para trabalhar com meu proxy, executando:
Se você não se lembra onde está o seu certificado, pode encontrá-lo em
~/.condarc
:Agora concatene esse arquivo até o final
/miniconda3/ssl/cert.pem
e as solicitações deverão funcionar, esklearn.datasets
ferramentas específicas e similares deverão funcionar.Advertências adicionais
As outras soluções não funcionaram porque a configuração do Anaconda é um pouco diferente:
O caminho
Applications/Python\ 3.X
simplesmente não existe.O caminho fornecido pelos comandos abaixo é o caminho ERRADO
fonte
Eu penduro minha cabeça de meio vergonha, pois tive o mesmo problema, exceto que, no meu caso, o URL que eu estava acessando era válido, o certificado era válido. O que não era válido foi a minha conexão com a web. Falha ao adicionar detalhes do proxy no navegador (neste caso, o IE). Isso impediu que o processo de verificação acontecesse corretamente.
Adicionado nos detalhes do proxy e meu python ficou muito feliz.
fonte
O Python 2.7.12 (padrão, 29 de julho de 2016, 15:26:22) corrigiu o problema mencionado. Esta informação pode ajudar outra pessoa.
fonte
certifi
, que aparentemente são uma cópia dos certificados mantidos porrequests
, corrigiram o problema para mim no Python 3.4 a 3.6 .Estou surpreso que todas essas instruções não tenham resolvido meu problema. No entanto, o diagnóstico está correto (BTW, estou usando Mac e Python3.6.1). Então, para resumir a parte correta:
Para mim, o script não funciona e todas as instalações certifi e openssl também não foram corrigidas. Talvez porque eu tenha várias instalações python 2 e 3, além de muitas virtualenv. No final, preciso corrigi-lo manualmente.
Se isso ainda falhar com você. Em seguida, reinstale o OpenSSL também.
fonte
Como você, estou usando python 2.7 no meu antigo iMac (OS X 10.6.8), também encontrei o problema usando o urllib2.urlopen:
Meus programas estavam funcionando bem sem problemas de certificado SSL e, de repente (após a transferência de programas), eles travaram com esse erro de SSL.
O problema foi a versão do python usada:
Não há problema com https://www.python.org/downloads e python-2.7.9-macosx10.6.pkg
problema com o instalado pela ferramenta Homebrew : "brew install python", versão localizada em / usr / local / bin.
Um capítulo, chamado
Certificate verification and OpenSSL [CHANGED for Python 2.7.9]
,/Applications/Python 2.7/ReadMe.rtf
explica o problema com muitos detalhes.Portanto, verifique, faça o download e coloque em seu PATH a versão correta do python.
fonte
Python 2.7 no Amazon EC2 com centOS 7
Eu tive que definir a variável env
SSL_CERT_DIR
para apontar para oca-bundle
que estava localizado em/etc/ssl/certs/ca-bundle.crt
fonte
SSL_CERT_DIR
a/etc/ssl/certs
, e também a certeza oca-certificates
pacote foi instalado e atualizado.Fonte: https://access.redhat.com/articles/2039753
fonte
Experimentar
Funcionou para mim.
fonte
Dê uma olhada
/ Aplicativos / Python 3.6 / Instalar Certificates.command
Você também pode acessar Aplicações e clicar em Certificates.com
fonte
No meu caso eu estava recebendo este erro porque
requests
eurllib3
versões eram incompatíveis, dando o seguinte erro durante a instalação:fez o truque.
fonte
Outra solução Anaconda. Eu estava obtendo CERTIFICATE_VERIFY_FAILED no meu ambiente Python 2.7 no macOS. Acontece que os caminhos da conda eram ruins:
ambiente base (3.7):
2.7 ambiente (caminhos não existiam!):
O conserto:
fonte
O erro SSL: CERTIFICATE_VERIFY_FAILED também pode ocorrer porque um Certificado Intermediário está ausente no
ca-certificates
pacote no Linux. Por exemplo, no meu caso, o certificado intermediário " CA do Servidor Seguro DigiCert SHA2 " estava ausente noca-certificates
pacote, mesmo que o navegador Firefox o inclua. Você pode descobrir qual certificado está faltando, executando diretamente owget
comando no URL que está causando esse erro. Em seguida, você pode procurar o link correspondente ao arquivo CRT para esse certificado no site oficial (por exemplo, https://www.digicert.com/digicert-root-certificates.htm no meu caso) da Autoridade de certificação. Agora, para incluir o certificado que está faltando no seu caso, você pode executar os comandos abaixo usando o link de download do arquivo CRT:Depois disso, você pode testar novamente com o
wget
seu URL, bem como usando ourllib
pacote python . Para mais detalhes, consulte: https://bugs.launchpad.net/ubuntu/+source/ca-certificates/+bug/1795242fonte
Se você estiver no vCenter 6, adicione o certificado de autoridade de certificação vmware do vCenter à lista de CAs confiáveis de seu sistema operacional. Para baixar seu certificado, faça o seguinte
No Fedora
Ligações:
fonte
etapas de instalação do nltk (eu já tinha o python3 (3.6.2) instalado no MAC OS X
use a opção ignorar instalada para ignorar a desinstalação da versão anterior de seis, caso contrário, ele apresenta um erro durante a desinstalação e não encaminha o filme
Verifique a instalação do pip e python, use as versões '3'
Verifique se o NLTK está instalado
Instale o certificado SSL antes de instalar o livro de exemplos, caso contrário, iremos certificar o erro ao instalar os exemplos
Isso concluiu a instalação com sucesso de nltk e nltk_ata para exemplos de livros
fonte
Instalar
PyOpenSSL
usandopip
funcionou para mim (sem converter para PEM):fonte
Resolvi esse problema fechando o Fiddler (um proxy de depuração HTTP), se você tem um proxy ativado e tente novamente.
fonte
No python 2.7, a adição de detalhes da CA raiz confiável no final do arquivo C: \ Python27 \ lib \ pacotes de sites \ certifi \ cacert.pem ajudou
depois disso, executei (usando direitos de administrador) a instalação do pip --trusted-host pypi.python.org --trusted-host pypi.org --trusted-host files.pythonhosted.org packageName
fonte