スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

オレオレ証明書を信頼のおけるSSL証明書にしてみる Vol.3 (証明書の設定とインストール)

前回の「オレオレ証明書を信頼のおける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接続したい場合は是非参考にしてみてください。
スポンサーサイト

コメントの投稿

非公開コメント

すげーわかりやすかったす

まさに知りたい情報どんぴしゃでした。ありがとうございます。

飛躍がありすぎて、

できたら素晴らしいことだと思うのですが、Vol.2 と Vol.3 の間に飛躍があって進めることができません。例えば、「01. Apache or nginxへの証明書の設定」 で、

SSLCertificateChainFile "/usr/local/ssl/ICA/ica.crt" # 中間認証局の証明書

を設定しているファイルは、何のファイルでしょうか? また、この ica.crt は、初めて出て来たファイル名です。このままだと、エラーになると思うのですが、いかがでしょうか? 正直、まともに出来るのなら、非常に期待はしているのですが。

Re: 飛躍がありすぎて、

コメントありがとうございます。
飛躍というのはCRTファイルの生成方法が記載されていないというだけでしょうか?
こちらはVol.2のDERファイル作成方法のところに追記しておきましたのでご確認ください。
プロフィール

Author:Kou
モバイル関連の開発ばかりやってる人のブログです。たまにWebもやります。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。