La communication sécurisée sur internet repose fortement sur les certificats Secure Sockets Layer (SSL). Lorsque votre code Python rencontre une erreur « SSL CERTIFICATE_VERIFY_FAILED », cela signale un échec de vérification de l’authenticité du certificat SSL du serveur. Ce guide complet disséquera les causes de cette erreur et fournira des solutions pratiques.
Table des matières
- Comprendre les certificats SSL
- Causes profondes de l’erreur SSL CERTIFICATE_VERIFY_FAILED
- Stratégies efficaces de dépannage
- Bonnes pratiques pour les connexions sécurisées
Comprendre les certificats SSL
Un certificat SSL est une information numérique qui authentifie l’identité d’un site web, permettant une communication HTTPS sécurisée. Il utilise la cryptographie à clé publique pour chiffrer les données échangées entre le client (votre programme Python) et le serveur. Lors d’une connexion HTTPS, votre code Python (ou navigateur) vérifie le certificat du serveur en contrôlant sa validité, son émetteur et son statut de révocation.
Causes profondes de l’erreur SSL CERTIFICATE_VERIFY_FAILED
L’erreur redoutée « SSL CERTIFICATE_VERIFY_FAILED » apparaît lorsque ce processus de vérification échoue. Plusieurs facteurs peuvent y contribuer :
- Certificats auto-signés : Les certificats émis par le propriétaire du site web, et non par une autorité de certification (AC) de confiance, sont souvent signalés. Python ne fait confiance que par défaut aux AC bien connues.
- Certificats expirés : Un certificat expiré rend la connexion non fiable.
- Incohérences de l’horloge système : La validité du certificat est sensible au temps ; une horloge système incorrecte peut provoquer un échec de vérification.
- Certificats révoqués : Un certificat compromis peut être révoqué par son émetteur.
- Non-correspondance du nom d’hôte : Le nom commun (CN) ou les noms alternatifs du sujet (SAN) du certificat doivent correspondre au nom d’hôte auquel vous vous connectez.
- Problèmes de chaîne d’AC : Des problèmes au sein de la chaîne d’autorité de certification briseront la vérification. Le certificat nécessite une chaîne de confiance vérifiable jusqu’à une AC racine de confiance.
- Problèmes de connectivité réseau : Des interruptions réseau peuvent empêcher la vérification du certificat.
Stratégies efficaces de dépannage
La solution dépend de la cause sous-jacente. Voici une approche structurée :
- Vérifier le certificat (avec précaution) : Pour les certificats auto-signés ou non approuvés, vous pouvez temporairement désactiver la vérification (fortement déconseillé en production) :
import ssl import urllib.request context = ssl._create_unverified_context() response = urllib.request.urlopen('https://votre-site-web.com', context=context) # ... traiter la réponse ...
- Ajouter le certificat à votre magasin de certificats de confiance : Pour les certificats auto-signés, ajoutez-le au magasin de certificats de confiance de votre système. Ce processus varie selon le système d’exploitation.
- Corriger l’heure système : Assurez-vous que votre horloge système est précise.
- Vérifier le nom d’hôte : Vérifiez que le nom d’hôte dans votre code correspond au CN ou aux SAN du certificat.
- Utiliser la bibliothèque
requests
(recommandé) : La bibliothèquerequests
offre une gestion SSL robuste.verify=True
(par défaut) active une vérification appropriée. Pour les paquets CA personnalisés :import requests try: response = requests.get('https://votre-site-web.com', verify=True) response.raise_for_status() # Lever HTTPError pour les mauvaises réponses (4xx ou 5xx) # ... traiter la réponse ... except requests.exceptions.RequestException as e: print(f"Une erreur s'est produite : {e}") #Utilisation d'un paquet CA personnalisé : response = requests.get('https://votre-site-web.com', verify='/chemin/vers/votre/paquet_ca.pem')
- Vérifier la connectivité réseau : Éliminez les problèmes de réseau.
Bonnes pratiques pour les connexions sécurisées
Privilégiez l’utilisation de certificats valides provenant d’AC de confiance. Utilisez la bibliothèque requests
avec une vérification appropriée (verify=True
). Évitez de désactiver la vérification sauf lors de tests contrôlés. Mettez régulièrement à jour les certificats et l’horloge de votre système pour une sécurité optimale.