Dopasowanie certyfikatu i klucza prywatnego — dowód podpisem, a nie zgadywanie
Dopasowanie certyfikatu i klucza prywatnego
Wklej certyfikat, którego używa serwer, i klucz prywatny, który ma zostać z nim wdrożony, a ta strona odpowie na pytanie, na którym wdrożona witryna się wykłada: czy oba pochodzą z tej samej pary kluczy? Odpowiedź nie jest zgadywaniem na podstawie długości modułu czy samych odcisków — strona podpisuje ustalone wyzwanie kluczem prywatnym i weryfikuje ten podpis kluczem publicznym zawartym w certyfikacie. Jeśli weryfikacja przechodzi, oba należą do siebie; jeśli nie, żadna ilość edycji konfiguracji ich nie sprawi, że zaczną działać. Obie interpretacje są pokazane obok siebie z algorytmem, długością klucza, identyfikatorem klucza podmiotu i odciskiem klucza publicznego, a nic, co zostanie wklejone, nie opuszcza przeglądarki.
1. Certyfikat lub łańcuch
Wklej tyle bloków, ile potrzeba. Każdy certyfikat jest sprawdzany względem każdego klucza, więc łańcuch plus jeden klucz wskazuje dokładnie, do którego certyfikatu w łańcuchu należy ten klucz — częste zaskoczenie na serwerze, który podaje niewłaściwy certyfikat z pakietu. Odczytywany jest PEM, goła treść base64 lub szesnastkowa oraz plik PKCS#7 .p7b; sprawdzanie certyfikatu audytuje sam certyfikat, gdy klucz jest już ustalony.
2. Klucz prywatny lub klucz publiczny
Rozpoznawane są PKCS#8 (BEGIN PRIVATE KEY), PKCS#1 (BEGIN RSA PRIVATE KEY), SEC1 (BEGIN EC PRIVATE KEY) oraz goły klucz publiczny SPKI (BEGIN PUBLIC KEY), a także plik klucza wklejony jako base64 lub szesnastkowo. Zaszyfrowanego klucza PKCS#8 (BEGIN ENCRYPTED PRIVATE KEY) przeglądarka nie odczyta; jest on zgłaszany jako taki, wraz z poleceniem usuwającym hasło.
nic jeszcze nie sprawdzono
Przykład to certyfikat samopodpisany i należący do niego klucz prywatny, oba wygenerowane na potrzeby tej strony i nie chroniące niczego. Zamień klucz na inny, aby zobaczyć inny werdykt, albo wklej blok klucza publicznego zamiast prywatnego, aby zobaczyć dopasowanie klucza publicznego.
Klucz prywatny wklejony na jakąkolwiek stronę internetową wymaga najpierw namysłu. Ta strona to jeden plik zwykłego JavaScriptu, nic nie wczytuje z zewnątrz i nie wykonuje żadnych żądań, więc klucz jest odczytywany, używany i zapominany w tej karcie. To wciąż obietnica złożona przez kod, który można przeczytać, a nie gwarancja z sieci, którą widać: jeśli wchodzi w grę klucz produkcyjny, pracuj offline i pamiętaj, że najbezpieczniejszym sprawdzeniem jest to samo polecenie openssl na własnym serwerze. Wklejony tutaj klucz nigdy nie jest przechowywany, nie trafia do pliku i nigdzie nie jest wysyłany — także przez przyciski eksportu, które zapisują ustalenia o kluczu, a nigdy sam klucz.
Dlaczego odpowiedzią jest podpisywanie. Dwa pliki mogą wyglądać podobnie, a mimo to nie pasować: w większości poradników klucze RSA porównuje się po module, ale działa to tylko dla RSA, a klucz może mieć właściwy moduł z uszkodzonym wykładnikiem albo błędnym dopełnieniem. Ta strona dowodzi parę tak, jak robi to uzgadnianie połączenia — podpisuje ustalone wyzwanie kluczem prywatnym i weryfikuje je kluczem publicznym z certyfikatu — więc werdykt obowiązuje dla RSA, ECDSA i Ed25519 jednakowo. Gdy wklejona jest tylko połowa publiczna, same bajty klucza publicznego są porównywane z tymi z certyfikatu, co jest równie rozstrzygające co do tożsamości, ale bez dowodu, że ktoś posiada połowę prywatną.
Czego dopasowanie nie mówi. Że to klucz, który faktycznie załadował serwer, że certyfikat jest zaufany, że plik klucza jest nienaruszony na dysku albo że klucz nie został skopiowany przez kogoś innego. Nie może też powiedzieć, czy to certyfikat, który otrzyma klient, bo load balancer lub CDN przed witryną może podać inny. Aby sprawdzić, co serwer na żywo naprawdę przedstawia, uruchom openssl s_client -connect example.com:443 -servername example.com -showcerts i wklej wynik do pola certyfikatu.
Skąd pochodzą pliki. Certyfikat to ten, którym skonfigurowany jest serwer, albo ten wyeksportowany z przeglądarki lub wyjęty z pakietu .p7b. Klucz prywatny to plik, który serwer WWW czyta przy starcie, zwykle o nazwie w rodzaju privkey.pem lub server.key. Jeśli klucz jest zaszyfrowany, najpierw odszyfruj kopię poleceniem openssl pkcs8 -topk8 -nocrypt -in key.pem -out key-plain.pem, wklej ją, a potem usuń kopię.
Raport dopasowania
Nic jeszcze nie sprawdzono. Wklej certyfikat i klucz powyżej i naciśnij Sprawdź, czy pasują. Werdykt pojawi się tutaj wraz z dowodami, a raport można skopiować lub zapisać.
To samo sprawdzenie za pomocą openssl, na komputerze
# klucz publiczny w certyfikacie openssl x509 -in cert.pem -noout -pubkey | openssl pkey -pubin -outform DER | openssl sha256 # klucz publiczny w kluczu prywatnym openssl pkey -in key.pem -pubout | openssl pkey -pubin -outform DER | openssl sha256 # oba skróty są równe tylko wtedy, gdy para należy do siebie # starszy sposób, wyłącznie dla RSA: porównanie modułów openssl x509 -in cert.pem -noout -modulus | openssl md5 openssl rsa -in key.pem -noout -modulus | openssl md5
Porównanie skrótów działa dla każdego typu klucza i zgadza się z odciskiem klucza publicznego, który ta strona podaje, natomiast porównanie modułów istnieje tylko dla RSA. Żadne z nich nie dowodzi, że ktokolwiek posiada połowę prywatną — dowodzi tego sprawdzenie podpisu opisane wyżej, dlatego ta strona go używa.
Co zawiera raport. Werdykt, parę odczytów, z których powstał (algorytm, długość klucza, krzywa, identyfikator klucza podmiotu i odcisk klucza publicznego dla certyfikatu i dla klucza), oraz dokładny przeprowadzony test. Raport nigdy nie zawiera samego klucza prywatnego: klucz służy do wytworzenia podpisu i nie jest zapisywany w tekście, w JSON ani w schowku. To, co zostanie skopiowane lub zapisane, można bezpiecznie dołączyć do zgłoszenia; klucz, który wklejono, nie — a schowek należy traktować jako jedyne inne miejsce, w którym kiedykolwiek istniał.
Prywatność: certyfikat i klucz są odczytywane w tej karcie, nic nie jest wysyłane, a strona nie wykonuje żadnego żądania — nie ma tu sondowania ani wyszukiwania. Aby utworzyć pasującą parę, użyj generatora certyfikatów samopodpisanych; aby poprosić o certyfikat dla posiadanego już klucza, użyj generatora CSR; aby odczytać zawartość certyfikatu, użyj dekodera certyfikatów.
🔒 Narzędzia SSL i TLS
Narzędzia do certyfikatów i kluczy działające w całości w przeglądarce.