Certificate Chain Example

Aliaksandr Prysmakou
Aliaksandr Prysmakou

Follow

Dec 8, 2017 – 3 min read

Widzę wiele pytań typu „jak uzyskać łańcuch certyfikatów” lub „jaka jest prawidłowa kolejność łańcucha certyfikatów”. Rzućmy na to trochę światła.

TL;DR Łańcuch certyfikatów zaczyna się od Twojego certyfikatu, po którym następuje certyfikat pośredni lub certyfikat główny CA. Emitent każdego certyfikatu w łańcuchu powinien być równy podmiotowi następnego, aż do certyfikatu głównego CA, gdzie podmiot jest równy wystawcy.

Po pierwsze – Aby certyfikat SSL był zaufany, powinien być wydany przez CA, który znajduje się w zaufanym sklepie urządzenia, którego używasz (sklep systemu operacyjnego lub sklep aplikacji, jak w Firefoksie).

Przyjrzyjrzyjmy się jednemu z certyfikatów:

a certificate

Dla mojej domeny (patrz strzałki) system próbuje znaleźć wystawcę mojego certyfikatu w sklepie, a jeśli go nie znajdzie (w moim przykładzie nie znalazł), spróbuje znaleźć wystawcę wystawcy mojego certyfikatu i tak dalej, i tak dalej.

Relacja między certyfikatami tworzy łańcuch certyfikatów, w którym certyfikat zasobu musi być wystawiony albo przez główny CA (jeden z zainstalowanych w systemie) albo przez pośredni CA (wystawiony przez jeden z głównych CA lub przez „górny” pośredni CA).

Bardzo często dostajemy pliki certyfikatów (np. kilka .crt) bez określonego pliku „łańcucha certyfikatów”.

Aby (ponownie) utworzyć łańcuch należy zacząć od swojego pliku certyfikatu, w moim przypadku jest to STAR_my_domain.crt

openssl x509 -text -noout -in STAR_my_domain.crt

Interesują nas dwa pola na wyjściu: Subject i Issuer.

Pierwszym w pliku łańcucha powinien być certyfikat Twojej domeny (są wyjątki. np. dla AWS Certificate Manager powinieneś złożyć swój certyfikat i łańcuch bez swojego certyfikatu osobno)

Istnieją dwa typy CA: root i intermediate. Każdy certyfikat pośredniego CA ma różne pola Issuer i Subject. Certyfikat głównego CA ma takie same pola Issuer i Subject.

Drugie powinno być certyfikatem wystawcy Twojego certyfikatu i tak dalej aż do głównego.

W moim przypadku łańcuch wygląda następująco:

Pierwszy jest mój certyfikat (STAR_mydomain.crt)

Issuer: C=US, ST=DE, L=Wilmington, O=Corporation Service Company, CN=Trusted Secure Certificate Authority 5
Subject: my subject

Drugi w łańcuchu (TrustedSecureCertificateAuthority5.crt). Uwaga: Subject jest równy poprzedniemu plikowi Issuer :

Issuer: C=US, ST=New Jersey, L=Jersey City, O=The USERTRUST Network, CN=USERTrust RSA Certification Authority
Subject: C=US, ST=DE, L=Wilmington, O=Corporation Service Company, CN=Trusted Secure Certificate Authority 5

Trzeci jest USERTrustRSAAddTrustCA.crt:

Issuer: C=SE, O=AddTrust AB, OU=AddTrust External TTP Network, CN=AddTrust External CA Root
Subject: C=US, ST=New Jersey, L=Jersey City, O=The USERTRUST Network, CN=USERTrust RSA Certification Authority

Ostatni jest AddTrustExternalCARoot.crt. Uwaga: Issuer = Subject, oznacza, że jest to root CA. Nie ma potrzeby dodawania certyfikatu root CA do łańcucha. To nie hamuje, ale zwiększa ilość handshake’ów i ilość przesyłanych danych.

Issuer: C=SE, O=AddTrust AB, OU=AddTrust External TTP Network, CN=AddTrust External CA Root
Subject: C=SE, O=AddTrust AB, OU=AddTrust External TTP Network, CN=AddTrust External CA Root

Aby utworzyć plik z łańcuchem certyfikatów możesz uruchomić:

$cat STAR_mydomain.crt TrustedSecureCertificateAuthority5.crt USERTrustRSAAddTrustCA.crt > Certificate_Chain.crt

Dla takich usług jak AWS Certificate Manager:

cat TrustedSecureCertificateAuthority5.crt USERTrustRSAAddTrustCA.crt > Certificate_Chain.crt

Plik powinien wyglądać jak:

-----BEGIN CERTIFICATE-----
content of your domain certificate
-----END CERTIFICATE-----
...
-----BEGIN CERTIFICATE-----
content of any intermediate CA certificate
-----END CERTIFICATE-----

Aby sprawdzić czy wszystko jest w porządku z Twoim łańcuchem certyfikatów możesz skorzystać z jednej z usług online jak np.

UPDATE: Informacja zaktualizowana po wielu problemach z AddTrust External CA Root wygasa 30 maja 2020. Nie ma potrzeby dodawania certyfikatu głównego. Nie jest to zalecane, chyba że używasz samodzielnie podpisanego certyfikatu.