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 -untrusted
opçã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 -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 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_hash
obtém 244b5494
, o que você 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 exista um comando OpenSSL agradável e fácil de fazer tudo isso por você.