Buduję własny łańcuch certyfikatów z następującymi komponentami:
Root Certificate - Intermediate Certificate - User Certificate
Certyfikat Root jest certyfikatem z podpisem własnym, Certyfikat pośredni jest podpisany przez użytkownika głównego, a użytkownik przez pośrednika.
Teraz chcę sprawdzić, czy certyfikat użytkownika ma swoją kotwicę przez certyfikat główny.
Z
openssl verify -verbose -CAfile RootCert.pem Intermediate.pem
walidacja jest w porządku. W następnym kroku potwierdzam certyfikat użytkownika za pomocą
openssl verify -verbose -CAfile Intermediate.pem UserCert.pem
a walidacja pokazuje
error 20 at 0 depth lookup:unable to get local issuer certificate
Co jest nie tak?
źródło
man verify
stwierdziłem, że-untrusted
parametr jest prawidłowy do użycia podczas określania certyfikatu pośredniego.-untrusted
nie sprawdza, czy łańcuch certyfikatów jest w pełni ważny. Rozważ przekazanie do polecenia zarówno pośredniego, jak i głównego, tak-CAfile
jak sugerują inne pytania.openssl verify -CAfile /usr/local/etc/openssl/cert.pem -untrusted Intermediate.pem UserCert.pem
To jedna z niewielu legalnych ofert pracy dla
cat
:Aktualizacja:
Jak Greg Smethells zwraca uwagę w komentarzach, to polecenie niejawnie ufa plikowi Intermediate.pem . Polecam przeczytanie pierwszej części wpisu Grega (druga część dotyczy konkretnie pyOpenSSL i nie dotyczy tego pytania).
Na wypadek, gdyby post zniknął, zacytuję ważne akapity:
Wygląda na to, że openssl przestanie weryfikować łańcuch, gdy tylko napotkany zostanie certyfikat główny, którym może być również plik pośredni.pem, jeśli jest samopodpisany. W takim przypadku RootCert.pem nie jest brany pod uwagę. Dlatego upewnij się, że plik Intermediate.pem pochodzi z zaufanego źródła, zanim skorzystasz z powyższego polecenia.
źródło
Problemem jest
openssl -verify
to nie działa.Jak wspomniała Priyadi ,
openssl -verify
zatrzymuje się na pierwszym samopodpisanym certyfikacie, dlatego tak naprawdę nie weryfikujesz łańcucha, ponieważ często certyfikat pośredni jest samopodpisany.Proszę zauważyć, że odpowiedź Piotra jest poprawna , jednak wynik
openssl -verify
nie jest wskazówką, że wszystko naprawdę działa później. Tak, może napotkać pewne problemy, ale nie wszystkie.Oto skrypt, który wykonuje zadanie weryfikacji łańcucha certyfikatów przed zainstalowaniem go w Apache. Być może można to ulepszyć za pomocą bardziej mistycznej magii OpenSSL, ale nie jestem guru OpenSSL i następujące prace:
Istnieje GitHub Gist tego, który może zawierać pewne aktualizacje
Wymagania wstępne tego skryptu:
/etc/ssl/certs
jak zwykle, na przykład w systemie UbuntuDIR
którym przechowujesz 3 pliki:DIR/certificate.crt
który zawiera certyfikatDIR/certificate.key
który zawiera tajny klucz do Twojej usługi internetowej (bez hasła)DIR/certificate.bundle
który zawiera pakiet CA. O tym, jak przygotować pakiet, patrz poniżej../check DIR/certificate
(przy założeniu, że skrypt ma nazwęcheck
w bieżącym katalogu)CA-Bundle is not needed
. Oznacza to, że ty (czytaj:/etc/ssl/certs/
:) już ufasz certyfikatowi podpisującemu. Ale jest to mało prawdopodobne w sieci WWW.Jak stworzyć
certificate.bundle
plik?W sieci WWW łańcuch zaufania zwykle wygląda następująco:
/etc/ssl/certs
certificate.crt
)Teraz ocena odbywa się od dołu do góry, co oznacza, że najpierw czytany jest twój certyfikat, potem potrzebny jest nieznany certyfikat pośredni, potem być może certyfikat cross-podpisujący, a następnie
/etc/ssl/certs
konsultowany jest w celu znalezienia odpowiedniego zaufanego certyfikatu.Ca-bundle musi być skomponowane w dokładnie odpowiedniej kolejności przetwarzania, co oznacza, że pierwszy potrzebny certyfikat (certyfikat pośredni, który podpisuje Twój certyfikat) jest na pierwszym miejscu w pakiecie. Wtedy potrzebny jest certyfikat do podpisu krzyżowego.
Zwykle Twój CA (urząd, który podpisał Twój certyfikat) dostarcza już taki właściwy plik ca-bundle. Jeśli nie, musisz zebrać wszystkie potrzebne certyfikaty pośrednie i
cat
zebrać je razem w jednym pliku (w systemie Unix). W systemie Windows możesz po prostu otworzyć edytor tekstu (np.notepad.exe
) I wkleić certyfikaty do pliku, pierwszy potrzebny na górze i po pozostałych.Jest jeszcze jedna rzecz. Pliki muszą być w formacie PEM. Niektóre urzędy certyfikacji wydają format DER (binarny). PEM jest łatwy do wykrycia: jest czytelny w ASCII. Aby dowiedzieć się, jak przekonwertować coś na PEM, zobacz Jak przekonwertować .crt na .pem i podążaj żółtą ceglaną drogą.
Przykład:
Ty masz:
intermediate2.crt
certyfikat pośredni, który podpisał twójcertificate.crt
intermediate1.crt
kolejny certyfikat pośredni, który spaliłintermediate2.crt
crossigned.crt
który jest certyfikatem do podpisywania krzyżowego z innego urzędu certyfikacji, który podpisałintermediate1.crt
crossintermediate.crt
który jest kolejnym pośrednikiem z innego CA, który podpisałcrossigned.crt
(prawdopodobnie nigdy czegoś takiego nie zobaczysz)Wtedy właściwy
cat
wyglądałby tak:Jak możesz dowiedzieć się, które pliki są potrzebne, a które nie iw jakiej kolejności?
Cóż, eksperymentuj, dopóki nie
check
powie ci, że wszystko jest w porządku. To jak gra logiczna na komputerze, w której rozwiązuje się zagadkę. Każdy. Pojedynczy. Czas. Nawet dla profesjonalistów. Ale za każdym razem, gdy będziesz tego potrzebować, będziesz coraz lepszy. Więc definitywnie nie jesteś sam z całym tym bólem. To SSL, wiesz? SSL to prawdopodobnie jeden z najgorszych projektów, jakie widziałem w ciągu ponad 30 lat profesjonalnej administracji systemem. Czy zastanawiałeś się kiedyś, dlaczego kryptowaluty nie stały się głównym nurtem w ciągu ostatnich 30 lat? Dlatego. - powiedział nuff.źródło
Musiałem dokonać weryfikacji certyfikatu letsencrypt i zrobiłem to tak:
Wydaj to polecenie:
źródło
Po spędzeniu całego dnia na dokładnie tym samym problemie, bez wcześniejszej wiedzy na temat certyfikatów SSL, pobrałem CERTivity Keystores Manager i zaimportowałem do niego mój magazyn kluczy i otrzymałem przejrzystą wizualizację łańcucha certyfikatów.
Zrzut ekranu :
źródło
openssl verify
.Jeśli chcesz tylko sprawdzić, czy emitent z
UserCert.pem
faktycznieIntermediate.pem
zrobić następująco (przykład zastosowania:OpenSSL 1.1.1
):a otrzymasz:
lub
źródło
openssl verify -no-CAfile -no-CApath -partial_chain -trusted Intermediate.pem UserCert.pem
w Pythonie 3.7?Możesz łatwo zweryfikować łańcuch certyfikatów za pomocą openssl. Pełny łańcuch będzie zawierał certyfikat CA, więc powinieneś zobaczyć szczegółowe informacje o CA i samym certyfikacie.
openssl x509 -in fullchain.pem -text -noout
źródło