こんにちは、鯨井貴博@opensourcetechです。
今回は、Qiita nginx advent calenderの12/25を兼ねた記事となります。
以下のような構成を作ってみようと思います。
※他の方のように、ソースコードなどバリバリとはいかないので、
画像等でカバーしていこうと思います。
-------
クライアント(各種ブラウザ)
↑
https&SSLクライアント認証
↓
Nginx1.7.8(Webサーバ) on CentOS6.6(64bits)
CAの構築
OpenSSLのインストール
yumでサクッと関連パッケージも含めてインストールします。
yum install openssl*
続いてCAの構築。
CAスクリプト(この例では、/etc/pki/tls/misc配下のCA.pl)を実施し、CAを作成します。
/etc/pki/tls/misc/CA.pl -newca
作成した結果、秘密鍵であるcakey.pemと公開鍵(証明書)であるcacert.pemが生成されます。
サーバ証明書・秘密鍵の生成
サーバ用の証明書(公開鍵)及び秘密鍵を/usr/local/ssl/selfSSLに作成します。
mkdir /usr/local/ssl/selfSSL
openssl genrsa -out /usr/local/ssl/selfSSL/server.key 2048(秘密鍵生成)
openssl req -new /usr/local/ssl/selfSSL/server.key -out /usr/local/ssl/selfSSL/server.csr
(CSRの生成)
openssl ca -in server.csr -out server.crt -keyfile /etc/pki/CA/private/cakey.pem
(CSRへの署名→公開鍵の生成)
クライアント証明書の生成
続いて、クライアント証明書を作成します。
openssl genrsa -out client.key 2048(秘密鍵の生成)
openssl req -new client.key -out client.csr(CSRの生成)
openssl ca -cert /etc/pki/CA/cacert.pem -keyfile /etc/pki/CA/private/cakey.pem -in client.csr -outdir /usr.local/ssl/clientSSL -out client.crt
(CSRへの署名→公開鍵の生成)
続いて、クライアント側で利用出来るように、秘密鍵と公開鍵を合わせたpksc12形式へ変換します。
openssl pksc12 -export -clcerts -inkey client.key -in client.crt -out client.p12
なお、ここでクライアントへインポートする際に使用するパスワードを設定しますので、忘れないようにしてください。
Nginx1.7.8のインストール
続いて、Nginxのインストールです。
ソースコードは、nginx.orgより取得します。
今回は現時点において最新の1.7.8です。
cd /usr/local/src
wget http://nginx.org/download/nginx-1.7.8.tar.gz
tar zxvf nginx-1.7.8.tar.gz
余談ですが、上記にはロシア語での変更履歴(CHANGES.ru)もあり、
ロシア語の勉強にもなります(笑)
configureを実施する前に、configure時に必要となる各種パッケージを入手しておきます。(SSLやSPDYモジュールを使用する為に必要です)
yum -y install gcc zlib* pcre*
そして、Standart HTTP modules以外のものを使用する場合、
以下のようにオプションを付けてconfigureを実施します。
(SSLやSPDYは、optional HTTP modulesになります)
./configure --with-http_ssl_module --with-http_spdy_module --with-http_auth_request_module
その他、モジュールについて知りたい方は、
Modules - Nginx Communityをご参照下さい。
そして、コンパイル&インストール
make
make install
続いて、nginxのインストールディレクトリを探して、環境変数PATHに追加します。
find / -name nginx
PATH=$PATH:/usr/local/nginx/sbin
また、nginx -VでPATH設定を確認しておきます。
なお、-Vオプションでは、使用されているモジュールに関する情報も確認出来ます。
Nginx1.7.8の設定
そして、いよいよNginxの設定です。
vi /usr/local/nginx/conf/nginx.conf
[listen] 使用ポートやSSL・SPDYの使用を定義
[server_name] サーバ名を設定
[ssl_certificate] サーバの証明書を指定
[ssl_certificate_key] サーバの秘密鍵を指定
[ssl_client_certificate] クライアント認証で使用するCAの証明書指定
[ssl_verify_client] クライアント認証の有効化
その他の設定についても知りたい方は、
Alphabetical index of directivesでチェックしてみて下さい。
設定ファイルに記載したパスに、
サーバの証明書・秘密鍵、クライアント認証で使用するCAの証明書をコピーします。
Nginx1.7.8の起動
nginxで起動。
lsof -i:80、lsof -i:443やnetstat -tanなどでNginxの起動状況を確認します。
使用するポートが「Listen」となって入ればOKです。
FW(iptables)の設定
CentOS6の初期状態のiptablesにTCP80とTCP443通信を許可するルールを追加します。
itpables -I INPUT 5 -p tcp --dport 80 -j ACCEPT
itpables -I INPUT 6 -p tcp --dport 443 -j ACCEPT
なお、検証などの目的の為、
ルールを完全無効化するならば、iptables -Fでも問題ありません。
クライアント認証の準備(ブラウザ)
pksc12形式のクライアント証明書を、
scp等でクライアント側へエクスポートします。
エクスポートしたファイルをダブルクリックすることでインポートが開始されます。
※以下は、Windows8によるスクリーンキャプチャー。
PKCS12形式のクライアント証明書を生成した際に設定したパスワードを入力します。
IEやGoogle chromeなどではインターネットオプションから、
インポートされた証明書情報を確認出来ます。
※Mozilla Firefoxの場合は、手順が異なりますので、
次の工程をご覧ください。
クライアント証明書のインポート(Mozilla FireFox)の場合
クライアント(ブラウザ)からのアクセス
SSLクライアント認証を使用した場合は、
以下のようにアクセス時に証明書の選択が求められます。
それが正しい証明書であれば、アクセス出来ます。
2014年のNginxを振り返る
※あくまでも私個人の視線からとらえたものです。
今年のNginxでは、約1か月間隔での新バージョンリリースが行われました。
4月上旬までは、1.4系がstable・1.5系がmainline、
その後は、1.6系がstable・1.7系がmainlineとしてリリースされました。
また、6月にはNginxの商用版であるNginx Plusリリースや、
日本におけるユーザー会の設立などの動きがありました。
Nginx開発者であるイゴールがセッションに登場し、
その場でしか得られないようなコアな情報があったり、
私としてもユーザー会というものに初めて参加してみたのですが、
想像していた以上に参加しやすい空間で、とても楽しかったです。
直接開発者の方から話を聞けるのも、いいですね。
10月にはNginx Conference2014も開催され、
Apache、IISに続くWebサーバ・リバースプロキシとして、
今後も大きく成長していくことを予感させる一年だったかと思います。
-------
1/22 Nginx-1.5.9リリース
2/4 Nginx-1.5.10リリース
2/11 Nginx-1.4.5リリース
3/4 Nginx-1.4.6&1.5.11リリース
3/8 Nginx-1.4.7&1.5.12リリース
4/8 Nginx-1.5.13リリース
4/24 Nginx-1.6.0&1.7.0リリース
5/27 Nginx-1.7.1リリース
6/17 Nginx-1.7.2リリース
6/18 日本Nginxユーザー会 第0回開催
Nginx ユーザ会 #0 に行ってきました! - インフラエンジニアway - Powered by HEARTBEATS
7/8 Nginx-1.7.3リリース
8/5 Nginx-1.6.1&1.7.4リリース
9/16 Nginx-1.6.2&1.7.5リリース
9/30 Nginx-1.7.6リリース
10/20-22 NGINX Conference 2014 -開催
10/28 Nginx-1.7.7リリース
12/2 Nginx-1.7.8リリース
12/23 Nginx-1.7.9リリース