Como extrair a CA raiz e a AC subordinada de uma cadeia de certificados no Linux?

21

Eu tenho um certificado de entidade final / servidor que possui um certificado intermediário e raiz. Quando eu cat no certificado da entidade final, vejo apenas uma única tag BEGIN e END . É o único certificado de entidade final.

Existe alguma maneira de visualizar o conteúdo do certificado intermediário e raiz. Preciso apenas do conteúdo de BEGIN e END tag.

No Windows, posso ver toda a cadeia de certificados do "Caminho de Certificação". Abaixo está o exemplo para o certificado do Stack Exchange.

Delá,possoexecutarumVisualizarcertificadoeexportá-los.EupossofazerissopararaizeintermediárionoWindows.EuestouprocurandoessemesmométodonoLinux.

    
por Anirban Nag 'tintinmj' 30.05.2017 / 16:21

2 respostas

20

De um site, você pode fazer:

openssl s_client -showcerts -verify 5 -connect stackexchange.com:443 < /dev/null

Isso mostrará a cadeia de certificados e todos os certificados apresentados pelo servidor.

Agora, se eu salvar esses dois certificados em arquivos, posso usar openssl verify :

$ openssl verify -show_chain -untrusted dc-sha2.crt se.crt 
se.crt: OK
Chain:
depth=0: C = US, ST = NY, L = New York, O = "Stack Exchange, Inc.", CN = *.stackexchange.com (untrusted)
depth=1: C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert SHA2 High Assurance Server CA (untrusted)
depth=2: C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert High Assurance EV Root CA

A opção -untrusted é usada para fornecer o (s) certificado (s) intermediário (s); se.crt é o certificado a ser verificado. O resultado depth = 2 veio do armazenamento da CA confiável do sistema.

Se você não tiver o (s) certificado (s) intermediário (s), não poderá realizar a verificação. É assim que o X.509 funciona.

Dependendo do certificado, ele pode conter um URI para obter o intermediário. Como exemplo, openssl x509 -in se.crt -noout -text contém:

        Authority Information Access: 
            OCSP - URI:http://ocsp.digicert.com
            CA Issuers - URI:http://cacerts.digicert.com/DigiCertSHA2HighAssuranceServerCA.crt

Esse URI "CA Issuers" aponta para o certificado intermediário (no formato DER, portanto, você precisa usar openssl x509 -inform der -in DigiCertSHA2HighAssuranceServerCA.crt -out DigiCertSHA2HighAssuranceServerCA.pem para convertê-lo para uso posterior pelo OpenSSL).

Se você executar openssl x509 -in /tmp/DigiCertSHA2HighAssuranceServerCA.pem -noout -issuer_hash , receberá 244b5494 , que pode procurar no armazenamento da CA raiz do sistema em /etc/ssl/certs/244b5494.0 (basta anexar .0 ao nome).

Eu não acho que haja um comando OpenSSL fácil e simples para fazer tudo isso por você.

    
por 30.05.2017 / 19:02
3

tl; dr - um alinhador golpeia a magia para despejar todos os certs na cadeia

openssl s_client -showcerts -verify 5 -connect de.wikipedia.org:443 < /dev/null | awk '/BEGIN/,/END/{ if(/BEGIN/){a++}; out="cert"a".crt"; print >out}' && for cert in *.crt; do newname=$(openssl x509 -noout -subject -in $cert | sed -n 's/^.*CN=\(.*\)$//; s/[ ,.*]/_/g; s/__/_/g; s/^_//g;p').pem; mv $cert $newname; done

Explicação em 2 passos

Para despejar todos os certificados na cadeia para o diretório atual como cert${chain_number}.pem :

openssl s_client -showcerts -verify 5 -connect your_host:443 < /dev/null | awk '/BEGIN/,/END/{ if(/BEGIN/){a++}; out="cert"a".pem"; print >out}' 

bonus-track para renomeá-los para o nome comum:

for cert in *.pem; do newname=$(openssl x509 -noout -subject -in $cert | sed -n 's/^.*CN=\(.*\)$//; s/[ ,.*]/_/g; s/__/_/g; s/^_//g;p').pem; mv $cert $newname; done
    
por 12.12.2018 / 11:27