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