Risposta rapida
Cosa significa SSL: CERTIFICATE_VERIFY_FAILED con un proxy?
CERTIFICATE_VERIFY_FAILED significa che il tuo client non è riuscito a convalidare il certificato TLS del sito web. Attraverso un proxy CONNECT come il gateway CrawlRelay, TLS avviene end-to-end, quindi il proxy non ne è la causa. Controlla da parte tua: un bundle CA obsoleto, antivirus o firewall aziendale che ispezioni HTTPS, o un orologio di sistema errato. Mai risolvere con verify=False in produzione.
SSL: CERTIFICATE_VERIFY_FAILED a colpo d'occhio
| Errore | SSL: CERTIFICATE_VERIFY_FAILED |
|---|---|
| Tipo | Errore certificato TLS nel client |
| Inviato da | La tua libreria TLS, quando non riesce a convalidare il certificato del sito web |
| Definito in | X.509 path validation: RFC 5280; TLS 1.3: RFC 8446 |
| Riprovarlo? | No. Sistema il trust store o la rete |
| Prima verifica | Testa la stessa URL senza il proxy sulla stessa macchina |
Cosa significa SSL: CERTIFICATE_VERIFY_FAILED?
Durante la stretta di mano TLS, il sito invia una catena di certificati. Il tuo client la verifica contro una lista di autorità di fiducia, il trust store, e controlla nomi e date. Se qualche controllo fallisce, si ferma.
Con un tunnel CONNECT, il proxy passa la stretta di mano intatta, quindi il certificato che vedi è quello reale del sito. Qualcosa che inserisce il proprio certificato, come software di ispezione, o un trust store obsoleto sulla tua macchina, è la causa più comune.
Com'è CERTIFICATE_VERIFY_FAILED in Python, curl, Node.js e browser?
Lo stesso errore si presenta in modo diverso in ogni strumento. Questi sono i messaggi da cercare nei log:
- Python:
[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate - Node.js:
UNABLE_TO_GET_ISSUER_CERT_LOCALLYoSELF_SIGNED_CERT_IN_CHAIN - curl:
curl: (60) SSL certificate problem: unable to get local issuer certificate - Browser:
NET::ERR_CERT_AUTHORITY_INVALID
Cosa causa CERTIFICATE_VERIFY_FAILED?
Probabilmente prima:
- Un bundle CA obsoleto, ad esempio un vecchio pacchetto
certifiin Python. - Ispezione HTTPS da parte di antivirus, firewall aziendale o proxy di debug, che presenta il proprio certificato.
- Orologio di sistema errato che fa sembrare i certificati validi scaduti o non ancora validi.
- Un sito con catena rotta, mancante di un certificato intermedio.
- Un'immagine container senza il pacchetto di certificati CA di sistema.
Come diagnostico CERTIFICATE_VERIFY_FAILED passo dopo passo?
- Esegui la stessa richiesta senza il proxy. Se fallisce anche lì, il proxy non è coinvolto.
- Stampa l'emittente del certificato con
openssl s_cliento curl-v: un emittente che coincide con antivirus o firewall indica ispezione. - Controlla data e ora di sistema.
- Aggiorna il bundle CA e riprova.
# 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_URLCome risolvo CERTIFICATE_VERIFY_FAILED?
- Aggiorna
certifi(pip install -U certifi) o il pacchetto CA del sistema. - Aggiungi il certificato di ispezione aziendale al trust store se la tua rete richiede ispezione, oppure esegui lo scraper fuori da quella rete.
- Sistema l'orologio con sincronizzazione di rete.
- Installa i certificati CA nelle immagini container minimaliste, ad esempio il pacchetto
ca-certificates. - Non disabilitare la verifica nel codice che invia credenziali o raccoglie dati critici.
Devo riprovare dopo CERTIFICATE_VERIFY_FAILED?
Non riprovare: lo stesso trust store fallirà nello stesso modo. Sistema il trust store, l'orologio o il percorso di rete e riprova.
Come si applica SSL: CERTIFICATE_VERIFY_FAILED a CrawlRelay?
La porta HTTP di CrawlRelay tunnelizza HTTPS con CONNECT, quindi il certificato controllato dal client è quello inviato dal sito. Se l'errore appare solo tramite il gateway e mai senza, contatta il supporto con il nome host di destinazione e l'errore completo per verifiche sull'uscita.
Gateway: gw.crawlrelay.com, porta 7777 (HTTP, HTTPS tramite CONNECT) e porta 7778 (SOCKS5). Formato username: USERNAME-country-{cc}-state-{state}-city-{city}-zip-{zip}-asn-{asn}-session-{id}-ttl-{minutes}. Correlato: SSL: WRONG_VERSION_NUMBER · Connection reset · Guida Python.
SSL: CERTIFICATE_VERIFY_FAILED: domande frequenti dagli sviluppatori
Un proxy può causare errori di certificato SSL?
Un proxy che intercetta può, perché presenta il proprio certificato. Un proxy tunnel CONNECT no, perché inoltra solo byte criptati e non vede il contenuto della stretta di mano. Esegui la stessa richiesta senza proxy: se l'errore persiste, la causa è sulla tua macchina o rete.
È sicuro usare verify=False per lo scraping?
Non come soluzione. Nasconde l'ispezione e catene rotte, e un attaccante sul percorso potrebbe leggere o modificare il traffico, inclusi token e cookie. Usalo solo per un test locale rapido, mai in un processo automatico o che invia credenziali.
Perché fallisce in Docker ma funziona sul mio portatile?
Le immagini container minimaliste spesso non includono certificati CA, quindi nessun certificato può essere validato. Installa il pacchetto CA di sistema nell'immagine o affidati al bundle certifi in Python. Controlla anche che l'orologio del container sia corretto.
Altri errori proxy in questo riferimento
Codici di stato HTTP
- 401 Unauthorized vs 407
- 403 Forbidden
- 407 Proxy Authentication Required
- 429 Too Many Requests
- 502 Bad Gateway
- 503 Service Unavailable
- 504 Gateway Timeout
Errori del browser e client
Errori di connessione e TLS
Proxy residenziali con documentazione che copre i casi di errore
Proxy residenziali CrawlRelay da 0,50 USD/GB, traffico che non scade mai.