bauer's diary

凡人の凡人による凡人のための備忘録

certコマンドはSSL証明書の更新作業に便利だった

サーバー・インフラエンジニアをしていると定期的に必要な作業があります。
その一つがサーバー証明書の更新作業です。

これまでの更新確認作業

証明書の更新作業自体は、各プロジェクトで利用されているサーバ証明書の発行会社の手順に従って適用するかと思いますが、その際、ブラウザにアクセスして確認するのが一般的かと思います。
例えばChromeにてfacebookサイトの証明書を確認する場合、
デベロッパーツール

Security

Secure Originsから "https://www.facebook.com" を選ぶ

"Open full certificate details" をクリック
のような流れとなります。
f:id:kitakitabauer:20180512171605p:plain

すると、クライアントに取得したSSL証明書の情報が表示されるので、証明書の期限が有効か、また更新した場合はそれが延長されているかなどが確認できるかと思います。
f:id:kitakitabauer:20180512171434p:plain

とはいえ、大量に更新する必要がある場合、毎回アクセスしてこの作業を行うのは大変なので、今回 cert というコマンドを使って確認してみます。

cert インストール

github.com

Cert is the Go tool to get TLS certificate information.

cert はGo製のツールで、指定したドメインサーバー証明書情報を出力してくれます。
homebrew または go get でインストールします。

$ brew tap genkiroid/homebrew-cert
$ brew install cert
$ go get github.com/genkiroid/cert/...

インストールを確認します。

$ cert --version

これで準備完了です。

確認作業

更新したサイトのドメインを指定します。
一つでも複数でも指定が可能です。

$ cert facebook.com
cert facebook.com                                                                                                                                      17:56:07 [0]
DomainName: facebook.com
IP:         2a03:2880:f10c:83:face:b00c:0:25de
Issuer:     DigiCert SHA2 High Assurance Server CA
NotBefore:  2017-12-15 09:00:00 +0900 JST
NotAfter:   2019-03-22 21:00:00 +0900 JST
CommonName: *.facebook.com
SANs:       [*.facebook.com *.xx.fbcdn.net *.fbsbx.com *.xz.fbcdn.net *.facebook.net *.xy.fbcdn.net *.messenger.com fb.com *.fbcdn.net *.fb.com *.m.facebook.com messenger.com facebook.com]
Error:

Not After が、先程ブラウザで確認した日付と一致していることを確認できます。

LBやAWSのCloudFront、サーバーを直接指定する場合は "-k" オプションを使います。
結果は "-f json" オプションでJSONでも出力できますが、マークダウンで出力してくれる機能が便利で、GitHubのIssueでチケットに作業状況を更新しているので愛用しています。

$ cert -f md facebook.com
DomainName | IP | Issuer | NotBefore | NotAfter | CN | SANs | Error
--- | --- | --- | --- | --- | --- | --- | ---
facebook.com | 2a03:2880:f126:83:face:b00c:0:25de | DigiCert SHA2 High Assurance Server CA | 2017-12-15 09:00:00 +0900 JST | 2019-03-22 21:00:00 +0900 JST | *.facebook.com | \*.facebook.com<br/>\*.xx.fbcdn.net<br/>\*.fbsbx.com<br/>\*.xz.fbcdn.net<br/>\*.facebook.net<br/>\*.xy.fbcdn.net<br/>\*.messenger.com<br/>fb.com<br/>\*.fbcdn.net<br/>\*.fb.com<br/>\*.m.facebook.com<br/>messenger.com<br/>facebook.com<br/> |

opensslでも同じようなことはできますが、より手軽に使える印象なのでオススメします。