Macierz zaufania

Przeglądarka działa, curl działa, aplikacja nie. To kilka magazynów zaufania, które się nie zgadzają, a macierz zaufania pokazuje które.

Dlaczego odpowiedzi jest więcej niż jedna

Każde środowisko ma własne zdanie o tym, komu ufać. Java trzyma plik cacerts w każdej instalacji, a maszyna programisty często ma kilka JDK, z których ktoś naprawił jeden. Git for Windows ma własny pakiet certyfikatów. Node.js jest zbudowany z własną listą. Python i pip czytają listę, z którą je skonfigurowano. Certyfikat, który firma dodała do magazynu Windows, trafia do części z nich, a do reszty nie, i dlatego jeden program się łączy, a następny nie.

Macierz zaufania zadaje każdemu z nich to samo pytanie o ten sam łańcuch: czy ten magazyn ufa temu, co pokazał serwer?

Magazyny, które pyta

Jeden wiersz na magazyn, a nie na środowisko:

WierszKtóry magazyn
system-store na Windowsiemagazyn certyfikatów Windows, dwa razy: tak, jak widzi go twoje konto (CurrentUser), i tak, jak widzą go usługi (LocalMachine)
system-store na Linuksiepakiet certyfikatów CA dystrybucji
javacacerts każdego JDK i JRE, jakie znajdzie, każdy jako osobny wiersz
gitkażdy git, jaki znajdzie, i pakiet, który czyta każdy z nich
curlkażdy curl, jaki znajdzie, i magazyn, który czyta każdy z nich
nodekażdy node w PATH, według listy, której ufa ta binarka
pythonkażdy Python w PATH, według listy, której ufa jego moduł ssl
pippip każdego Pythona, według jego własnej reguły

Raport wymienia rodziny, o które pytał, więc brakujący wiersz zawsze znaczy, że nikt nie patrzył, a nigdy, że magazyn się zgodził. Na maszynie, na której powstał certdoctor, jeden przebieg w listopadzie 2026 przeczytał siedemnaście magazynów, w tym osiem środowisk Javy.

Polecenie dla każdego magazynu

Magazyn, który odmawia, bo nie zna urzędu certyfikacji, dostaje polecenie, które dodaje do niego certyfikat. Polecenia tylko dodają: żadne nie usuwa ani nie zastępuje tego, co magazyn już ma.

MagazynPolecenie, w postaci, w jakiej wypisuje je wiersz
Windows, LocalMachinecertutil -addstore Root "<certificate.pem>", wymaga uprawnień administratora
Windows, CurrentUsercertutil -user -addstore Root "<certificate.pem>", po którym Windows prosi o potwierdzenie
JDK albo JREkeytool -importcert tej samej instalacji do jej własnego cacerts, z prawdziwymi ścieżkami
git, curl, pakiet Linuksa, plik CA czytany przez Pythona albo pipadopisanie certyfikatu na koniec dokładnie tego pliku: cat na Linuksie i macOS, cmd /c copy /b na Windowsie
nodeNODE_USE_SYSTEM_CA=1, gdy własna lista systemu domknęłaby łańcuch, w przeciwnym razie dopisanie do pliku wskazanego przez NODE_EXTRA_CA_CERTS albo ustawienie tej zmiennej
Python na Windowsiemagazyn Windows tego konta, bo stamtąd pochodzi jego lista

Wiersz mówi, kiedy jego polecenie wymaga uprawnień administratora albo roota, i dlaczego. Mówi też, na co uważać: menedżer pakietów albo aktualizacja środowiska może przepisać pakiet i zgubić dopisany certyfikat, a nowszy JDK przynosi własny cacerts.

certdoctor wypisuje te polecenia. Nigdy ich nie uruchamia. Każde ma miejsca do podstawienia, wymienione w linii replace first: wiersza.

Gdy wiersz wskazuje inny

Program, który ocenia według innego magazynu, mówi to, zamiast go powtarzać. curl zbudowany na Schannel, bibliotece TLS Windows, ufa temu, czemu ufa magazyn Windows tego konta, więc jego wiersz wskazuje wiersz tego magazynu i jego polecenie. Na Linuksie curl albo git z pakietów dystrybucji, który czyta pakiet certyfikatów dystrybucji, wskazuje wiersz tego pakietu.

Jak pytany jest magazyn Windows

Magazyn Windows jest pytany z wyłączonym każdym pobieraniem z sieci. Windows pobrałby inaczej brakujący certyfikat spod adresu wpisanego w certyfikat przez serwer, który właśnie diagnozujesz, a certdoctor łączy się tylko tam, gdzie go skierujesz. Publiczny certyfikat główny, którego Windows po prostu jeszcze nie pobrał, jest odróżniany od urzędu, którego nikt nie zainstalował, na podstawie kopii listy programu certyfikatów głównych Microsoftu, którą ma ta maszyna.

Kto podpisał certyfikat

Nad wierszami macierz mówi, kto podpisał certyfikat serwera i ile magazynów na tej maszynie ma ten urząd. Gdy podpisujący jest urzędem, który część magazynów ma, a część nie, to zwykle firmowy certyfikat główny albo produkt do inspekcji TLS, który trafił tylko do części maszyny. Inspekcja TLS mówi, jak to czytać.