Przeglądarka się łączy. Twój program nie.
certdoctor przechodzi całą drogę do adresu, który nie działa - DNS, proxy i skrypt PAC, TCP, TLS - a potem pyta każdy magazyn zaufania na tej maszynie, czy ufa temu, co przysłał serwer, i wypisuje polecenie, które naprawia każdy magazyn, który nie ufa.
- Darmowy i otwarty, GPL-3.0
- Niczego nie zmienia, bez telemetrii
- Windows, macOS i Linux
PKIX path building failedJava
unable to get local issuer certificatecurl, git, Python
SELF_SIGNED_CERT_IN_CHAINNode.js
x509: certificate signed by unknown authorityGo
$ certdoctor https://the-url-that-fails/zadaje każdemu z nich to samo pytanie i wskazuje te, które odmawiająNajpierw przyczyna, potem polecenie dla każdego magazynu
Strona, której certyfikatowi głównemu nie ufa żaden magazyn, sprawdzona na Windowsie z Gitem i ośmioma środowiskami Javy. Pierwsze zdanie nazywa przyczynę. Pod nim każdy magazyn ma własny wiersz, a każdy wiersz z odmową niesie polecenie, które dodałoby tam certyfikat główny, ze ścieżkami z tej maszyny. certdoctor wypisuje polecenia. Nigdy ich nie uruchamia.
$ certdoctor https://untrusted-root.badssl.com/
x CN=BadSSL Untrusted Root Certificate Authority,O=BadSSL,L=San Francisco,ST=California,C=US signed
this certificate, and none of the 10 store(s) assessed here holds an anchor for it. 1 of 6
diagnostic layers could not be assessed.
exit 4 DIAGNOSIS
...
x FAIL L5 Trust matrix 15 of 17 store(s) do not trust the presented chain, and 2 could
not be assessed
...
system-store LocalMachine does NOT trust the presented chain (90 anchors) detected
needs elevated rights: the LocalMachine store is read by every account and every service on
this machine, so changing it needs administrator rights
run: certutil -addstore Root "<certificate.pem>"
...
git C:\Program Files\Git\cmd\git.exe does NOT trust the presented chain (120
anchors) detected
needs elevated rights: this store is outside this account's own files, so it belongs to
every account on the machine
run: cmd /c copy /b "C:\Program Files\Git\ucrt64\etc\ssl\certs\ca-bundle.crt"+"<certificate.pem>" "C:\Program Files\Git\ucrt64\etc\ssl\certs\ca-bundle.crt"
...
java C:\Program Files\OpenJDK\jdk-21.0.2 does NOT trust the presented chain (106
anchors) detected
needs elevated rights: this store is outside this account's own files, so it belongs to
every account on the machine
run: "C:\Program Files\OpenJDK\jdk-21.0.2\bin\keytool" -importcert -trustcacerts -keystore "C:\Program Files\OpenJDK\jdk-21.0.2\lib\security\cacerts" -storepass changeit -alias "<alias>" -file "<certificate.pem>"
Jedno polecenie, cała droga
Wskaż adres, który nie działa
certdoctor https://api.example.com/- na laptopie, na agencie budującym albo w kontenerze, gdzie połączenie pada.Przechodzi całą drogę
Każdy serwer DNS zapytany wprost, proxy, którego naprawdę użyją twoje programy, połączenie TCP z każdym adresem i pełny łańcuch certyfikatów z każdego z nich.
Odpowiada każdy magazyn zaufania
Magazyn Windows, pakiet CA Linuksa, każdy JDK i JRE, każdy git, curl, node, Python i pip, który znajdzie, każdy z poleceniem, które by go naprawiło.
Co sprawdza
Każda warstwa odpowiada na jedno pytanie. Zdanie na górze raportu pochodzi z warstwy, która przesądziła o wyniku, a to nie zawsze jest pierwsza czerwona.
Kontekst
sama maszyna - system operacyjny, kontener, VPN, zegar i zmienne środowiskowe, które decydują o zaufaniu i o proxy
Rozwiązywanie nazw
na co rozwiązuje się nazwa, widziane tak, jak widzi to system, i tak, jak widzi to certdoctor
Proxy
przez które proxy naprawdę pójdzie ten adres i które narzędzie o tym decyduje
TCP
czy każdy rozwiązany adres przyjmuje połączenie, a jeśli nie, to jak odmawia
TLS
uzgadnianie połączenia i łańcuch, który pokazał serwer, w tym to, czy po drodze ktoś go podpisał na nowo
Macierz zaufania
które środowiska na tej maszynie ufają temu łańcuchowi, jeden wiersz na każdą zainstalowaną instancję
Znajdź komunikat, który widzisz
Każde środowisko opisuje ten sam problem po swojemu. Każda strona mówi, co znaczy komunikat, jakie ma przyczyny i jak certdoctor ustala, która dotyczy ciebie.
PKIX path building failed
PKIX path building failed i unable to find valid certification path to requested target w Javie: dlaczego jeden JDK odmawia i które polecenie keytool pomaga.
unable to get local issuer certificate
SSL certificate problem: unable to get local issuer certificate w curl, git, Pythonie, pip i Node: co to znaczy i jak naprawić właściwy magazyn zaufania.
self-signed certificate in certificate chain
npm ERR! SELF_SIGNED_CERT_IN_CHAIN i self-signed certificate in certificate chain w Node.js, git i Pythonie: dlaczego pojawia się za proxy i jak to naprawić.
x509: certificate signed by unknown authority
x509: certificate signed by unknown authority w programach w Go, Dockerze, kubectl, Terraform i Helm: dlaczego decyduje magazyn systemu i jak to naprawić.
Brak certyfikatu pośredniego
Działa w przeglądarce, pada w curl, Javie i Pythonie? Serwer nie wysyła certyfikatu pośredniego. Jak udowodnić, że winny jest serwer, i jak to naprawić.
407 Proxy Authentication Required
407 Proxy Authentication Required w curl, git, npm, pip i Javie: ustal, przez które proxy naprawdę idzie adres i jakich poświadczeń ono chce.
Napraw to w magazynie, który tego potrzebuje
Przeglądarka, JDK, Git for Windows i Python mogą ufać różnym listom. Poradniki mówią, gdzie każde z nich trzyma swoją listę i jakie polecenie dodaje do niej certyfikat.
Java cacerts i keytool
Zaimportuj firmowy certyfikat główny do Java cacerts przez keytool, znajdź każdy JDK i JRE na maszynie i zobacz, które odmawiają, z poleceniem dla każdego.
Git i certyfikaty SSL
Napraw git SSL certificate problem: unable to get local issuer certificate. Który pakiet CA czyta każdy git, Schannel i polecenie, które dodaje certyfikat.
Node.js i npm
Napraw SELF_SIGNED_CERT_IN_CHAIN w Node.js i npm: NODE_USE_SYSTEM_CA, żeby ufać magazynowi systemu, NODE_EXTRA_CA_CERTS, żeby dodać certyfikat, i który wybrać.
Certyfikaty Pythona i pipa
Napraw pip i Python CERTIFICATE_VERIFY_FAILED: której liście ufa każdy Python i pip, certifi, truststore od pip 24.2, REQUESTS_CA_BUNDLE i PIP_CERT.
Magazyn certyfikatów Windows
Dodaj certyfikat główny do magazynu certyfikatów Windows przez certutil: CurrentUser czy LocalMachine, kto czyta każdy z nich i które programy ignorują oba.
Inspekcja TLS
Za firmowym proxy z inspekcją TLS Java, git, npm i pip padają, a przeglądarka działa. Zobacz, kto podpisał certyfikat i gdzie go brakuje.
Raport do zgłoszenia, kod wyjścia dla CI
Markdown, jedna samodzielna strona HTML albo JSON sprawdzony ze schematem, zanim zostanie wypisany. --redact maskuje nazwy hostów, ścieżki i nazwy użytkowników, a poświadczenia są maskowane zawsze. Każde zakończenie ma własny kod wyjścia, a samo ostrzeżenie nie zatrzymuje budowania.
# raport do załączenia w zgłoszeniu certdoctor https://api.example.com/ --redact --format md --out report.md # jedna strona HTML bez żadnego skryptu certdoctor https://api.example.com/ --format html --out report.html # JSON dla pipeline'u, sprawdzony ze schematem certdoctor https://api.example.com/ --json --out report.json # ten sam raport później jako strona, bez ponownego przebiegu certdoctor --from report.json --format html --out report.html
Bezpieczny na zablokowanej maszynie
Narzędzie, które uruchamiasz tam, gdzie połączenia padają, widzi wewnętrzne nazwy, ścieżki i serwery proxy. Oto obietnice, których dotrzymuje.
Niczego nie zmienia
Nigdy nie zapisuje do magazynu zaufania ani do pliku konfiguracyjnego. Jedyny plik, jaki zapisuje, to raport, pod ścieżką, którą podasz.
Nie uruchamia napraw
Wypisuje każde polecenie do przeczytania i uruchomienia przez ciebie. Sam nie uruchamia żadnego i mówi, kiedy polecenie wymaga uprawnień administratora.
Łączy się tylko tam, gdzie wskażesz
Adres, jego adresy IP, twoje serwery DNS, twoje proxy i twój skrypt PAC. Bez telemetrii i bez sprawdzania aktualizacji.
Poświadczenia zawsze zamaskowane
Hasła do proxy, nagłówki autoryzacji i ciasteczka nigdy nie trafiają do raportu, z --redact i bez.
Nie potrzebuje uprawnień administratora
Działa jako ten, kto go uruchomił, a raport mówi, z jakimi uprawnieniami działał.
Jeden plik, bez instalacji
Wersja na Linuksa to jeden statyczny plik, który działa bez zmian w obrazach Alpine i Ubuntu.