Ao baixar pesos de modelo recentemente, apareceu a seguinte mensagem de erro: urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1123)>
, o problema do erro é que a verificação do certificado falhou.Essa situação ocorre quando o site usa um certificado autoassinado ou há um problema com o certificado raiz do sistema.
razão:
Desde a versão 2.7.9, o Python habilitou a função de verificação de certificado do servidor por padrão. Se a verificação do certificado falhar, as operações subsequentes serão rejeitadas; isso pode impedir ataques man-in-the-middle e permitir que o cliente garanta que o servidor está na verdade, quem afirma ser. Se for um certificado autoassinado, porque o certificado CA do sistema geral não contém o conteúdo do certificado CA autoassinado, a verificação do certificado falha.
solução
1: Desligue a função de verificação do certificado do servidor através da configuração variável do departamento de meio ambiente
Execute o seguinte comando shell (supondo que você esteja usando o shell bash, zsh é o mesmo):
echo "export PYTHONHTTPSVERIFY=0" >> ~/.bashrc
source ~/.bashrc
echo "export PYTHONHTTPSVERIFY=0" >> ~/.zshrc
source ~/.zshrc
2: Cancele a função de verificação do certificado do servidor (impacto global)
No início do arquivo, adicione o seguinte código:
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
3: Crie um parâmetro de contexto que cancela a verificação do certificado do servidor (afetado pelo código de solicitação atual)
Um exemplo de uso é o seguinte:
import ssl
context = ssl._create_unverified_context()
urllib.urlopen('https://www.baidu.com', context=context)
4: Defina o parâmetro de verificação de solicitações como Falso para cancelar a função de verificação
Um exemplo de uso é o seguinte:
import requests
requests.get(url, verify=False)
5: Especifique manualmente o certificado CA (Python3)
Um exemplo de uso é o seguinte:
import urllib
urllib.request.urlopen("https://example.com/some/info", cafile="ca.pem")
Quando houver um problema com o certificado raiz do sistema, você pode usar o certificado CA fornecido pela certifi:
import certifi
import urllib
urllib.request.urlopen('https://example.com/bar/baz.html',
cafile=certifi.where())