Wiersz poleceń i okno

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
Jeden brakujący certyfikat, cztery komunikaty
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ą
Prawdziwy przebieg

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.

Jak czytać raport

Windows, fragment
$ 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>"
Jak to działa

Jedno polecenie, cała droga

  1. 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.

  2. 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.

  3. 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.

Sześć warstw

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.

L0

Kontekst

sama maszyna - system operacyjny, kontener, VPN, zegar i zmienne środowiskowe, które decydują o zaufaniu i o proxy

L1

Rozwiązywanie nazw

na co rozwiązuje się nazwa, widziane tak, jak widzi to system, i tak, jak widzi to certdoctor

L2

Proxy

przez które proxy naprawdę pójdzie ten adres i które narzędzie o tym decyduje

L3

TCP

czy każdy rozwiązany adres przyjmuje połączenie, a jeśli nie, to jak odmawia

L4

TLS

uzgadnianie połączenia i łańcuch, który pokazał serwer, w tym to, czy po drodze ktoś go podpisał na nowo

L5

Macierz zaufania

które środowiska na tej maszynie ufają temu łańcuchowi, jeden wiersz na każdą zainstalowaną instancję

Każda warstwa po kolei

Zgłoszenia i pipeline'y

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.

Użycie w CI

cztery sposoby na zachowanie raportu
# 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
Czego nigdy nie robi

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.

Bezpieczeństwo i prywatność

Dowiedz się, dlaczego nie działa, w jednym przebiegu

Darmowy i otwarty. Pobierz, rozpakuj i wskaż adres, który nie działa.