サーバ証明書と中間証明書、秘密鍵を確認するスクリプト(Apache)

■前置き

SSL証明書を購入、更新などの作業は毎年毎年繰り返し現れるのに、作業手順は複雑だったり、証明書の設定を間違えるとWebサーバの再起動に失敗したりしてものすごく焦る。

単純に開発環境などで同じ設定のサーバを用意して適用テスト、ブラウザテストとか行ってもいいんだけれど、規模が中途半端で、VPS1台で運用しているパターンもある。

特に、サーバ証明書と秘密鍵、サーバ証明書と中間証明書といったそれぞれがペアになっていることが重要なファイルがある。これを調べるやり方を調べたらこのサイトのopensslコマンドが適切だった。
SSL証明書の簡単な整合性確認方法 | Skyarch Broadcasting

これはかなり有効だった。再起動テストする必要もなく、ファイルとサーバだけあれば、間違った中間証明書をダウンロードしていたこともわかるし、秘密鍵にパスフレーズが適用されっぱなしだったりというミスが防げた。でも、毎回これを適用するコピペが面倒くさくなったのでスクリプトにしたというのがこの記事の主旨(前置き長い)

■スクリプト

#!/bin/bash

if [ $# -lt 1 ];then
  echo 'Usage: /etc/httpd/conf.d/any.conf include SSL'
  exit 1
fi

if [ ! -f ${1} ];then
  echo 'file not exsit' ${1}
  exit
fi

SSLCertificateFile=`fgrep 'SSLCertificateFile' ${1} | awk '{print $2}'`
SSLCertificateChainFile=`fgrep 'SSLCertificateChainFile' ${1} | awk '{print $2}'` 
SSLCertificateKeyFile=`fgrep 'SSLCertificateKeyFile' ${1} | awk '{print $2}'`

echo "サーバ証明書: " ${SSLCertificateFile} # debug
echo "中間証明書: " ${SSLCertificateChainFile} # debug
echo "秘密鍵: " ${SSLCertificateKeyFile} # debug

# 秘密鍵ペア確認
echo 
echo "サーバ証明書と秘密鍵の組み合わせがあっているかを確認。値が同じならOK"

openssl x509 -noout -modulus -in ${SSLCertificateFile} | openssl md5
openssl rsa -noout -modulus -in ${SSLCertificateKeyFile} | openssl md5

# 中間証明書確認
echo 
echo "サーバ証明書と中間証明書の組み合わせがあっているかを確認。値が同じならOK"

openssl x509 -noout -issuer_hash -in ${SSLCertificateFile}
openssl x509 -noout -subject_hash -in ${SSLCertificateChainFile}

でもこのスクリプトに欠点があって、Apache2.2のmod_sslを使った中間証明書の設定は「SSLCertificateChainFile」なんだけれど、Apache2.2-SSLは「SSLCACertificateFile」だったりするし、Apache2.4からは中間証明書とサーバ証明書を1つにまとめろって書いてあったりするし。
参考

Apache + OpenSSL 中間CA証明書のインストール手順
https://httpd.apache.org/docs/2.4/mod/mod_ssl.html#sslcertificatechainfile

このあたり、nginxは証明書のチェックが設定ファイルのSyntaxチェックに入っているので、より手軽なんだなと思ったりする。nginx -V で一通り見れたり、-tで確認したときに、サーバ証明書と中間証明書の順番が間違っていて、秘密鍵とペアになっていない証明書だというエラーが出たりする。