Resposta rápida
O que SSL: CERTIFICATE_VERIFY_FAILED significa com um proxy?
CERTIFICATE_VERIFY_FAILED significa que seu cliente não conseguiu validar o certificado TLS do site. Através de um proxy CONNECT como o gateway CrawlRelay, o TLS ocorre de ponta a ponta, então o proxy não é a causa. Verifique do seu lado: um bundle de CA desatualizado, antivírus ou firewall corporativo que inspeciona HTTPS, ou relógio do sistema errado. Nunca corrija com verify=False em produção.
SSL: CERTIFICATE_VERIFY_FAILED de relance
| Erro | SSL: CERTIFICATE_VERIFY_FAILED |
|---|---|
| Tipo | Erro no certificado TLS no cliente |
| Enviado por | Sua biblioteca TLS, quando não consegue validar o certificado do site |
| Definido em | X.509 path validation: RFC 5280; TLS 1.3: RFC 8446 |
| Tentar novamente? | Não. Corrija o trust store ou a rede |
| Primeira verificação | Teste a mesma URL sem o proxy na mesma máquina |
O que SSL: CERTIFICATE_VERIFY_FAILED significa?
Durante o handshake TLS, o site envia uma cadeia de certificados. Seu cliente verifica contra uma lista de autoridades confiáveis, o trust store, e checa nomes e datas. Se alguma verificação falhar, ele para.
Com um túnel CONNECT, o proxy passa o handshake sem alterações, então o certificado que você vê é o do próprio site. Algo que insere seu próprio certificado, como software de inspeção, ou um trust store desatualizado na sua máquina, é a causa usual.
Como CERTIFICATE_VERIFY_FAILED aparece em Python, curl, Node.js e navegadores?
A mesma falha aparece de forma diferente em cada ferramenta. Estas são as mensagens para buscar nos seus logs:
- Python:
[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate - Node.js:
UNABLE_TO_GET_ISSUER_CERT_LOCALLYouSELF_SIGNED_CERT_IN_CHAIN - curl:
curl: (60) SSL certificate problem: unable to get local issuer certificate - Navegadores:
NET::ERR_CERT_AUTHORITY_INVALID
O que causa CERTIFICATE_VERIFY_FAILED?
Mais provável inicialmente:
- Um bundle de CA desatualizado, por exemplo um pacote
certifiantigo no Python. - Inspeção HTTPS por antivírus, firewall corporativo ou proxy de depuração, que apresenta seu próprio certificado.
- Relógio do sistema errado que faz certificados válidos parecerem expirados ou ainda não válidos.
- Um site com cadeia quebrada, faltando um certificado intermediário.
- Uma imagem de container sem o pacote de certificados CA do sistema.
Como diagnosticar CERTIFICATE_VERIFY_FAILED passo a passo?
- Execute a mesma requisição sem o proxy. Se também falhar, o proxy não está envolvido.
- Imprima o emissor do certificado com
openssl s_clientou curl-v: um emissor nomeado como seu antivírus ou firewall indica interceptação. - Verifique a data e hora do sistema.
- Atualize o bundle de CA e teste novamente.
# Use the URL that fails; with https://api.ipify.org instead, you test the gateway alone.
# "HTTP/1.1 200 Connection established" first, then the site's own status: the site answered.
curl -v -x http://USERNAME:[email protected]:7777 https://TARGET_URL
# Same test through the SOCKS5 port, with DNS resolved at the exit
curl -v --socks5-hostname gw.crawlrelay.com:7778 --proxy-user USERNAME:PASSWORD https://TARGET_URLComo corrigir CERTIFICATE_VERIFY_FAILED?
- Atualize
certifi(pip install -U certifi) ou o pacote CA do seu sistema. - Adicione o certificado de inspeção da sua empresa ao trust store se sua rede exigir inspeção, ou execute o scraper fora dessa rede.
- Corrija o relógio com sincronização via rede.
- Instale certificados CA em imagens de container enxutas, por exemplo o pacote
ca-certificates. - Não desative a verificação no código que envia credenciais ou coleta dados em que você confia.
Devo tentar novamente após CERTIFICATE_VERIFY_FAILED?
Não tente novamente: o mesmo trust store falha da mesma forma. Corrija o trust store, o relógio ou o caminho da rede, e então execute novamente.
Como SSL: CERTIFICATE_VERIFY_FAILED se aplica ao CrawlRelay?
A porta HTTP do CrawlRelay faz túneis HTTPS com CONNECT, então o certificado que seu cliente verifica é o que o site envia. Se o erro aparece só pelo gateway e nunca sem ele, entre em contato com o suporte com o hostname alvo e o erro completo para que possamos verificar o lado de saída.
Gateway: gw.crawlrelay.com, porta 7777 (HTTP, HTTPS via CONNECT) e porta 7778 (SOCKS5). Formato do usuário: USERNAME-country-{cc}-state-{state}-city-{city}-zip-{zip}-asn-{asn}-session-{id}-ttl-{minutes}. Relacionado: SSL: WRONG_VERSION_NUMBER · Connection reset · Guia Python.
SSL: CERTIFICATE_VERIFY_FAILED: perguntas que desenvolvedores fazem
Um proxy pode causar erros SSL?
Um proxy interceptador pode, porque apresenta seu próprio certificado. Um proxy túnel CONNECT não pode, porque ele só encaminha bytes criptografados e nunca vê o conteúdo do handshake. Execute a mesma requisição sem o proxy: se o erro continuar, a causa está na sua máquina ou rede.
É seguro usar verify=False para scraping?
Não como correção. Isso esconde interceptação e cadeias quebradas, e um atacante no caminho poderia ler ou alterar seu tráfego, incluindo tokens e cookies. Use somente para um teste rápido local, e nunca em um trabalho que roda sem supervisão ou envia credenciais.
Por que falha no Docker mas funciona no meu laptop?
Imagens de container enxutas muitas vezes não vêm com certificados CA, então nenhum certificado pode ser validado. Instale o pacote CA do sistema na imagem, ou use o bundle certifi no Python. Verifique também se o relógio do container está correto.
Outros erros de proxy nesta referência
Códigos de status HTTP
- 401 Unauthorized vs 407
- 403 Forbidden
- 407 Proxy Authentication Required
- 429 Too Many Requests
- 502 Bad Gateway
- 503 Service Unavailable
- 504 Gateway Timeout
Erros no navegador e cliente
Erros de conexão e TLS
Proxies residenciais com documentação que cobre os casos de falha
CrawlRelay proxies residenciais a partir de US$ 0,50/GB, tráfego que nunca expira.