Mensaje de error
There was a problem confirming the ssl certificate: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed
También se muestra como
- Could not fetch URL https://pypi.example.com/simple/requests/: There was a problem confirming the ssl certificate: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate
pip lo imprime como «Could not fetch URL <url>: There was a problem confirming the ssl certificate: … - skipping», después de varias líneas «WARNING: Retrying (Retry(total=…)) after connection broken by 'SSLError(…)'». La URL y el motivo final varían.
pip — index or find-links URL over HTTPS (pip 24.2+ verifies with truststore by default)
Qué significa
pip no pudo verificar el certificado TLS del índice de paquetes (o de una URL de find-links), así que omitió esa página y suele terminar con «Could not find a version that satisfies the requirement». El motivo que aparece después de los dos puntos es el resultado de la verificación de OpenSSL. Desde pip 24.2, pip verifica con el almacén de confianza del sistema operativo a través de truststore, así que o bien la CA falta en el almacén del sistema operativo, o bien se le indica a pip que use otro bundle.
Por qué ocurre
Un índice privado (Artifactory, Nexus, devpi) con un certificado de la empresa
frecuenteLas réplicas internas de paquetes usan certificados de una CA de la empresa que está presente en los portátiles gestionados, pero no en las imágenes de CI, los contenedores ni las máquinas virtuales recién creadas.
Un proxy que inspecciona TLS delante de pypi.org
frecuenteEn las redes de empresa, el proxy vuelve a firmar pypi.org y files.pythonhosted.org. Sin su raíz en el almacén de confianza que usa pip, todas las instalaciones fallan.
pip está configurado para usar certifi en lugar del almacén del sistema operativo
ocasional--use-deprecated=legacy-certs, un ajuste cert explícito que apunta a certifi o un pip que se ejecuta en Python 3.9 o anterior (donde truststore no está disponible) hacen que no se usen las raíces añadidas al almacén del sistema operativo.
Un pip antiguo incluido en la instalación de Python
ocasionalLas versiones de pip anteriores a 24.2 siempre usaban el bundle de certifi que traían integrado. Muchas imágenes base y entornos virtuales todavía incluyen esas versiones.
Cómo solucionarlo
- 1.
Instalar la CA en el almacén de confianza del sistema operativo
Con pip 24.2+ en Python 3.10+, las raíces del almacén del sistema (o del llavero de macOS / del almacén de Windows) se consideran de confianza automáticamente. Actualiza pip si es más antiguo.
bash # pip >= 24.2 uses the OS trust store (truststore): add the CA there sudo cp corp-root-ca.pem /usr/local/share/ca-certificates/corp-root-ca.crt sudo update-ca-certificates python3 -m pip --version # upgrade pip itself if it is older than 24.2 - 2.
Indicar a pip un bundle de CA explícitamente
global.cert en la configuración de pip, PIP_CERT o --cert hacen que pip verifique con ese archivo. Si pip también se conecta a pypi.org, incluye además las raíces públicas.
bash # A CA bundle for pip only (one of these): python3 -m pip config set global.cert /etc/ssl/private-ca/corp-ca-bundle.pem export PIP_CERT=/etc/ssl/private-ca/corp-ca-bundle.pem python3 -m pip install --cert /etc/ssl/private-ca/corp-ca-bundle.pem requests - 3.
Configurar el índice privado una sola vez
Pon index-url y cert en pip.conf (o pip.ini) para que todas las invocaciones de pip, incluidas las que hacen las herramientas de compilación, los usen.
ini # pip.conf (Linux: ~/.config/pip/pip.conf, Windows: %APPDATA%\pip\pip.ini) [global] index-url = https://pypi.example.com/simple/ cert = /etc/ssl/private-ca/corp-ca-bundle.pem - 4.
Diagnóstico temporal: --trusted-host
--trusted-host desactiva la verificación de certificados para ese host y permite que pip use allí HTTP sin cifrar. Confirma el diagnóstico, pero cualquier cosa descargada así podría haberse sustituido por el camino; no lo dejes en la configuración.
bash # Temporary diagnostic only: --trusted-host disables certificate checks for that host python3 -m pip download --no-deps -d /tmp/dl --index-url https://pypi.example.com/simple/ \ --trusted-host pypi.example.com requests