前回の「
オレオレ証明書を信頼のおけるSSL証明書にしてみる Vol.2 」の続きです。
証明書の準備が出来たので、残るは設定とインストールだけになります。
今回は簡潔に設定方法を紹介します。
01. Apache or nginxへの証明書の設定 ここでは Apache と nginx について設定例を紹介します。
■Apacheの場合
Apacheの場合、443のVirtualHostディレクティブ内へサーバのSSL証明書、サーバの秘密鍵、サーバのSSL証明書を署名した中間認証局の証明書の3つの情報を設定すればOKです。
具体的には以下のように設定します。
<VirtualHost _default_:443> (...省略...) SSLCertificateFile "/usr/local/ssl/private/server.crt" # サーバのSSL証明書 SSLCertificateKeyFile "/usr/local/ssl/private/server.key" # サーバのSSL証明書の秘密鍵 SSLCertificateChainFile "/usr/local/ssl/ICA/ica.crt" # 中間認証局の証明書 (...省略...) </VirtualHost> 中間認証局が複数ある場合は、以下のようにサーバのSSL証明書を署名した中間認証局から順に結合していき、出来たファイルを SSLCertificateChainFile ディレクティブへ設定します。
ここでは、ica3.crt がサーバのSSL証明書を署名した中間認証局の証明書とし、以降番号の降順にルート認証局へ近づくようになっています。
(※ただし、これについては推奨しません。詳細は後述の 03 を参照)
cat ica3.crt ica2.crt ica.crt > ica-bundle.crt ■nginxの場合
nginxの場合は、Apacheの中間認証局の証明書を設定する
SSLCertificateChainFile ディレクティブに相当するものがありません。
そのため、nginxの場合は、サーバのSSL証明書の後ろにサーバ証明書を署名した中間認証局の証明書を記述します。
具体的には以下のコマンドで、nginx用のサーバのSSL証明書を作成します。
cd /usr/local/ssl cat certs/server.crt ICA/ica.crt > certs/server.nginx.crt 作成したSSL証明書と秘密鍵を以下のように nginx の conf ファイルへ設定します。
server { listen 443; (...省略...) ssl_certificate /usr/local/ssl/certs/server.nginx.crt; ssl_certificate_key /usr/local/ssl/private/server.key; (...省略...) } Apacheの場合と同じく、中間認証局が複数ある場合は、以下のようにサーバ証明書を署名した中間認証局から順に結合していきます。(※ただし、これについては推奨しません。詳細は後述の 03 を参照)
cat server.crt ica3.crt ica2.crt ica.crt > certs/server.nginx.crt 以上で、Apacheまたはnginxへの設定は完了になります。
02. ブラウザまたはiPhoneへ認証局の証明書をインストールする Vol.2で作成したバイナリ形式の証明書である「rca.der」と「ica.der」をインストールします。
手順は至って簡単で、これらのファイルをOS内へダウンロードし、ダブルクリックして信頼する証明書としてインストールすればOKです。(IEやChromeの場合はOSに設定された証明書情報を参照しますが、Firefoxの場合はブラウザ本体に設定するため注意)
iPhoneの場合は、http でアクセス可能な場所へこれらバイナリ形式の証明書を配置し、Safariでダウンロードして信頼する証明書としてインストールするだけでOKです。
以上で、オレオレ証明書が設定されたサーバであるにも関わらず警告が出ずにSSL通信を行うことが可能になりました。
認証局を作る手順が若干手間ですが、一度作ってしまえば簡単ですので、是非試してみましょう。
03. サーバに設定された中間認証局の証明書とブラウザやOSにインストールされた認証局の証明書の関係 ところで、前回の例ですと中間認証局にあたる
「部長」「課長」「係長」がいるという話になっていたかと思います。
これらは「社長」であるルート認証局から以下の用に4段階に分けて認証局を経て署名されていることになります。
社長 ↓ ←署名 部長 ↓ ←署名 課長 ↓ ←署名 係長 ↓ ←署名 一般社員 (サーバのSSL証明書) このうち、どれか1つでも証明書が欠けているとSSL通信時に「警告」が出るようになります。
証明書を設定出来る場所は、ユーザのOSまたはブラウザ、
サーバのApacheまたはnginxのいずれかになります。
つまり、OS(ブラウザ)に「社長」と「部長」の認証局証明書が予めインストールされている場合、
サーバ(Apache or nginx)側で設定するべき認証局証明書は「課長」と「係長」になります。
別の例ですと、OS(ブラウザ)に「社長」しかインストールされていない場合は、
サーバ(Apache or nginx)側で設定するべき認証局証明書は「部長」と「課長」と「係長」になります。
Apacheの設定を例にもう少し具体的に説明しますと、
ブラウザがSSL証明書の設定されたサーバへSSL接続を行うとき、
まずサーバ側から SSLCertificateFile ディレクティブで設定された証明書情報と
SSLCertificateChainFile ディレクティブで設定された証明書情報をダウンロードします。
そして、ブラウザ側で予め持っている証明書の情報と繋ぎあわせ、
「社長」〜「一般社員」まで繋げることが出来れば成功と判断し、
信頼のあるサーバとして警告を出さずにSSL接続することが出来るようになるわけです。
なので極端な話、
サーバ側の SSLCertificateChainFile ディレクティブに
すべての中間認証局の証明書を結合し、
ルート認証局だけブラウザ側へ信頼のある証明書としてインストールしてしまえば、それだけでも警告なしに接続することが出来るようになります。
ですが、それだとセキュリティ的にあまり意味がない話となります。
なぜなら、「社長」以外の中間認証局の証明書はそのサイトへSSL接続したときに自動的にダウンロードされるわけですから、4段階で署名したものが1段階で署名したものと大差ないことになってしまいます。
Vol.1の例でも説明したとおり、「社長」だけを懐柔しておけばいいという話になってしまいますから、これだとよろしくないわけです。
なので、基本はサーバ証明書を署名した中間認証局(係長)の証明書だけを
SSLCertificateChainFile ディレクティブへ設定し、
その他は予めブラウザやOS側へインストールされているという状態が望ましいです。
以上で、3回に渡って説明してきたオレオレ証明書を信頼のおけるSSL証明書にしてみる説明は終了になります。
今回の手順を使えば、iPhoneやAndroidでも警告なしのSSL通信を行うことが可能になりますので、テスト環境でSSL接続したい場合は是非参考にしてみてください。
スポンサーサイト