This is a text-only version of the following page on https://raymii.org:
---
Title : OpenSSL: Get all certificates from a website in plain text
Author : Remy van Elst
Date : 04-02-2014
URL : https://raymii.org/s/articles/OpenSSL_-_Get_all_certificates_from_a_website_in_plain_text.html
Format : Markdown/HTML
---
This snippet shows you how to get all certificates of a website in plain text.
With a few OpenSSL commands one can get the website certificate plus
intermediate certificates, however, if you feed that output to OpenSSL it only
works on the first certificate. Using a bit of sed and bash magic we can feed
all certificates one by one to OpenSSL.
Recently I removed all Google Ads from this site due to their invasive tracking, as well as Google Analytics. Please, if you found this content useful, consider a small donation using any of the options below. It means the world to me if you show your appreciation and you'll help pay the server costs:
GitHub Sponsorship
PCBWay referral link (You get $5, I get $20 after you've placed an order)
Digital Ocea referral link ($200 credit for 60 days. Spend $25 after your credit expires and I'll get $25!)
### Website certificate
You can request a website's certificate using `openssl s_client`. To view the
public key from google.com we can use the following command:
openssl s_client -connect google.com:443 &1 < /dev/null | sed -n '/-----BEGIN/,/-----END/p'
This will output only the public key.
### Plain text
If we feed that output into openssl again, we can output the certificate
information in plain text:
openssl s_client -connect google.com:443 2>&1 < /dev/null | sed -n '/-----BEGIN/,/-----END/p' | openssl x509 -noout -text
This is all the information about a certificate:
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
66:79:66:fc:e2:c7:d0:2d
Signature Algorithm: sha1WithRSAEncryption
Issuer: C=US, O=Google Inc, CN=Google Internet Authority G2
Validity
Not Before: Jan 15 14:34:20 2014 GMT
Not After : May 15 00:00:00 2014 GMT
Subject: C=US, ST=California, L=Mountain View, O=Google Inc, CN=*.google.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:a3:cb:4e:db:d1:59:dc:13:b2:89:1d:d0:31:2c:
fb:f2:b2:55:a8:76:3c:d3:2b:00:f8:87:e6:b0:80:
af:8f:46:ed:d8:35:72:1e:d0:55:26:a4:09:7e:71:
b4:6b:28:df:c4:54:b3:17:5f:31:77:d1:a2:eb:2a:
f4:e5:7c:5e:7c:2a:3d:39:b3:56:64:bf:65:45:86:
ef:e1:b4:94:7b:df:6e:b9:e9:c7:ef:b0:12:b8:31:
54:58:a9:39:bd:33:8f:df:53:76:da:49:ae:bf:5e:
f3:e7:f3:2f:6a:e5:9e:d9:fd:58:99:45:f7:a0:6f:
23:6e:88:8f:1d:3e:c3:50:28:a1:d6:ba:a6:56:50:
f4:c0:a9:73:37:96:75:42:5b:2f:65:18:54:17:fa:
51:f7:74:f2:59:18:dc:e4:33:fb:88:d5:60:e4:7e:
f7:65:57:02:fd:8d:f6:e3:74:53:c5:27:30:ec:85:
b0:db:43:f0:1f:af:e5:c1:f5:c7:06:8b:11:a8:20:
50:df:98:72:b7:4b:0f:73:e7:d9:7a:b8:3d:51:e7:
bc:d2:0f:12:27:d0:e2:f6:2e:0a:a9:c1:78:df:d6:
d1:5f:59:9f:a2:44:ef:7c:24:ca:b9:f8:7e:fe:c2:
84:66:f7:f8:9d:41:19:42:61:90:52:5c:68:33:b8:
b6:61
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Extended Key Usage:
TLS Web Server Authentication, TLS Web Client Authentication
X509v3 Subject Alternative Name:
DNS:*.google.com, DNS:*.android.com, DNS:*.appengine.google.com, DNS:*.cloud.google.com, DNS:*.google-analytics.com, DNS:*.google.ca, DNS:*.google.cl, DNS:*.google.co.in, DNS:*.google.co.jp, DNS:*.google.co.uk, DNS:*.google.com.ar, DNS:*.google.com.au, DNS:*.google.com.br, DNS:*.google.com.co, DNS:*.google.com.mx, DNS:*.google.com.tr, DNS:*.google.com.vn, DNS:*.google.de, DNS:*.google.es, DNS:*.google.fr, DNS:*.google.hu, DNS:*.google.it, DNS:*.google.nl, DNS:*.google.pl, DNS:*.google.pt, DNS:*.googleapis.cn, DNS:*.googlecommerce.com, DNS:*.googlevideo.com, DNS:*.gstatic.com, DNS:*.urchin.com, DNS:*.url.google.com, DNS:*.youtube-nocookie.com, DNS:*.youtube.com, DNS:*.youtubeeducation.com, DNS:*.ytimg.com, DNS:android.com, DNS:g.co, DNS:goo.gl, DNS:google-analytics.com, DNS:google.com, DNS:googlecommerce.com, DNS:urchin.com, DNS:youtu.be, DNS:youtube.com, DNS:youtubeeducation.com
Authority Information Access:
CA Issuers - URI:http://pki.google.com/GIAG2.crt
OCSP - URI:http://clients1.google.com/ocsp
X509v3 Subject Key Identifier:
61:54:7B:A4:44:E8:68:E2:D3:0D:CC:77:D4:29:35:3B:58:23:60:B3
X509v3 Basic Constraints: critical
CA:FALSE
X509v3 Authority Key Identifier:
keyid:4A:DD:06:16:1B:BC:F6:68:B5:76:F5:81:B6:BB:62:1A:BA:5A:81:2F
X509v3 Certificate Policies:
Policy: 1.3.6.1.4.1.11129.2.5.1
X509v3 CRL Distribution Points:
Full Name:
URI:http://pki.google.com/GIAG2.crl
Signature Algorithm: sha1WithRSAEncryption
6f:7b:07:5c:59:ce:7d:52:b3:bc:26:c7:7c:e8:6e:32:aa:fc:
3e:67:0a:51:1c:4b:6e:bb:7d:69:eb:fc:7a:02:76:59:bf:86:
97:50:ed:bd:ec:88:7c:d3:a0:a3:a6:27:fe:a0:21:55:76:da:
1b:7c:22:82:1e:31:73:d3:25:33:2d:72:de:63:36:18:50:9e:
49:bf:e3:78:c7:b4:33:38:b7:f8:10:93:a0:fa:5d:a7:4d:78:
48:74:7f:dd:c6:aa:8f:eb:26:de:e3:6b:4f:4b:c7:3a:0c:b7:
4c:c3:a9:bf:2b:46:b8:50:37:0b:05:e5:92:e4:9c:f3:36:bb:
f1:75:ad:20:31:99:1e:3d:83:6e:e1:dd:13:67:1a:2a:f7:c6:
e1:1d:4d:c4:4f:f8:e0:88:c5:3e:17:8b:15:5e:71:3d:69:99:
56:ba:fb:7f:07:d6:33:0a:d0:27:aa:9d:ce:77:a9:af:a1:93:
10:8c:27:48:1a:1f:62:48:04:8f:64:51:6d:52:e9:60:6d:a9:
98:7b:43:d6:cc:66:69:65:40:d6:57:ff:06:f5:73:59:8f:1b:
87:9b:36:5b:41:06:4a:5e:25:69:bb:f0:70:49:72:0b:d8:67:
7b:ed:d4:b3:c8:79:c8:58:5e:f3:f1:f5:98:fa:80:03:d3:7d:
8a:d0:c8:76
### Multiple certificates
Using the `-showcerts` option of `s_client` we can show all certificates the
website sends, including the issuing and intermediate certificates:
openssl s_client -connect google.com:443 -showcerts 2>&1 < /dev/null
If we want to receive those certificates without all the other output we can use
the same sed trick as before:
openssl s_client -connect google.com:443 -showcerts 2>&1 < /dev/null | sed -n '/-----BEGIN/,/-----END/p'
However, if we feed that into openssl again to receive the plain text output we
only get output for the first certificate:
openssl s_client -connect google.com:443 -showcerts 2>&1 < /dev/null | sed -n '/-----BEGIN/,/-----END/p' | openssl x509 -noout -text
According to the OpenSSL documentation the x509 option only supports one
certificate at a time. Using the following one liner we:
* Set the Internal Field Separator to a colon `(:)`.
* Get all the certificates for google.com in a variable named `certificates`.
* We use a group of sed commands to first print the certificates, then we substitute the beginning of the `-----BEGIN` line with a colon `(:)` and then the original `----BEGIN` line resulting in `:-----BEGIN`.
* We do a for loop on all certificates in the output, split by a colon `(:)`.
* We feed those one by one to OpenSSL
* We change the Internal Field Seperator back to what it was.
This is the command:
OLDIFS=$IFS; IFS=':' certificates=$(openssl s_client -connect google.com:443
-showcerts -tlsextdebug 2>&1 &1 &1 &1 &1 .
Just to be clear, the information on this website is for meant for educational
purposes and you use it at your own risk. I do not take responsibility if you
screw something up. Use common sense, do not 'rm -rf /' as root for example.
If you have any questions then do not hesitate to contact me.
See https://raymii.org/s/static/About.html for details.