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