Nginx で SSL/TLS および SPDY に対応する手順

本手順は FreeBSD 9.x プラットフォームでの Nginx サーバーを対象にした SSL 及び SPDY対応のセットアップ手順です。
Nginx は Version 1.4 から SPDY が正式にサポートされましたが、 SPDY では OpenSSL 1.0.1 より実装されている “Next Protocol Negotiation” を利用するため、 最新のOpenSSLのインストール作業が必要になります。

1. 依存パッケージ

  • Nginx 1.4以上
  • OpenSSL 1.0.1以上

FreeBSD ではベースシステムに OpenSSL が含まれていますが、古いバージョン0.9.8のままです。 SPDY では OpenSSL 1.0.1 より実装されている Next Protocol Negotiation を利用するため Portsから最新バージョンをインストールする必要があります。

ベースシステムのOpenSSL のバージョンは以下のコマンドで確認できます。

openssl version
OpenSSL 0.9.8x 10 May 2012

2. 最新のOpenSSLのインストール

echo "WITH_OPENSSL_PORT=yes" >> /etc/make.conf
cd /usr/ports/security/openssl
make install

/usr/local/bin/openssl にインストールされます。

最新のバージョンのOpenSSLがインストールされたことを確認します。

/usr/local/bin/openssl version
OpenSSL 1.0.1e 11 Feb 2013

3. Nginx のインストール

既にNginxがインストール済みの場合は再インストールします。make.confに WITH_OPENSSL_PORT を設定したことで自動的に portsのOpenSSLを参照するようにビルドされます。

cd /usr/ports/www/nginx
make config
  • SSLモジュールを有効にします
  • SPDYモジュールを有効にします
[X] SSL    Enable http_ssl module
[X] SPDY   Enable SPDY protocol support (SSL req.)

nginx をインストールします。

make install

4. サーバー証明書の作成

トリプルDESを使い、2048bit の秘密鍵を生成します。

/usr/local/bin/openssl genrsa -des3 -out server.key 2048

秘密鍵を保護するためのパスフレーズの入力を求められるので入力します。

作成した秘密鍵ファイルからCSR(証明書署名要求ファイル)を生成します。

/usr/local/bin/openssl req -new -key server.key -out server.csr

秘密鍵のパスフレーズの入力が求められるので入力します。
以下の項目の入力が求められますので入力します。

Country Name (2 letter code) 国名
State or Province Name (full name) 都道府県名
Locality Name (eg, city)
Organizational Name 組織名
Organizational Unit Name 部門名
Common Name SSL接続の際のURL
Email Address 電子メールアドレス。ブランクでよい。
A challenge password ブランクでよい。
An optional company name ブランクでよい。

証明書署名要求ファイルからサーバ証明書を作成します。

/usr/local/bin/openssl x509 -req -in server.csr -signkey server.key -out server.crt

秘密鍵ファイルのパーミッションを設定します。

chmod 600 server.key

nginx の設定ディレクトリに移動します。

mv server.* /usr/local/etc/nginx/

5. nginx の設定

nginx の設定を編集し、SPDY を有効にして、サーバー証明書ファイルを指定します。

vi /usr/local/etc/nginx/nginx.conf
  • SSLセッションタイムアウトは5分
  • TLSv1 TLSv1.1 TLSv1.2を有効にします。

※ Firefox21 は TLSv1 まで、Chrome 27 は TLSv1.1 まで、Internet Explorer 10 以降は TLSv1.2 まで対応しています。「TLSのブラウザサポート」表を参照。

server {
  listen               443 default ssl spdy;
  server_name          _;
  ssl_certificate      server.crt;
  ssl_certificate_key  server.key;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_session_timeout  5m;

 ~ 省略 ~
}

6. 運用手順

nginxの起動、停止でパスフレーズの入力を求められるので入力します。 再起動には3回ほどserver.keyのパスフレーズの入力められます。nginxの起動や終了のたびに数回パスフレーズの入力する必要がありますが、 server.keyの暗号化を解除することで回避できます。ただし、本番環境ではセキュリティ上、解除しない方が良いでしょう。

mv server.key server.key.org
/usr/locl/bin/openssl rsa -in server.key.org -out server.key

これで nginx の起動、停止でパスフレーズの入力が求められなくなります。

起動

/usr/local/etc/rc.d/nginx start

停止

/usr/local/etc/rc.d/nginx stop

7. 参考