web-dev-qa-db-fra.com

Python demande une erreur SSL - échec de la vérification du certificat

Ce code

import requests
requests.get("https://hcaidcs.phe.org.uk/WebPages/GeneralHomePage.aspx")

me donne cette erreur

[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)

Je ne connais pratiquement rien à SSL, mais j'ai essayé de télécharger le certificat du site et de pointer ce fichier à l'aide de l'option verify, mais cela n'a pas fonctionné. Est-ce que je manque quelque chose?

9
Oliver

Comme déjà signalé dans un commentaire: le site a une mauvaise implémentation SSL, comme le montre le rapport SSLLabs . La partie principale de ce rapport concernant votre problème est:

La chaîne de certificats de ce serveur est incomplète. Grade plafonné à B.

Cela signifie que le serveur n'envoie pas la chaîne de certificats complète, ce qui est nécessaire pour vérifier le certificat. Cela signifie que vous devez ajouter vous-même les certificats manquants lors de la validation. Pour cela, vous devez inclure le fichier PEM pour le certificat de chaîne manquant C = US, O = DigiCert Inc, OU = www.digicert.com, CN = Autorité de certification DigiCert SHA2 High Assurance Server et également pour le compte racine CA C = US, O = DigiCert Inc., OU = www.digicert.com, CN = Autorité de certification racine EV haute assurance DigiCert info un fichier my_trust_store.pem et ensuite vous pouvez appeler:

requests.get("https://...", verify='my_trust_store.pem')

... mais j'ai essayé de télécharger le certificat du site et de pointer ce fichier à l'aide de l'option de vérification

Cela ne fonctionnera pas avec les certificats feuille normaux. Puisque la pile SSL de Python est basée sur OpenSSL et que OpenSSL n'attend que des autorités de certification approuvées dans le magasin de données de confiance (c'est-à-dire donné avec verify) et qu'un certificat de serveur n'est pas un certificat de CA, il n’aidera pas à l’ajouter au Trust Store.

14
Steffen Ullrich