Mensagem de erro
There was a problem confirming the ssl certificate: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed
Também aparece 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
O pip imprime o erro como “Could not fetch URL <url>: There was a problem confirming the ssl certificate: … - skipping”, depois de várias linhas “WARNING: Retrying (Retry(total=…)) after connection broken by 'SSLError(…)'”. A URL e o motivo final variam.
pip — index or find-links URL over HTTPS (pip 24.2+ verifies with truststore by default)
O que significa
O pip não conseguiu verificar o certificado TLS do índice de pacotes (ou de uma URL de find-links), por isso pulou essa página e geralmente termina com “Could not find a version that satisfies the requirement”. O motivo depois dos dois-pontos é o resultado da verificação do OpenSSL. Desde o pip 24.2, o pip verifica com o trust store do sistema operacional por meio do pacote truststore; portanto, ou a CA não está no repositório do sistema operacional, ou o pip foi instruído a usar outro bundle.
Por que acontece
Um índice privado (Artifactory, Nexus, devpi) com um certificado da empresa
comumEspelhos internos de pacotes usam certificados de uma CA da empresa que está presente nos notebooks gerenciados, mas não em imagens de CI, contêineres ou máquinas virtuais recém-criadas.
Um proxy com inspeção de TLS na frente do pypi.org
comumEm redes corporativas, o pypi.org e o files.pythonhosted.org são reassinados pelo proxy. Sem a raiz do proxy no trust store que o pip usa, toda instalação falha.
O pip está configurado para usar o certifi em vez do repositório do sistema operacional
ocasionalCom --use-deprecated=legacy-certs, com uma configuração cert explícita apontando para o certifi ou com o pip rodando no Python 3.9 ou anterior (onde o truststore não está disponível), as raízes adicionadas ao repositório do sistema operacional não são usadas.
Um pip antigo que veio com a instalação do Python
ocasionalO pip anterior à 24.2 sempre usava o bundle do certifi embutido nele. Muitas imagens base e ambientes virtuais ainda trazem essas versões.
Como corrigir
- 1.
Instalar a CA no trust store do sistema operacional
Com o pip 24.2+ no Python 3.10+, o pip confia automaticamente nas raízes do repositório do sistema (ou do chaveiro do macOS / do repositório do Windows). Atualize o pip se ele for mais antigo.
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.
Fornecer ao pip um bundle de CAs explicitamente
global.cert na configuração do pip, PIP_CERT ou --cert fazem o pip verificar com esse arquivo. Inclua também as raízes públicas se o pip também acessar o pypi.org.
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 o índice privado uma única vez
Coloque index-url e cert no pip.conf (ou pip.ini) para que toda execução do pip, inclusive as que acontecem dentro de ferramentas de build, use esses valores.
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 temporário: --trusted-host
A opção --trusted-host desativa a verificação de certificados para esse host e permite que o pip use HTTP não criptografado nele. Ela confirma o diagnóstico, mas qualquer coisa baixada dessa forma pode ter sido substituída no caminho; não a mantenha na configuração.
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