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

25

Eu tenho um certificado de entidade / servidor final que possui um certificado intermediário e raiz. Quando eu catno certificado de entidade final, vejo apenas um único BEGINe ENDtag. É o único certificado da entidade final.

Existe alguma maneira de visualizar o conteúdo do certificado intermediário e raiz. Eu preciso apenas do conteúdo BEGINe da ENDtag.

No Windows, posso ver a cadeia completa de certificados no "Caminho da certificação". Abaixo está o exemplo do certificado do Stack Exchange.

insira a descrição da imagem aqui

A partir daí, posso executar um certificado de exibição e exportá-lo. Eu posso fazer isso tanto para raiz quanto para intermediário no Windows. Eu estou procurando esse mesmo método no Linux.

insira a descrição da imagem aqui

Anirban Nag 'tintinmj'
fonte
Diga-nos quem emitiu esse certificado.
Rui F Ribeiro
@RuiFRibeiro Digamos que alguém ... Eu quero ver a cadeia de certificados para stackexchange apenas com o certificado primário em mãos.
Anirban Nag 'tintinmj'

Respostas:

25

Em um site, você pode:

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

Isso mostrará a cadeia de certificados e todos os certificados que o servidor apresentou.

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 -untrustedopção é usada para fornecer o (s) certificado (s) intermediário (s); se.crté o certificado a verificar. O resultado depth = 2 veio do armazenamento confiável da CA do sistema.

Se você não possui os certificados intermediários, não pode executar a verificação. É assim que o X.509 funciona.

Dependendo do certificado, ele pode conter um URI para o intermediário. Como exemplo, openssl x509 -in se.crt -noout -textconté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 usá openssl x509 -inform der -in DigiCertSHA2HighAssuranceServerCA.crt -out DigiCertSHA2HighAssuranceServerCA.pem-lo para convertê-lo para uso posterior pelo OpenSSL).

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

Eu não acho que exista um comando OpenSSL agradável e fácil de fazer tudo isso por você.

derobert
fonte
Esse é o principal problema. Eu não tenho o URL comigo. Eu só tenho o arquivo de certificado. E eu preciso do conteúdo criptografado entre BEGINe a ENDtag (que você obterá depois de catinserir o arquivo .crt.
Anirban Nag 'tintinmj'
@ AnirbanNag'tintinmj 'Se você está apenas olhando para decodificar o certificado, tente # openssl x509 -in file.crt -noout -text
derobert
Eu quero o conteúdo do intermediário no certificado raiz, que está entre a tag BEGINe END.
Anirban Nag 'tintinmj'
Ou se você pode dar um comando que extrairá o certificado intermediário e raiz do certificado primário e o salvará em um arquivo ... Eu também posso conviver com isso.
Anirban Nag 'tintinmj'
@ AnirbanNag'tintinmj 'Se não estiver aparecendo com o openssl x509comando, não acho que o certificado intermediário esteja lá. (A menos que você tenha algum erro openssl x509).
Derobert 30/05
12

tl; dr - magia de basquete de um forro 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=\(.*\)$/\1/; s/[ ,.*]/_/g; s/__/_/g; s/^_//g;p').pem; mv $cert $newname; done

Explicação em 2 etapas

Para despejar todos os certificados da cadeia no 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 seu nome comum:

for cert in *.pem; do newname=$(openssl x509 -noout -subject -in $cert | sed -n 's/^.*CN=\(.*\)$/\1/; s/[ ,.*]/_/g; s/__/_/g; s/^_//g;p').pem; mv $cert $newname; done
estani
fonte
Existe algum motivo para escolher ".pem" versus ".crt" como extensão, já que você está apenas renomeando-os, sem alterar o formato?
Capitão Homem
Não, não mesmo. ".pem" é o formato (base64 do DER) ".crt" significa que é um certificado, mas não diz nada sobre a codificação. Eu estava prestes a torná-lo mais consistente e nomear todos os pem ... Mas acho que é mais simples ler em uma única linha para entender onde o certificado está sendo baixado (crt) e terminar o que normalmente uso no mundo Linux (pem) . Espero que isso esclareça as coisas um pouco ...
estani 06/02
11
Sim, percebo que o PEM é um formato, mas muitas vezes vejo crt e não tinha certeza se era um formato. Isso realmente ajuda a explicar por que vejo o "crt" usado com tanta frequência. Obrigado :)
Captain Man
Isso parece funcionar apenas se você já confia na fonte. Estou tentando fazer o download de uma autoridade de certificação personalizada, mas está apenas baixando o primeiro certificado, não a cadeia.
mjaggard 5/07
@ mjaggard estranho desde que eu usei exatamente para esse caso. Dito isto, o servidor pode não estar enviando a autoridade de certificação raiz, se você der uma olhada no meu exemplo, ele costumava baixar 3 certs agora está baixando apenas 2. Suponho que o servidor da wikipedia não esteja enviando a raiz (não há realmente nenhuma ponto, se você não tiver, você não vai confiar de qualquer maneira ...). Tenho certeza de que não era o caso antes.
estani