株式会社ハートビーツのITインフラエンジニアがお届けするnginx連載の6回目。今回はnginxのTLS/SSLについての設定を確認していきます。以降、"TLS/SSL"のことを単に"SSL"と書きます。TLS/SSLの設定nginx.orgのパッケージからインストールしたnginxが提供している設定ファイルexample_ssl.confをサンプルとして説明します。一部修正をしております。バーチャルサーバの設定」で説明したので、詳しくはそちらを参照してください。listenディレクティブlistenディレクティブにはSSLで待ち受けるポート番号を明示的に指定します。次のように通常は443を指定します。443;listenディレクティブにsslパラメータを付けると、そのポートでSSLを有効にして待ち受けるようになります。そのポートに関して後述するsslディレクティブをonにしたのと同じ動作になるため、sslディレクティブの記述は不要になります。Name)と同じサーバ名を指定します。sslsslディレクティブをonに設定すると、SSLが有効になります。listenディレクティブでsslパラメータを指定したときには不要です。ssl_certificateとssl_certificate_keyssl_certificateディレクティブにサーバ証明書のファイルのパスを、ssl_certificate_keyディレクティブにプライベート鍵のファイルのパスを指定します。/etc/nginx/cert.key;以上の設定をまとめると次のようになります。これらの設定を行えばSSLを利用できます。使用するTLS/SSLのバージョンや暗号スイートについてはデフォルトの設定でも利用できますが、明示的に設定してみましょう。ssl_protocolsssl_protocolsには使用するSSLのバージョンを記述します。1.0.1以降のときのみ動作します。ssl_ciphersssl_ciphersにはSSLで使用する暗号スイートを指定します。1.2.0では"HIGH:!ADH:!MD5"になります。OpenSSLを参照してください。「HIGH(公開鍵暗号の鍵長が128ビットより大きい)」、「aNULL(認証を提供しない暗号スイート)でない」、「MD5でない」ものを指定するにはと次のように記述します。-v"コマンドで利用できる暗号スイートの一覧を表示することができます。ssl_prefer_server_ciphersssl_prefer_server_ciphersをonに指定すると、利用する暗号を選ぶ際に、SSLv3やTLSではサーバが示した暗号スイートが優先されます。offにするとクライアントのものが優先されます。デフォルトはoffです。onにするには次のように記述します。on;これはnginxの機能というよりはOpenSSLの機能で、SSL_CTX_set_options()にSSL_OP_CIPHER_SERVER_PREFERENCEを設定します。SSLセッションキャッシュサーバの負荷を削減するために、SSLのセッションキャッシュを利用する設定を行います。ssl_session_cachessl_session_cacheにはSSLセッションキャッシュをどのように扱うかとそのキャッシュサイズを指定します。次のような文字列を指定することができます。OpenSSL組み込みを利用。一つのワーカープロセスのみが利用可能。すべてのワーカープロセスで共有。「shared:名前:サイズ」の形式で記述。デフォルトはnoneです。サーバの負荷を削減するためにはsharedを使うのが望ましいです。キャッシュサイズを10MBに設定するには次のように記述します。ssl_session_timeoutssl_session_timeoutディレクティブにはSSLセッションキャッシュに保管するSSLセッションの情報のタイムアウト時間を指定します。デフォルトは"5m"(5分)です。10分に設定するには次のように記述します。上述しましたが、listenディレクティブにsslパラメータを付けると、そのポートでSSLを有効にして待ち受けるようになります。この機能を使い、次のようにsslパラメータを付けない80番ポートを指定したlistenディレクティブとsslパラメータを付けた443番ポートを指定したlistenディレクティブを設定すると、同じバーチャルサーバの設定でHTTPとHTTPSの両方を有効にすることができます。...}このときにはsslディレクティブを記述しないでください。TLS/SSLの有効・無効はlistenディレクティブのsslパラメータの有無で判断するようになります。sslディレクティブでonを指定すると80番ポートでもTLS/SSLで待ち受けるようになってしまいます。IPベースのバーチャルサーバTLS/SSL対応のIPベースのバーチャルサーバを複数持つためには、次のようにバーチャルサーバ毎に待ち受ける異なるIPアドレスをlistenディレクティブに指定します。...}名前ベースのバーチャルサーバ従来のTLS/SSLのプロトコルでは、ハンドシェイクの際にクライアントはURIのホスト名の情報をサーバに渡すことができないため、サーバはどのバーチャルサーバに対するリクエストが判断できませんでした。そのため、名前ベースのバーチャルサーバは利用できませんでした。Indication(以降、単にSNIと呼ぶ)というTLSの拡張機能により、ハンドシェイクの際にホスト名の情報を送ることができるようになりました。このSNIを利用するためには、サーバとクライアントの両方がSNIをサポートしている必要があります。Wikipediaにサポート状況が掲載されています。XPの環境が残っている限り、実質的にSNIのサポートは難しいと思われます。nginx自体はSNIに対応していますが、SNIの機能を有効にしてビルドされている必要があります。enabled"という文字列が出力されるかでわかります。enabledSNIが有効であるときには、クライアントがリクエストしたホスト名に対応したバーチャルサーバの設定が適応され、そのサーバ証明書が使われます。...}なお、SNIが無効であるとき、あるいはクライアントがSNIに対応していないときには、デフォルトサーバのバーチャルサーバが適応され、そのサーバ証明書が使われます。以上でnginxのTLS/SSLの設定についての説明は終わりです。次回はよく使われる設定(認証、アクセス制御、rewriteモジュール等)について説明します。株式会社ハートビーツの技術情報やイベント情報などをお届けする公式ブログです。こちら「みんな仲良く」「プライドを持って」「変化を楽しむ」という企業理念に共感していただけるエンジニアを募集しています。