La comunicación segura a través de internet depende en gran medida de los certificados Secure Sockets Layer (SSL). Cuando su código Python encuentra un error «SSL CERTIFICATE_VERIFY_FAILED», indica un fallo en la verificación de la autenticidad del certificado SSL del servidor. Esta guía completa analizará las causas de este error y proporcionará soluciones prácticas.
Tabla de Contenido
- Comprensión de los Certificados SSL
- Causas Fundamentales de SSL CERTIFICATE_VERIFY_FAILED
- Estrategias Efectivas de Resolución de Problemas
- Mejores Prácticas para Conexiones Seguras
Comprensión de los Certificados SSL
Un certificado SSL es una credencial digital que autentica la identidad de un sitio web, permitiendo una comunicación HTTPS segura. Aprovecha la criptografía de clave pública para cifrar los datos intercambiados entre el cliente (su programa Python) y el servidor. Durante una conexión HTTPS, su código Python (o navegador) verifica el certificado del servidor comprobando su validez, emisor y estado de revocación.
Causas Fundamentales de SSL CERTIFICATE_VERIFY_FAILED
El temido error «SSL CERTIFICATE_VERIFY_FAILED» surge cuando falla este proceso de verificación. Varios factores pueden contribuir:
- Certificados autofirmados: Los certificados emitidos por el propietario del sitio web, no por una Autoridad de Certificación (CA) de confianza, a menudo se marcan. Python, por defecto, solo confía en las CA conocidas.
- Certificados caducados: Un certificado caducado hace que la conexión no sea confiable.
- Imprecisión del reloj del sistema: La validez del certificado es sensible al tiempo; un reloj del sistema incorrecto puede causar un fallo de verificación.
- Certificados revocados: Un certificado comprometido puede ser revocado por su emisor.
- Inconsistencia del nombre de host: El Nombre Común (CN) o los Nombres Alternativos del Sujeto (SAN) del certificado deben coincidir con el nombre de host al que se está conectando.
- Problemas en la cadena de CA: Los problemas dentro de la cadena de confianza de la autoridad de certificación interrumpirán la verificación. El certificado necesita una cadena de confianza verificable hasta una CA raíz de confianza.
- Problemas de conectividad de red: Las interrupciones de la red pueden impedir la verificación del certificado.
Estrategias Efectivas de Resolución de Problemas
La solución depende de la causa subyacente. Aquí hay un enfoque estructurado:
- Verificar el certificado (con precaución): Para certificados autofirmados o no confiables, puede deshabilitar temporalmente la verificación (fuertemente desaconsejado para producción):
import ssl import urllib.request context = ssl._create_unverified_context() response = urllib.request.urlopen('https://your-website.com', context=context) # ... procesar la respuesta ...
- Agregar el certificado a su almacén de confianza: Para los certificados autofirmados, agréguelo al almacén de certificados de confianza de su sistema. Este proceso varía según el sistema operativo.
- Corregir la hora del sistema: Asegúrese de que el reloj de su sistema sea preciso.
- Verificar el nombre de host: Verifique que el nombre de host en su código coincida con el CN o los SAN del certificado.
- Utilizar la biblioteca
requests
(Recomendado): La bibliotecarequests
ofrece un manejo robusto de SSL.verify=True
(predeterminado) habilita la verificación adecuada. Para paquetes CA personalizados:import requests try: response = requests.get('https://your-website.com', verify=True) response.raise_for_status() # Lanzar HTTPError para respuestas incorrectas (4xx o 5xx) # ... procesar la respuesta ... except requests.exceptions.RequestException as e: print(f"Ocurrió un error: {e}") #Usando un paquete CA personalizado: response = requests.get('https://your-website.com', verify='/path/to/your/ca_bundle.pem')
- Comprobar la conectividad de red: Descartar problemas de red.
Mejores Prácticas para Conexiones Seguras
Priorice el uso de certificados válidos de CA de confianza. Emplee la biblioteca requests
con la verificación adecuada (verify=True
). Evite deshabilitar la verificación excepto durante las pruebas controladas. Actualice regularmente los certificados y el reloj de su sistema para una seguridad óptima.