WebサーバのSSL証明書の設定・更新方法です。

証明書取得の準備

SSL証明書を取得するには、サーバを固有の秘密鍵と公開鍵のセット(キーペア)と、サーバについての情報となる正式なURLや所属情報とを先に決めます。

これらを準備したのち、公開鍵とサーバについての情報を取りまとめた CSR を作成します。

キーペアの作成とCSRの作成は弊社で準備することもできます。

証明書の取得

CSRを認証局に提出し、証明書を発行してもらいます。この手続きは弊社で代行することもできます。

証明書を受け取ったら、同時に中間証明書ファイルも確認・取得するようにしてください。例えば NII のUPKIを使用する場合は、こちらのページからダウンロードできます。

証明書の確認

発行された証明書(および中間証明書)を送っていただければ、設置と反映の操作は弊社で行うことができます。

WebClass では Apache を利用していますので、Apache に設定することを想定して /etc/apache2/ ディレクトリの下に証明書ファイルを配置し、あらかじめ証明書の内容を点検します。

証明書の中身、証明書とキーの一致、中間証明書と証明書の対応の3点を確認します。キーと証明書の一致確認では、それぞれの md5 のハッシュが一致していれば大丈夫です。また、中間証明書があっているか確認します。

$ cd /etc/apache2/ssl-2019
$ ls
your_site.key  your_site.cer ca_chain.cer

$ # check cert
$ openssl x509 -noout -modulus -in your_site.cer -subject
$ openssl x509 -noout -modulus -in your_site.cer -dates

$ # check pair
$ openssl x509 -noout -modulus -in your_site.cer | openssl md5
$ openssl rsa -noout -modulus -in your_site.key | openssl md5
$
$ # check CA
$ openssl verify -CAfile ca_chain.cer your_site.cer 
your_site: OK

認証局証明書のチェックがうまくいかない場合は、ルート証明まで一通り取得して1つのファイルにまとめてベリファイにかけます。

Apache で利用する準備

証明書ファイルの内容がチェックできたら、Apacheで使用するために秘密鍵のパスワードを解除し、設定ファイルを準備します。

$ # decypt key
$ openssl rsa -in your_site.key -out your_site.nopass.key

Apache の設定を編集し、証明書ファイル、パスワード解除鍵ファイル、中間証明書ファイルのパスを指定します。指定が間違っているなどファイル読めないと、Apache リロード時にエラーが出ます。そこでapache2ctl configtest コマンドを使って、証明書の指定や、その他設定の記述に誤りがないか確認しておきます。

$ apache2ctl configtest
Syntax OK

なお、Apache の設定ファイルの変更は当日に行うのが良いです。早朝にCRON 等で logrotate を設定している場合、そこで自動的に apache がリロードしている可能性があります。意図せぬタイミングで更新した設定が再読み込みされる可能性があります。

サーバへの反映と確認

リロードには Apache の graceful という再起動方法を使用します。この方法を使うことで、ちょうど利用者がWebサーバに対してリクエスト処理を投げたところのタイミングであったとしても、急にプロセスを殺してしまわないで、処理を終えてから再起動がかかります。したがって、特にサービスの停止は必要ありません。念のため、利用者が空いている時間帯で実施すればよいです。

実際の操作コマンドとしては、Debain でも RHEL でも systemctl reload apache2  もしくは systemctl reload httpd とコマンドを実行すると、実際には graceful が行われます。

# systemctl reload apache2

その後、ブラウザで開いて証明書をチェックします。

サーバから localhost あてに SSL 証明書のチェックを行うこともできます。特に Web サーバが複数大ある場合で、それぞれに SSL 証明書をインストールしている場合は、Webサーバ上で確認する方が確実です。以下のコマンドで確認します。your_site は公開しているFQDNにします。バーチャルホストで複数のURLがあるときも、-servername の切り替えによってチェックし分けることができます。

$ openssl s_client -connect localhost:443 -servername your_site  -showcerts | openssl x509 -noout -subject
$ openssl s_client -connect localhost:443 -servername your_site  -showcerts | openssl x509 -noout -dates