Szybka odpowiedź
Co oznacza SSL: CERTIFICATE_VERIFY_FAILED w kontekście proxy?
CERTIFICATE_VERIFY_FAILED oznacza, że Twój klient nie mógł zweryfikować certyfikatu TLS witryny. Przez proxy CONNECT, jak brama CrawlRelay, TLS działa end-to-end, więc proxy nie jest tego przyczyną. Sprawdź u siebie: przestarzały pakiet CA, antywirus lub zaporę biurową inspekcyjną HTTPS albo zły zegar systemowy. Nigdy nie naprawiaj tego verify=False w produkcji.
SSL: CERTIFICATE_VERIFY_FAILED w skrócie
| Błąd | SSL: CERTIFICATE_VERIFY_FAILED |
|---|---|
| Typ | Błąd certyfikatu TLS po stronie klienta |
| Wysłane przez | Twoja biblioteka TLS, gdy nie może zweryfikować certyfikatu strony |
| Zdefiniowano w | X.509 path validation: RFC 5280; TLS 1.3: RFC 8446 |
| Spróbować ponownie? | Nie. Napraw magazyn zaufania lub sieć |
| Najpierw sprawdź | Przetestuj ten sam URL bez proxy na tym samym urządzeniu |
Co oznacza SSL: CERTIFICATE_VERIFY_FAILED?
Podczas negocjacji TLS witryna przesyła łańcuch certyfikatów. Twój klient sprawdza go względem listy zaufanych urzędów, magazynu zaufania, oraz weryfikuje nazwy i daty. Jeśli którykolwiek test zawiedzie, połączenie jest przerywane.
Przy tunelu CONNECT proxy tylko przekazuje negocjację bez zmian, więc widoczny certyfikat jest własnością witryny. Zwykłe przyczyny to oprogramowanie inspekcyjne wstrzykujące własny certyfikat lub przestarzały magazyn zaufania na Twoim urządzeniu.
Jak wygląda CERTIFICATE_VERIFY_FAILED w Python, curl, Node.js i przeglądarkach?
Ten sam błąd wyświetla się inaczej w każdym narzędziu. Oto komunikaty, które warto wyszukać w logach:
- Python:
[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate - Node.js:
UNABLE_TO_GET_ISSUER_CERT_LOCALLYlubSELF_SIGNED_CERT_IN_CHAIN - curl:
curl: (60) SSL certificate problem: unable to get local issuer certificate - Przeglądarki:
NET::ERR_CERT_AUTHORITY_INVALID
Co powoduje CERTIFICATE_VERIFY_FAILED?
Najczęściej na początku:
- Przestarzały pakiet CA, na przykład stary pakiet
certifiw Pythonie. - Inspekcja HTTPS przez antywirusa, zaporę firmową lub proxy debugujące, które prezentuje własny certyfikat.
- Zły zegar systemowy, który sprawia, że ważne certyfikaty wyglądają na wygasłe lub jeszcze nieważne.
- Strona z uszkodzonym łańcuchem certyfikatów, brak certyfikatu pośredniego.
- Obraz kontenera bez pakietu certyfikatów systemowych CA.
Jak krok po kroku zdiagnozować CERTIFICATE_VERIFY_FAILED?
- Wykonaj to samo zapytanie bez proxy. Jeśli również się nie uda, to proxy nie jest przyczyną.
- Wyświetl wystawcę certyfikatu poleceniem
openssl s_clientlub curl-v: wystawca nazwany po Twoim antywirusie lub zaporze wskazuje na inspekcję. - Sprawdź datę i godzinę systemu.
- Zaktualizuj pakiet CA i przetestuj ponownie.
# 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_URLJak naprawić CERTIFICATE_VERIFY_FAILED?
- Zaktualizuj
certifi(pip install -U certifi) lub systemowy pakiet CA. - Dodaj certyfikat inspekcji swojej firmy do magazynu zaufania, jeśli w sieci jest inspekcja, albo wykonuj scraping poza tą siecią.
- Napraw zegar synchronizacją czasu sieciowego.
- Zainstaluj certyfikaty CA w lekkich obrazach kontenerów, np. pakiet
ca-certificates. - Nie wyłączaj weryfikacji w kodzie, który wysyła dane uwierzytelniające lub pobiera dane, na których polegasz.
Czy warto ponawiać próbę po CERTIFICATE_VERIFY_FAILED?
Nie próbuj ponownie: ten sam magazyn zaufania zawiedzie tak samo. Napraw magazyn zaufania, zegar lub ścieżkę sieciową i uruchom ponownie.
Jak SSL: CERTIFICATE_VERIFY_FAILED odnosi się do CrawlRelay?
Port HTTP CrawlRelay tuneluje HTTPS za pomocą CONNECT, więc certyfikat weryfikowany przez klienta to ten przesłany przez stronę. Jeśli błąd występuje tylko przez bramę a nie poza nią, skontaktuj się z supportem podając nazwę hosta celu i pełny błąd, byśmy mogli sprawdzić po stronie wyjścia.
Gateway: gw.crawlrelay.com, port 7777 (HTTP, HTTPS przez CONNECT) i port 7778 (SOCKS5). Format nazwy użytkownika: USERNAME-country-{cc}-state-{state}-city-{city}-zip-{zip}-asn-{asn}-session-{id}-ttl-{minutes}. Powiązane: SSL: WRONG_VERSION_NUMBER · Connection reset · Python poradnik.
SSL: CERTIFICATE_VERIFY_FAILED: pytania, które zadają deweloperzy
Czy proxy może powodować błędy certyfikatów SSL?
Proxy inspekcyjne może, ponieważ pokazuje własny certyfikat. Proxy CONNECT nie może, bo tylko przesyła zaszyfrowane bajty i nigdy nie widzi zawartości negocjacji. Uruchom zapytanie bez proxy: jeśli błąd pozostaje, przyczyna jest u Ciebie lub w sieci.
Czy verify=False jest bezpieczne przy scrapowaniu?
Nie jako naprawa. To ukrywa inspekcję i błędy łańcuchów, a atakujący na drodze mógłby wtedy czytać lub zmieniać ruch, w tym tokeny i pliki cookie. Używaj tylko do szybkich lokalnych testów i nigdy w zadaniach działających bez nadzoru lub wysyłających dane uwierzytelniające.
Dlaczego to nie działa w Dockerze, a działa na laptopie?
Lekkie obrazy kontenerów często są bez pakietów certyfikatów CA, więc nie da się zweryfikować żadnego certyfikatu. Zainstaluj pakiet systemowy CA w obrazie lub polegaj na pakiecie certifi w Pythonie. Sprawdź też poprawność zegara w kontenerze.
Inne błędy proxy w tym odniesieniu
Kody statusu HTTP
- 401 Unauthorized vs 407
- 403 Forbidden
- 407 Proxy Authentication Required
- 429 Too Many Requests
- 502 Bad Gateway
- 503 Service Unavailable
- 504 Gateway Timeout
Błędy w przeglądarce i kliencie
Błędy połączenia i TLS
Proxy rezydencjalne z dokumentacją opisującą przypadki błędów
CrawlRelay proxy rezydencjalne od 0,50 USD/GB, ruch, który nigdy nie wygasa.