Vejo muitas perguntas como “como obter cadeia de certificados” ou “o que é a ordem correta da cadeia de certificados”. Vamos lançar alguma luz sobre ela.
TL;DR A cadeia de certificados começa com seu certificado seguido por um intermediário ou por um certificado CA de raiz. O emissor de qualquer certificado na cadeia deve ser igual ao Subject do próximo até o certificado da CA raiz onde Subject é igual ao Issuer.
First of all – Para que um certificado SSL seja confiável ele deve ser emitido por uma CA que está na loja confiável do dispositivo que você usa (loja do sistema de operação ou loja de aplicativos como com Firefox).
Vejamos um dos certificados:
Para o meu domínio (ver setas) os sistemas tentam encontrar o emissor do meu certificado na loja e se ele não for encontrado (no meu exemplo não é) ele tentará encontrar o emissor do meu certificado e assim por diante.
Relação entre certificados cria uma Cadeia de Certificados onde o certificado de um recurso deve ser emitido ou por uma CA raiz (uma das CA instaladas no sistema) ou por uma CA intermediária (emitida por uma das CA raiz ou por uma CA intermediária “superior”).
Muitas vezes recebemos arquivos de certificados (por exemplo, um monte de .crt) sem o arquivo específico “certificate chain”.
Para (re)criar a cadeia que você deve começar do seu arquivo de certificado, no meu caso é STAR_my_domain.crt
openssl x509 -text -noout -in STAR_my_domain.crt
Estamos interessados em dois campos de saída: Subject e Issuer.
O primeiro no arquivo da cadeia deve ser o certificado do seu domínio (há exceções. Por exemplo, para AWS Certificate Manager você deve enviar seu certificado e a cadeia sem o seu certificado separadamente)
Existem dois tipos de CA: raiz e intermediária. Qualquer CA intermediária tem diferentes campos de Emitente e Assunto. O certificado da Root CA tem igual Emissor e Subject.
Segundo um deve ser o certificado do emissor do seu certificado e assim por diante até o de raiz.
No meu caso a cadeia se parece com isto:
Primeiro vai meu certificado (STAR_mydomain.crt)
Issuer: C=US, ST=DE, L=Wilmington, O=Corporation Service Company, CN=Trusted Secure Certificate Authority 5
Subject: my subject
Segundo na cadeia (TrustedSecureCertificateAuthority5.crt). Nota: O assunto é igual ao do Emitente do arquivo anterior :
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
Terceiro é USERTrustRSAAddTrustCA.crt:
O último é AddTrustExternalCARoot.crt. Nota: Emitente = Assunto, significa que é a CA raiz. Não há necessidade de adicionar o certificado CA raiz à cadeia. Ele não trava, mas aumenta a quantidade de handshakes e a quantidade de dados transmitidos.
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
Para criar um arquivo com a cadeia de certificados você pode rodar:
$cat STAR_mydomain.crt TrustedSecureCertificateAuthority5.crt USERTrustRSAAddTrustCA.crt > Certificate_Chain.crt
Para serviços como o gerenciador de certificados AWS:
cat TrustedSecureCertificateAuthority5.crt USERTrustRSAAddTrustCA.crt > Certificate_Chain.crt
O arquivo deve parecer:
-----BEGIN CERTIFICATE-----
content of your domain certificate
-----END CERTIFICATE-----
...
-----BEGIN CERTIFICATE-----
content of any intermediate CA certificate
-----END CERTIFICATE-----
Para verificar se tudo bem com sua cadeia de certificados você pode usar qualquer um dos serviços online como por exemplo o DigiCert fornece.
UPDATE: Informações atualizadas após vários problemas com o vencimento da AddTrust External CA Root em 30 de maio de 2020. Não há necessidade de adicionar o certificado de raiz. Não é recomendado, a menos que você use um auto assinado.