はじめに
Webサーバへ設定するSSL/TLS証明書を設定する際、中間証明書やクロスルート証明書を設定する場合に、設定したい証明書が本当に正しいかを検証したいとき、OpenSSLを使用して検証する方法に手間取ったので備忘として記載。
用意するもの
- サーバ証明書
- 中間CA証明書
- クロスルートCA証明書 (※必要な場合のみ)
- ルートCA証明書
1. 証明書の準備
各種証明書を作業用ディレクトリに集めておきます。
$ ls -lR
.:
合計 8
drwxrwxr-x 2 kino8 kino8 4096 10月 18 23:12 cacerts # (CA証明書用ディレクトリ)
-rw-rw-r-- 1 kino8 kino8 2195 10月 18 22:59 server.crt # サーバ証明書
./cacerts:
合計 8
-rw-r--r-- 1 kino8 kino8 1647 10月 18 22:59 mid-ca.crt # 中間CA証明書
-rw-r--r-- 1 kino8 kino8 1200 9月 28 2017 root-ca.crt # ルートCA証明書
2. CA証明書へシンボリックリンクを張る
OpenSSLの仕様[(※)](## 備考:CA証明書のファイル名の規則)で、チェーン検証に使用するCA証明書は証明書ハッシュ値.0
というファイル名でないと認識してくれないため各証明書にそれに応じたシンボリックリンクを作成します。
$ cd cacerts
$ ln -s mid-ca.crt "$(openssl x509 -hash -noout -in mid-ca.crt).0"
$ ln -s root-ca.crt "$(openssl x509 -hash -noout -in root-ca.crt).0"
最終的なディレクトリ内容
$ ls -lR
.:
合計 8
drwxrwxr-x 2 kino8 kino8 4096 10月 18 23:05 cacerts
-rw-rw-r-- 1 kino8 kino8 2195 10月 18 22:59 server.crt
./cacerts:
合計 8
lrwxrwxrwx 1 kino8 kino8 11 10月 18 23:05 2e5ac55d.0 -> root-ca.crt # ルートCA証明書(リンク)
lrwxrwxrwx 1 kino8 kino8 10 10月 18 23:00 4f06f81d.0 -> mid-ca.crt # 中間CA証明書(リンク)
-rw-r--r-- 1 kino8 kino8 1647 10月 18 22:59 mid-ca.crt
-rw-r--r-- 1 kino8 kino8 1200 9月 28 2017 root-ca.crt
3. 検証する
openssl verify
コマンドを使用して、サーバ証明書の検証を行います。
-CApath
には、各CA証明書とリンクが格納されたディレクトリを指定します。
$ openssl verify -CApath ./cacerts server.crt
OKの場合
下記のようなOKのメッセージが出力されれば、-CApath
でした配下にあるCA証明書で証明書チェーンに問題はないことになります。
server.crt: OK
NGの場合
下記のようなエラーが表示される場合は、チェーン検証に使用した中間orルートCA証明書が誤っているか、必要なCA証明書が不足していると思われます。
error 2 at 1 depth lookup:unable to get issuer certificate
補足:CA証明書のファイル名の規則
men verify
でマニュアルを確認すると、以下のように記載されています。
-CApath directory A directory of trusted certificates. The certificates should have names of the form: hash.0 or have symbolic links to them of this form ("hash" is the hashed certificate subject name: see the -hash option of the x509 utility). Under Unix the c_rehash script will automatically create symbolic links to a directory of certificates.
検証用のCA証明書のファイル名は何でもよいというわけではなく、証明書のハッシュ値に.0という拡張子を付けたファイル名で保存するか、証明書へそのような名前を付けたシンボリックリンクを張る必要があるようです。
OpenSSLでは証明書のハッシュ値は以下のコマンドで計算が可能です。
$ openssl x509 -hash -noout -in 証明書ファイル名