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?

Author: Oliver, 2017-10-06

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.

 8
Author: Steffen Ullrich, 2017-10-06 11:40:58
import requests
html = requests.get("https://hcaidcs.phe.org.uk/WebPages/GeneralHomePage.aspx",verify=False).text

Devias escrever assim, e eu verifiquei.

 -5
Author: kerberos, 2017-10-06 11:16:35