O Python pede erro SSL - a verificação do certificado foi mal-sucedida
este código
import requests
requests.get("https://hcaidcs.phe.org.uk/WebPages/GeneralHomePage.aspx")
está a dar-me este erro
[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)
Eu não sei praticamente nada sobre SSL, mas eu tentei baixar o certificado do site e apontar para esse arquivo usando a opção {[[2]}, mas ele não funcionou. Está a escapar-me alguma coisa?
2 answers
Como já foi referido num comentário: o site tem uma má implementação SSL como pode ser visto no relatório do SSLLabs. A parte principal deste relatório sobre o seu problema é:
A cadeia de certificados deste servidor está incompleta. Grau limitado a B.
Isto significa que o servidor não está a enviar a cadeia de certificados completa como é necessário para verificar o certificado. Isto significa que você precisa adicionar os certificados em falta ao validar. Por isto você necessidade de incluir o PEM para o certificado de cadeia em falta C=US, O = DigiCert Inc, OU=www.digicert.com, CN=DigiCert SHA2 High Assurance Server CA and also for the root CA C=US, O= DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance EV Root CA info a file my_trust_store.pem
e então você pode chamar:
requests.get("https://...", verify='my_trust_store.pem')
... mas eu tentei baixar o certificado do site e apontar para esse arquivo usando a opção Verificar
Isto não funcionará com folha normal certificado. Uma vez que a pilha de SSL do Python é baseada no OpenSSL e o OpenSSL espera apenas as autoridades de certificados de confiança no armazém de confiança (ou seja, dado com verify
) e um certificado do servidor não é um certificado da AC, não irá ajudar a adicioná-lo ao armazém de confiança.
import requests
html = requests.get("https://hcaidcs.phe.org.uk/WebPages/GeneralHomePage.aspx",verify=False).text
Devias escrever assim, e eu verifiquei.