TORIPIYO DIARY

recent events, IoT, programming, security topics

opensslコマンドでインターネット上のWebサイトから証明書情報を取得する

TLS証明書の期限確認や更新作業後に、証明書の内容をブラウザでアクセスして確認することがあると思いますが、確認対象のドメインが多いとブラウザで確認するのにも時間がかかります。opensslを利用すると、コマンドラインから証明書のCommon Nameや有効期間を確認することが出来ます。

_domain=google.co.jp
echo | openssl s_client -connect ${_domain}:443  2>/dev/null | openssl x509 -noout -subject -dates

例えば、上のコマンドを実行すると、google.co.jpの証明書情報を取得できます。

~: echo | openssl s_client -connect ${_domain}:443 -servername ${_domain} 2>/dev/null | openssl x509 -noout -subject -dates
subject= /C=US/ST=California/L=Mountain View/O=Google LLC/CN=*.google.co.jp
notBefore=Nov 27 14:02:00 2018 GMT
notAfter=Feb 19 14:02:00 2019 GMT

1個のグローバルIPで1個の証明書を提供しているサイトでは、servernameオプションは必要ないですが、SNI(Server Name Indication)を利用してTLSを提供しているサイトでは、servernameオプションがないとサーバ側はどのドメインの証明書を返せばいいのかわからないので、証明書情報を取得出来ません。

例えば、herokuは、SNIを使ってTLSを提供しているのでservernameオプションを指定しないと証明書を返してくれません。

~: host ptl.zchain.co.jp
ptl.zchain.co.jp is an alias for floating-caverns-4281.mysterious-ocean-4640.herokuspace.com.
floating-caverns-4281.mysterious-ocean-4640.herokuspace.com has address 52.198.68.69
floating-caverns-4281.mysterious-ocean-4640.herokuspace.com has address 52.199.177.67

~: _domain=ptl.zchain.co.jp

~: echo | openssl s_client -connect ${_domain}:443 -servername ${_domain} 2>/dev/null | openssl x509 -noout -subject -dates
subject= /CN=ptl.zchain.co.jp
notBefore=Feb  7 00:00:00 2018 GMT
notAfter=Jan  1 12:00:00 2021 GMT

~: echo | openssl s_client -connect ${_domain}:443 2>/dev/null | openssl x509 -noout -subject -dates
unable to load certificate
4572370540:error:09FFF06C:PEM routines:CRYPTO_internal:no start line:/BuildRoot/Library/Caches/com.apple.xbs/Sources/libressl/libressl-22.200.4/libressl-2.6/crypto/pem/pem_lib.c:683:Expecting: TRUSTED CERTIFICATE

openssl x509のオプションをいろいろと変えれば、証明書から必要な情報だけ取得出来ます。openssl x509 -h でどんな情報が取得出来るか確認可能です。