はじめに
ApacheやnginxといったOpenSSLバンドル系のWebサーバを利用している場合、証明書を連結して一つのファイルにしてインストールする必要があります。
本記事では、それらに対する考え方について解説しています。
証明書の連結について
認証局にサーバ証明書を発行してもらう場合、その認証局は一般的に中間認証局です。
例えば上の図では、サーバAをSSL対応にすべく中間認証局X1にサーバ証明書を発行してもらいました。
さて、サーバ証明書は能動的に発行して取得する必要がありますが、何もせずともクライアントはルート証明書を保持しています。
というのも、出荷時に信頼あるルート認証局群のルート証明書はデフォルトでインストールされているからです。
例えば、セコムトラストシステム社やシマンテック社のルート証明書がそれらにあたります。
(シマンテック社のルート証明書)
ここからが本題ですが、
サーバ証明書Aと中間証明書X1を連結していない場合、クライアントAはWebサーバAとSSL通信をすることができません。
その理由は、サーバ証明書Aに対して署名を行なっているのがルート認証局Xではなく中間認証局X1だからです。
そこでWebサーバAは、サーバ証明書Aと中間証明書X1を連結してサーバ内に保持する必要があります。
それにより、サーバ証明書A - 中間証明書X1 - ルート証明書X の署名の連鎖が成立します。
nginxを例に説明
例えばWebサーバでおなじみのnginxを例にします。
中間認証局X1にサーバ証明書Aを発行してもらいます。
サーバ証明書の拡張子は、証明書(certificate)からcrtやcerとなっています。
さて、WebサーバAでは、発行されたサーバ証明書とは別に、中間認証局X1の中間証明書X1*1をインストールしておきます。中間証明書は、認証局のWebサイトで公開されています。
そしてWebサーバに配置するために、この二つのファイルを、連結して1つのファイルとします。
cat serverA.crt caX1.pem > certsAX1.pem
言わずもがなですが、crtをcatできるということはcrtはpem形式です。der形式であれば結合はできないです。
ちなみに、このファイル合成は順序にも意味があり、ルート証明書から遠い順にファイルを合成する必要があります。
このファイル合成を
サーバー証明書と中間証明書の連結
と言います。
例えば、認証局X1の下に認証局x1があった場合は、
cat serverA.crt cax1.pem caX1.pem といったようにさらに連結数を増やします。
ここで作成したファイルは設定ファイルでフルパス指定して利用します。
ssl_certificate = /etc/nginx/xxxx/certsAX1.pem ssl_certificate_key = /etc/nginx/xxxx/server.key ...
server.keyは、認証局X1に証明書発行要求(CSR : Certificate Signing Request)をした際に用いた秘密鍵です。
ここまで行えば、
クライアントAはWebサーバAとSSL通信をすることが可能です。。
WebサーバAの公開鍵は、ルート証明書Xの署名に行き着くからからです。
ちなみに、クライアント側に中間証明書を保持させることで署名の連鎖を行うことも可能です。ただし、クライアントに配布する必要があるのであまり採用はされません。
以上、サーバ証明書と中間証明書の連結でした。ご参考になれば幸いです。
*1:中間証明書は中間CA証明書とも言います。