こんにちは、MSPグループエンジニアリングチーム所属の梶です。
本記事は、ユーザーへの影響を最小限にしながらSSL/TLS証明書(以降「TLS証明書」と略す)を安全に更新するために、弊社が利用しているツール、気を付けている点、および作業方法について紹介します。
なお、AWSのElastic Load Balancerなど、クラウドサービスのロードバランサーでTLSターミネーションをせずに、サーバー上のApache HTTP Server(以降「Apache」と略す)やnginxなどでTLS証明書を設定するケースを前提条件として話します。
TLS証明書の更新作業の流れ
弊社ではTLS証明書の更新作業は下記の流れで実施しています。
- TLS証明書を設置する場所を確認する。
- TLS証明書の整合性を確認する。
- TLS証明書をサーバーに設置する。
- 設置場所に応じて設定ファイルを作成する。
- 詳細な更新作業手順および差し戻し作業手順を作成する。
- 第三者が上記の内容が正しいか、不備が無いかなどを確認する。
- 更新作業を実施する。
利用しているツール、気を付けている点、および作業方法
更新作業の流れの各作業について、利用しているツール、気を付けている点、および作業方法を説明します。
TLS証明書を設置する場所を確認する
必ずDNSレコードの確認から始めて、TLSターミネーションがどのサーバーで実施されているかを把握するようにしています。なぜかというとレコードの確認および関連するTLS設定を確認することで、確実にTLS証明書の設置場所の把握ができるからです。また、担当者の記憶に頼らない確実な情報で作業を進める点で重要なためです。前年度の更新作業時の情報を参考にはしますが、サーバー構成の変更などにより前年度までとはTLS証明書の設置場所が異なるケースはあるため、怠らずに実施しています。
具体的な作業内容は以下のとおりです。
- digコマンドでAレコードを確認する
example.com
を例とすると、下記のコマンドを実行します。
dig example.com
- DNSレコードを確認する
例えば、Amazon Route 53にてDNSレコードを管理している場合、AWS管理コンソール上にてRoute 53のDNSレコードを確認します。
- 確認したレコードに関連するロードバランサーやサーバーのTLS設定を確認する
TLS証明書の整合性を確認する
TLS証明書の整合性を確認するツールとして、弊社作成のcheck-tls-certを利用しています。このツールを利用して以下2点を確認します。
- 現在利用中のTLS証明書の整合性を確認する
ネットワーク越しにTLS接続を行い整合性を確認します。check-tls-certのnetコマンドを使用します。
- 発行したTLS証明書が想定通りのものであるか整合性を確認する
プライベート鍵、サーバー証明書、中間証明書を使用し整合性を確認します。check-tls-certのfileコマンドを使用します。
check-tls-certのnetコマンドおよびfileコマンドともに、-vオプションを付けると検査結果の詳細が出力されるため、このオプションを使用し出力結果を確認しています。プライベート鍵とサーバー証明書の鍵ペアの検査、ホスト名の検査、および証明書チェインの検査など多数の検査項目があります。Summaryセクションで問題が無いか簡単に分かるため、手軽に確認できます。
example.com
を例とすると、それぞれ下記のように確認しています。
現在利用中のTLS証明書の整合性を確認する
check-tls-cert net -H example.com -v
発行したTLS証明書が想定通りのものであるか整合性を確認する
check-tls-cert file -H example.com -k プライベート鍵ファイル -f サーバー証明書ファイル -C 中間証明書ファイル -v
サーバー証明書と中間証明書を結合し1つにまとめたファイルで確認する場合は、以下のとおりです。
check-tls-cert file -H example.com -k プライベート鍵ファイル -f サーバー証明書と中間証明書を結合し1つにまとめたファイル -v
コマンドを2回実行するだけで整合性を確認できます。サーバー証明書と中間証明書を結合したファイルでも簡単に確認できます。
check-tls-certが開発される前まではDigiCert SSL Certificate Checkerなどで現在の整合性を確認し、opensslコマンドを使用して発行したTLS証明書の整合性を確認していました。上記で述べた項目を全て確認するには手間や時間がかかっていました。過去に整合性確認の完了後にサーバー証明書と中間証明書の結合順を間違えてファイルを作成し、更新作業後にそのミスに気がつくケースがありました。check-tls-certでは結合したファイルで整合性を確認できるためそのようなミスが減りました。
check-tls-certの詳細については、TLS証明書チェッカーcheck-tls-certの公開にて紹介していますので、参照ください。
TLS証明書をサーバーに設置する
プライベート鍵、サーバー証明書、中間証明書をサーバーに設置します。ファイル名には202306
のように年月を記載して設置しています。ファイル名に年月を記載して設置することで、以降の作業での差分確認がしやすくなったり、何年度に取得したTLS証明書なのかが一目で分かりやすくなったりします。
Apacheを例に紹介します。
ファイル設置例
それぞれのファイルを設置するディレクトリは特に決めていません。多くの場合は現在設置しているディレクトリと同じにしています。下記は /etc/httpd/certs
にファイルを設置する例です。
/etc/httpd/certs/hogehoge.202306.key
:プライベート鍵/etc/httpd/certs/hogehoge.202306.crt
:サーバー証明書/etc/httpd/certs/hogehoge.202306.ca.crt
:中間証明書/etc/httpd/certs/hogehoge.202306.combined.crt
:サーバー証明書と中間証明書を結合し1つにまとめたファイル(結合ファイルを利用する場合は設置する)
設置場所に応じた設定ファイルを作成する
利用中の設定ファイルを直接編集はせずに、必ず更新用および差し戻し用の設定ファイルの2つを別途作成しています。設定ファイルおよび作業手順を作成する日と更新作業の実施日が異なるため、更新作業時にトラブルが発生した際に、ファイルを差し戻しするだけで元の状態に戻しやすくするためです。また、事前に設定ファイルを作成しておくことで、更新作業の担当者はファイルを編集せずに済み、ファイル差分の最終確認と更新の反映作業のみでよくなるため、更新作業時の負担も減ります。
具体的な設定ファイル構成や作業内容は以下のとおりです。
設定ファイル構成
/etc/httpd/conf.d/hogehoge.conf
(利用中の設定ファイル)/etc/httpd/conf.d/hogehoge.conf.202306_new
(更新用の設定ファイル)/etc/httpd/conf.d/hogehoge.conf.202306_bk
(差し戻し用の設定ファイル)
作業内容
- 更新用の設定ファイルを作成する。
cp -abi /etc/httpd/conf.d/hogehoge.conf /etc/httpd/conf.d/hogehoge.conf.$(date +%Y%m%d)_new
- 差し戻し用の設定ファイルを作成する。
cp -abi /etc/httpd/conf.d/hogehoge.conf /etc/httpd/conf.d/hogehoge.conf.$(date +%Y%m%d)_bk
- 更新用の設定ファイルのTLS設定箇所を修正する。
SSLCertificateFile
、SSLCertificateKeyFile
、SSLCertificateChainFile
のパスを新しいファイルのパスに修正します。
vim /etc/httpd/conf.d/hogehoge.conf.$(date +%Y%m%d)_new
- 差し戻し用の設定ファイルと利用中の設定ファイルの差分を確認する。
diff -su /etc/httpd/conf.d/hogehoge.conf /etc/httpd/conf.d/hogehoge.conf.$(date +%Y%m%d)_new
SSLCertificateFile
、SSLCertificateKeyFile
、SSLCertificateChainFile
の行のみが差分であり、パスが正しいか確認します。例えば以下のような差分で各ファイルのパスが正しければよいです。
--- /etc/httpd/conf.d/hogehoge.conf +++ /etc/httpd/conf.d/hogehoge.conf.$(date +%Y%m%d)_new -SSLCertificateFile /etc/httpd/key/hogehoge.202206.crt +SSLCertificateFile /etc/httpd/key/hogehoge.202306.crt -SSLCertificateKeyFile /etc/httpd/key/hogehoge.202206.key +SSLCertificateKeyFile /etc/httpd/key/hogehoge.202306.key -SSLCertificateChainFile /etc/httpd/key/hogehoge.202206.ca.crt +SSLCertificateChainFile /etc/httpd/key/hogehoge.202306.ca.crt
詳細な更新作業および差し戻し作業手順を作成する
内容は以下のとおりです。
更新作業手順
- 対象のドメイン名をWebブラウザで表示確認し証明書の有効期限を確認する。
- サーバーにログインする。
- 複数台のサーバーで更新作業を行う場合は、サーバー上で下記のコマンドのようにcheck-tls-certのnetコマンドにて整合性を確認する。
example.com
を例とすると、下記のコマンドを実行します。
check-tls-cert net -H example.com -I プライベートIPアドレス -v
- 構文チェックを行う。(Apacheでは
httpd -t
やapachectl configtest
で確認する) - 差し戻し用の設定ファイルと利用中の設定ファイルの差分を確認する。
- 利用中の設定ファイルと更新用の設定ファイルの差分を確認する。
- 6の差分が問題なければ更新用の設定ファイルを利用中の設定ファイルに上書きコピーする。
- 構文チェックを行う。
- プロセスを再起動し反映する。
- 対象のドメイン名をWebブラウザで表示確認し、表示に問題がないことおよび有効期限が更新されたことを確認する。
- 複数台のサーバーで更新作業を行う場合は、サーバー上でcheck-tls-certのfileコマンドにて整合性を確認する。
- check-tls-certのnetコマンドにて整合性を確認する。
差し戻し作業手順
- 差し戻し用の設定ファイルを利用中の設定ファイルに上書きコピーする。
- 構文チェックを行う。
- プロセスを再起動し反映する。
- 対象のドメイン名をWebブラウザで表示確認し、表示に問題がないことおよび有効期限が更新前であることを確認する。
- 複数台のサーバーで差し戻し作業をする場合は、サーバー上でcheck-tls-certのfileコマンドにて整合性を確認する。
- check-file-certのnetコマンドにて整合性を確認する。
更新作業および差し戻し作業の手順で実施するプロセスの再起動方法と、Webブラウザでの表示確認後にcheck-tls-certのnetコマンドで整合性を確認している理由について述べます。
プロセスの再起動方法について
プロセス再起動の方法はgraceful restartを使用します。通常のrestartではリクエスト処理中でも即座にプロセス停止や再起動が行われるため、ユーザーへ影響を及ぼす可能性があります。そのため影響を最小限に抑えるためgraceful restartでプロセスを再起動します。
systemdを使用している環境であれば、systemctl reload httpd.service
がgraceful restartとなります。
Apacheのgraceful restartの詳細については、Apache HTTP Serverのgraceful stop/restartを理解するにて紹介していますので、参照ください。
Webブラウザでの表示確認後にcheck-tls-certで整合性確認をする理由
Webブラウザによっては中間証明書の設定が間違っていた場合でも補完して表示されるものがあり、その場合にWebブラウザでの表示確認のみでは気づけません。そのような気づけないエラーを防ぐため、Webブラウザでの表示確認後にcheck-tls-certのnetコマンドにて整合性を確認しています。
第三者が上記の内容が正しいか、不備が無いかなどを確認する
第三者が各作業で確認した内容が正しいか、不備が無いかを確認します。更新対象のサーバー構成を把握している担当者が確認します。
更新作業を実施する
作業手順に従い更新作業を実施します。ユーザーへ影響を最小限に抑える点やトラブルが発生した場合の各所との連携が遅れないようにする点などを考慮し、基本的には休日以外の深夜帯に更新作業を実施しています。
おわりに
TLS証明書を安全に更新するために弊社が利用しているツールや気を付けている点、作業方法について紹介しました。