p12(pkcs12)形式の証明書の有効期限をkeytoolとopensslで確認する
証明書の有効期限が切れそうだから差し替えておいて
証明書のファイルとパスフレーズは別途送っておくね
急に渡された p12 拡張子(pkcs#12)の証明書。
設定するのは簡単だけど、証明書に不備があればサービスを止めかねない作業。
まずは、パスワード(パスフレーズ)を使って証明書の中身を確認しておきましょうか。
そもそもパスワードが違っていたら本末転倒ですからね。
今回は p12 ファイルの証明書の中身の確認と有効期限の調べ方を紹介します。
keytool
Mac や Linux など keytool コマンドが利用できる環境なら簡単。
(証明書のファイル名を hoge.p12 とします)
$ keytool -list -v -keystore hoge.p12 -storetype PKCS12 -storepass ******
または、storepass を省略してインタラクティブにパスワード入力をすることもできます。
$ keytool -list -v -keystore hoge.p12 -storetype PKCS12
結果の一部を抜粋します。
キーストアのタイプ: PKCS12
キーストア・プロバイダ: SunJSSE
作成日: 2023/02/16
エントリ・タイプ: PrivateKeyEntry
有効期間の開始日: Thu Feb 19 00:00:00 JST 2023 終了日: Mon Mar 30 00:00:00 JST 2025
署名アルゴリズム名: SHA256withRSA
サブジェクト公開キー・アルゴリズム: 2048ビットRSAキー
他にも所有者とか発行者とかありますが、終了日を確認しておけば間違って古い証明書を扱うことも起こらないでしょう。
openssl
keytool が使えない場合は openssl コマンドでも代用できます。
$ openssl pkcs12 -in hoge.p12 -clcerts -nokeys
秘密鍵をわざわざ参照する必要はないので nokeys のオプションは付けておきたいですね。
結果の一部を抜粋します。
MAC verified OK
Bag Attributes
friendlyName: XXXXXXXXXX
localKeyID: XXXXXXXXXX
subject=XXXXXXXXXX
—–BEGIN CERTIFICATE—–
XXXXXXXXXX
—–END CERTIFICATE—–
有効期限がわからないので、一度ファイルに出力しましょう。
$ openssl pkcs12 -in hoge.p12 -clcerts -nokeys -out tmp.crt
この tmp.crt の中身を確認します。
Certificate.Signature.Validity の項目を確認すれば、証明書の有効な期間がわかりますね。
$ openssl x509 -noout -text -in tmp.crt
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
XXXXXXXXXX
Signature Algorithm: sha256WithRSAEncryption
Issuer: XXXXXXXXXX
Validity
Not Before: Feb 19 00:00:00 2023 GMT
Not After : Mar 30 00:00:00 2025 GMT
まとめ
p12(pkcs12)形式の証明書の中身を確認する方法を紹介してきました。
証明書とパスワードを発行した人を信用していないわけではないですが、設定後に問題が発生するよりは事前にチェックしておいた方がいいですよね。
openssl コマンド実行時に、以下のようなパスワード間違いのエラーが出ることだってあるわけですから。
Mac verify error: invalid password?
keytool も password was incorrect ですが、自分の Java の環境が悪いのかなっと思って複数バージョンで試しちゃいました・・・。
java.io.IOException: keystore password was incorrect
at sun.security.pkcs12.PKCS12KeyStore.engineLoad(PKCS12KeyStore.java:2059)
at java.security.KeyStore.load(KeyStore.java:1445)
at sun.security.tools.keytool.Main.doCommands(Main.java:926)
at sun.security.tools.keytool.Main.run(Main.java:366)
at sun.security.tools.keytool.Main.main(Main.java:359)
Caused by: java.security.UnrecoverableKeyException: failed to decrypt safe contents entry: javax.crypto.BadPaddingException: Given final block not properly padded. Such issues can arise if a bad key is used during decryption.