I am trying to build a chain (or just get it from somewhere) from a certificate using OpenSSL, preferibly using the command line interface.
I have found some example in internet, but I am stuck at the question "Where do I get the CA issuer from the certificate?"
For example check this website openssl command cheatsheet, you will find the command
openssl s_client -showcerts -host example.com -port 443
to get the chain. You can try it using www.google.com
instead of example.com
.
The output should give you the chain. Other websites use the same command, sooner or later...
So, I cannot get the chain directly from the certificate, but I should ask somewhere for the chain.
Now my problem is: where do I get the hostname, where I can send my request for the chain?
I had a look to two certificates.
- stackexchange.com
- google.com
Using OpenSSL
, I can ask the Issuer using the command
openssl x509 -in certFile -noout -issuer
and I get respectively
- issuer=C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
- issuer=C = US, O = Google Trust Services, CN = GTS CA 1O1
Honestly, I do not know what to do with these results....
Then, investigating with the command
openssl x509 -text -in certFile
I have found the AIA extensions:
- CA Issuers - URI:http://cert.int-x3.letsencrypt.org/
- CA Issuers - URI:http://pki.goog/gsr2/GTS1O1.crt
Ok in the first example, I can finally use the command
openssl s_client -showcerts -host http://cert.int-x3.letsencrypt.org/ -port 443
but with google, I do not know how to download the chain using openssl
....I could use wget
maybe, but I don't have the same format that I get from stackexchange...
So, finally, my questions:
- How should do I work with these differences?
- Is there a better way to get the chain from a certificate, without asking for the CA Issuer?
- The CA Issuer is an extension, from AIA, and I think it is not mandatory, can I rely on it?
- How can I get the CA Issuer using
OpenSSL
, without parsing the output myself? (something likeopenssl x509 -caIssuer -in certFile
)
PS: What I try to achieve at the very end, is to validate a certificate, going through the complete chain, and checking all the OCSP or CRL for each certificate in the chain...If you have working example in C++, or just using OpenSSL CLI, I would be really grateful :)
EDIT:
What I am doing right now is creating the chain by myself.
Using the AIA extensions, I get the CA Issuer URI, download the CA Issuer certificate (convert to PEM if needed), and so on till I do not find a CA Issuer anymore. Then, probably it is a root CA.
After that, I manually collect all the pem and create the chain.