今回は、nginxでSSLを使ってみます。
つまり、https:// でアクセスできるようするということです。
今回は、以前の「Nginx でPHPを動かす(php-fpmをバイナリパッケージ(rpm)を作成し、インストールする) [PHP5.2系の場合]」による簡単なnginxの設定例を元の
nginxでSSLを使うための設定例をあげて、簡単に解説してみます。
(参考)
listen ディレクティブの ssl パラメータは 0.7.14 以降からサポートされています。
バージョン 0.7.65 と 0.8.20 以降のデフォルトの SSL 暗号は HIGH:!ADH:!MD5 です。
- 目次
- 履歴
2015年2月19日 SNI対応、バージョン情報追加
2013年5月16日 他ディストリビューション対応
2011年10月20日 初版
SSL用の証明書作成
ここでは、プライベート認証局にて署名されたサーバー証明書を使いたいと思います。
サーバー証明書の作成は、プライベート認証局の証明書、サーバー証明書、クライアント証明書の作成方法について を参照してください。
(ここでは例として、サーバー証明書作成時の Common Name に www.exmaple.com を指定して作成します。)
- OpenSSLのインストールは、 → OpenSSLのインストールする からどうぞ。
- プライベート認証局から作成が必要な方は、 → 証明書を作成する からどうぞ。
- サーバー証明書のみ作成が必要な方は、 → サーバー用の証明書を作成する。 からどうぞ。
ここでは、サーバー証明書、秘密鍵ファイルがそれぞれ以下のファイル名で作成されたものとして、以降、記述します。
- プライベート認証局証明書 → /etc/pki/CA/cacert.pem
- サーバー証明書
www.example.com サイト用 → /etc/pki/CA/certs/www.example.com.crt
www.example.org サイト用 → /etc/pki/CA/certs/www.example.org.crt
- サーバー秘密鍵
www.example.com サイト用 → /etc/pki/CA/private/www.example.com.key
www.example.org サイト用 → /etc/pki/CA/private/www.example.org.key
- 失効証明書リスト → /etc/pki/CA/revoke.crl
nginx の SSL設定
簡単な設定例
以下に、Nginx でPHPを動かす(php-fpmをバイナリパッケージ(rpm)を作成し、インストールする) [PHP5.2系の場合] でのnginxの簡単な設定例に、SSLの設定を加えてみました。
SSLの設定箇所は、赤:追加で記載しているとことです。
/etc/nginx/nginx.conf で設定する例
|
|
ここでの設定は、最も簡単な設定です。以降に簡単な解説をしておきます。
各ディレクティブ (設定項目)の詳細については、SSL関連ディレクティブ(パラメータ)の解説 で詳しく解説していますので、そちらを参照してください。
- 5 行目 : listen TCPポートを指定しています。
SSL接続のデフォルトポート番号 443 を指定し、このサーバーがデフォルトサーバー(default_server) かつ SSL接続(ssl) であることを明示しています。 - 6 行目 : サーバー証明書ファイルパスを指定してます。
- 7 行目 : サーバー証明書の秘密鍵ファイルパスを指定してます。
実質、この3行を正しく指定してあげれば、SSL接続できます。
/etc/nginx/conf.d/www.example.com.conf で設定する例
CentOS/ScientificLinux などで、公式サイト(http://nginx.org)からインストールした場合、
/etc/nginx/conf.d/ 配下に サイト毎の 拡張子 .conf を付加したファイル名で設定ファイルを作成するようになっています。
ここでは、/etc/nginx/conf.d/www.example.com.conf というファイル名で、以下のような内容となるでしょう。
|
/etc/nginx/nginx.conf の例と同じですが、serverディレクティブのみを記載することになります。
詳細内容については、上記と同じなので、解説は割愛します。
/etc/nginx/sites-available/www.example.com.conf で設定する例
Debian/Ubuntu などでは、各ディストリビューションにてNginxのパッケージが用意されています。
この用意されたNginxをインストールした場合、/etc/nginx/sites-available/ 配下に サイト毎の設定ファイルを適当なファイル名で作成するようになっています。(この場合、拡張子はなんでも可です)
ファイルの中身は、上記の /etc/nginx/conf.d/www.example.com.conf 全く同じになります。
ここでは、/etc/nginx/sites-available/www.example.com.conf というファイル名で作成したとします。
ここで注意しなければならないのは、このままでは、このサイト設定ファイルは有効にならない点です。
有効にするために /etc/nginx/sites-enabled/ 配下に 先の /etc/nginx/sites-available/www.example.com.conf のリンクファイルを作成することで有効化になります。
|
このようにリンクファイルを作成すると有効となります。
マルチドメインの設定例(IPアドレス編)
上記では、非常に簡単なSSL接続の例を示しました。
次にマルチドメインによる複数の仮想サイトに対して、SSL接続をさせる設定例を簡単に解説してみます。
この場合、古くからあるSSL接続では、IPアドレスを分けてやることです。
以降に、IPアドレスを分ける設定例を簡単に解説してみます。
/etc/nginx/nginx.conf で設定する例
|
|
ここでの設定は、最も簡単な設定です。以降に簡単な解説をしておきます。
各ディレクティブ (設定項目)の詳細については、SSL関連ディレクティブ(パラメータ)の解説 で詳しく解説していますので、そちらを参照してください。
- 5 行目 / 14 行目 : listen サーバーのIPアドレス + TCPポートを指定しています。
先の簡単な設定例とは異なり、IPアドレスを指定していることに注意してください。 - 6 行目 / 15 行目 : それぞれのサーバー証明書ファイルパスを指定してます。
- 7 行目 / 16 行目 : それぞれのサーバー証明書の秘密鍵ファイルパスを指定してます。
ポイントは、IPアドレスの指定だけでしょう。
続けて、IPアドレスを分けることができない場合は、SNIを利用することで実現することができます。
/etc/nginx/conf.d/www.example.com.conf で設定する例
CentOS/ScientificLinux などで、公式サイト(http://nginx.org)からインストールした場合、
/etc/nginx/conf.d/ 配下に サイト毎の 拡張子 .conf を付加したファイル名で設定ファイルを作成するようになっています。
ここでは、/etc/nginx/conf.d/www.example.com.conf および www.example.org.conf というファイル名で、以下のような内容となるでしょう。
/etc/nginx/conf.d/www.example.com.conf
|
/etc/nginx/conf.d/www.example.org.conf
|
/etc/nginx/nginx.conf の例と同じですが、serverディレクティブのみを記載することになります。
詳細内容については、上記と同じなので、解説は割愛します。
/etc/nginx/sites-available/www.example.com.conf で設定する例
Debian/Ubuntu などでは、各ディストリビューションにてNginxのパッケージが用意されています。
この用意されたNginxをインストールした場合、/etc/nginx/sites-available/ 配下に サイト毎の設定ファイルを適当なファイル名で作成するようになっています。(この場合、拡張子はなんでも可です)
ファイルの中身は、上記の /etc/nginx/conf.d/www.example.com.conf および www.example.org.conf 全く同じになります。
ここでは、/etc/nginx/sites-available/www.example.com.conf というファイル名で作成したとします。
ここで注意しなければならないのは、このままでは、このサイト設定ファイルは有効にならない点です。
有効にするために /etc/nginx/sites-enabled/ 配下に 先の /etc/nginx/sites-available/www.example.com.conf および www.example.org.conf のリンクファイルを作成することで有効化になります。
|
このようにリンクファイルを作成すると有効となります。
マルチドメインの設定例(SNI編)
先の設定例では、IPアドレスを分けることでSSL接続するようにしました。
この方法は、古くからある手法です。
ただ、IPアドレスは、IPv4はすでに枯渇していますし、IPアドレスを追加する場合には、それなりに手間と対価が必要となってしまいます。
そこで考えられたのが、SNI(Server Name Indication)です。
以降に、SNIを用いた設定例を簡単に解説してみます。
SSL/TLSの拡張仕様で、 SSL接続時にクライアントがサーバー名(サイト名)を提示することで、 サーバ側がグローバルIP毎ではなくサーバー名(サイト名)によって異なる証明書を使い分けることを可能にものです。
これは、非常に便利で安価に多くのサイトのSSL接続が実現できることで、クライアント側(ウェブブラウザ)の対応が進んできました。 しかし、Andoroidなど新しいOSなどでは、まだ、完全な普及には至っていないのが現状です。
現在のSNI SSL の対応状況は、以下のとおりです。
- Internet Explorer 7 以降(Windows Vista以降のみで、Windows XPではInternet Explorer 8でも非対応)
- Mozilla Firefox 2.0 以降
- Opera 8.0 (2005年) 以降 (設定でTLS 1.1を有効にする必要がある)
- Opera Mobile 10.1 β 以降 (Android)
- Google Chrome (Windows Vista以降。バージョン6でWindows XPに対応。Chrome 5.0.342.1でOS X 10.5.7 以降に対応)
- Safari 3.0 以降 ((Mac OS X 10.5.6 以降、Windows Vista以降、iOS 4.0以降)
- Konqueror/KDE 4.7 以降
- Android ブラウザ (Android 3.0 (Honeycomb) 以降)
- Windows Phone 7
- MicroB(Maemo)
Androidが一番気になるところかもしれません。2014.4のデータからすると Android 3.0未満の使用割合は、Androidユーザの2割弱程度とされています。 今では、さらに小さくなっているかもしれませんが、それを無視できるか・・・というところだと思います。
その確認は、バージョン情報で確認することができます。
|
もし、出力されない場合は、バージョンが 0.5.32 以降で 全てSNI対応となっているはずなので、公式サイトからのインストールを行うことをおすすめします。
また、OpenSSLの対応も必要ですが、これも自前でコンパイルしていない限り、ほとんど対応しています。 もし、対応していない OpenSSL を使用すると警告メッセージが出力されます。
|
/etc/nginx/nginx.confの設定例
|
|
ここでの設定は、最も簡単な設定です。以降に簡単な解説をしておきます。
各ディレクティブ (設定項目)の詳細については、SSL関連ディレクティブ(パラメータ)の解説 で詳しく解説していますので、そちらを参照してください。
- 5 行目 / 14 行目 : listen TCPポートを指定しています。
先の簡単な設定例とは異なり、IPアドレスの指定が無くなっていることに注意してください。 - 6 行目 / 15 行目 : それぞれのサーバー証明書ファイルパスを指定してます。
- 7 行目 / 16 行目 : それぞれのサーバー証明書の秘密鍵ファイルパスを指定してます。
ポイントは、IPアドレスの指定有無だけでしょう。
/etc/nginx/conf.d/www.example.com.conf で設定する例
CentOS/ScientificLinux などで、公式サイト(http://nginx.org)からインストールした場合、
/etc/nginx/conf.d/ 配下に サイト毎の 拡張子 .conf を付加したファイル名で設定ファイルを作成するようになっています。
ここでは、/etc/nginx/conf.d/www.example.com.conf および www.example.org.conf というファイル名で、以下のような内容となるでしょう。
/etc/nginx/conf.d/www.example.com.conf
|
/etc/nginx/conf.d/www.example.org.conf
|
/etc/nginx/nginx.conf の例と同じですが、serverディレクティブのみを記載することになります。
詳細内容については、上記と同じなので、解説は割愛します。
/etc/nginx/sites-available/www.example.com.conf で設定する例
Debian/Ubuntu などでは、各ディストリビューションにてNginxのパッケージが用意されています。
この用意されたNginxをインストールした場合、/etc/nginx/sites-available/ 配下に サイト毎の設定ファイルを適当なファイル名で作成するようになっています。(この場合、拡張子はなんでも可です)
ファイルの中身は、上記の /etc/nginx/conf.d/www.example.com.conf および www.example.org.conf 全く同じになります。
ここでは、/etc/nginx/sites-available/www.example.com.conf というファイル名で作成したとします。
ここで注意しなければならないのは、このままでは、このサイト設定ファイルは有効にならない点です。
有効にするために /etc/nginx/sites-enabled/ 配下に 先の /etc/nginx/sites-available/www.example.com.conf および www.example.org.conf のリンクファイルを作成することで有効化になります。
|
このようにリンクファイルを作成すると有効となります。
ここでもわかるようにSNIに対応していないブラウザは、サイト名を通知してこないので、Nginxはデフォルトサイトと認識し、 www.example.com の証明書、秘密鍵ファイルを使おうとします。そこで、サイト名の不一致となり、上記の警告メッセージとなったようですね。
SSL関連ディレクティブ(パラメータ)の解説
nginx server部には、上記で設定しているディレクティブ(パラメータ)以外にもSSL関連ディレクティブがあります。
以降に、上記で使用しているSSL関連ディレクティブ(パラメータ)を含めて簡単に解説をしておきます。
[目次(ディレクティブ一覧)]
- listen 443 ssl;
- ssl on;
- ssl_certificate /etc/
pki/ CA/ certs/ www.example.com.crt; - ssl_certificate_key /etc/
pki/ CA/ private/ www.example.com.key; - ssl_client_certificate /etc/
pki/ CA/ cacert.pem; - ssl_dhparam /etc/
pki/ tls/ certs/ dbparam.pem; - ssl_ciphers ALL:!
ADH:! EXPORT56: RC4+ RSA:+ HIGH:+ MEDIUM:+ LOW:+ SSLv2:+ EXP; - ssl_crl /etc/
pki/ CA/ revoke.crl; - ssl_prefer_server_ciphers off;
- ssl_protocols SSLv2 SSLv3 TLSv1;
- ssl_verify_client on;
- ssl_verify_depth 1;
- ssl_session_cache off;
- ssl_session_timeout 5m;
- ssl_engine;
ここでは、SSLなので443番を使います。かつ、sslを明記することで、このポートがSSLにて接続することになります。
また、http の80 番と併記することも可能で、その場合は、default_serverも指定すべきです。
|
このディレクティブではなく、上記の listen ディレクティブ の ssl を指定することをおすすめします。
[ デフォルトの設定 ]
|
[ デフォルトの設定 ]
|
[ デフォルトの設定 ]
|
DHパラメータは、以下のように作成できます。
|
例えばOpenSSLの暗号化方式のフォーマットは、以下のように設定されます。
[ デフォルトの設定 ]
|
|
※問題多し。offとして使っておいた方が良い。
[ デフォルトの設定 ]
|
[SSLv2] [SSLv3] [TLSv1]
[ デフォルトの設定 ]
|
on|off|optional
[ デフォルトの設定 ]
|
[ デフォルトの設定 ]
|
- off : ハードオフ:nginxのは、明示的にクライアントへのセッションが再利用できないと言う。
- none : ソフトオフ:nginxのは、セッションが再利用できることをクライアントに言うが、nginxのは、実際にそれらを再利用することはありません。 ssl_session_cacheがメールプロキシだけでなく、HTTPサーバーで使用される可能性があるこれは、一部のメールクライアントのための回避策です。
- builtin : OpenSSLの組み込みキャッシュは、ワーカープロセスは1つだけの内部で使用されています。キャッシュサイズは、セッションの数に割り当てられています。注:この方法を使用してメモリの断片化の問題があるよう、これを使用するときに考慮してください。下記の”参考文献”を参照してください。
- shared : キャッシュは、すべてのワーカープロセス間で共有されます。キャッシュのサイズはバイト単位で割り当てられます:1 MBキャッシュは約4000のセッションを含めることができます。それぞれの共有キャッシュは、任意の名前を指定する必要があります。指定された名前を持つ共有キャッシュは、複数の仮想ホストで使用することができます。
[ デフォルトの設定 ]
|
[ デフォルトの設定 ]
|
|
今回のような独自の(勝手に作成した)SSL用証明書を用いた場合、FireFoxでは、以下のような警告ページが表示されてしまいます。
この警告は、
「あらかじめ指定されている認証局によって作成された証明書ではないので危ないサイトかもしれません・・・。」という趣旨のメッセージです。
事前に独自に作成した認証局の証明書をインポートしておくと上記のような警告は出ません。 詳しくは、プライベート認証局を登録(インポート)するを参照してください。
このような独自のSSL証明書を公式サイトなどで利用することは、まず、ありえないと思います。 上記のような警告メッセージが表示されるだけで、普通は、危険なサイトだと思いますからね。
通常、このような独自の証明書は、 内部的(例えば社内など)に限られた人だけが参照するようなサイトで、事前に認証局の証明書を配布、インポート作業を行ってもらうことで、 警告メッセージなしでSSLの暗号化によるセキュアな接続が可能となるものです。
更に、クライアント証明書を使って訪問者認証も行うこともできます。ここまでやると社内でも、ある程度、セキュアな社外秘的なサイト運営ができるかと思います。
このサイトでは、コンテンツの一部が非表示、あるいは、コメント、お問い合わせの投稿ができない、検索ができないことがあります。
コメントを投稿 :