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 NameSSL接続の際の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. 参考