ngx_mail_ssl_module モジュール

設定例
ディレクティブ
     ssl
     ssl_certificate
     ssl_certificate_key
     ssl_ciphers
     ssl_client_certificate
     ssl_conf_command
     ssl_crl
     ssl_dhparam
     ssl_ecdh_curve
     ssl_password_file
     ssl_prefer_server_ciphers
     ssl_protocols
     ssl_session_cache
     ssl_session_ticket_key
     ssl_session_tickets
     ssl_session_timeout
     ssl_trusted_certificate
     ssl_verify_client
     ssl_verify_depth
     starttls

ngx_mail_ssl_module モジュールは、メールプロキシサーバーが SSL/TLS プロトコルで動作するために必要なサポートを提供します。

このモジュールはデフォルトではビルドされません。--with-mail_ssl_module 設定パラメータで有効にする必要があります。

このモジュールは OpenSSL ライブラリが必要です。

設定例

プロセッサの負荷を軽減するため、以下の設定が推奨されます。

worker_processes auto;

mail {

    ...

    server {
        listen              993 ssl;

        ssl_protocols       TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_ciphers         AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;
        ssl_certificate     /usr/local/nginx/conf/cert.pem;
        ssl_certificate_key /usr/local/nginx/conf/cert.key;
        ssl_session_cache   shared:SSL:10m;
        ssl_session_timeout 10m;

        ...
    }

ディレクティブ

構文 ssl on | off;
デフォルト
ssl off;
コンテキスト mailserver

このディレクティブはバージョン 1.15.0 で廃止となり、バージョン 1.25.1 で削除されました。代わりに、listen ディレクティブの ssl パラメータを使用する必要があります。

構文 ssl_certificate file;
デフォルト
コンテキスト mailserver

指定されたサーバーの証明書を PEM 形式で指定する file を指定します。プライマリ証明書に加えて中間証明書を指定する必要がある場合は、同じファイルに次の順序で指定する必要があります。最初にプライマリ証明書、次に中間証明書です。PEM 形式の秘密鍵を同じファイルに含めることができます。

バージョン 1.11.0 以降、このディレクティブを複数回指定して、RSA や ECDSA など、異なる種類の証明書をロードできます。

server {
    listen              993 ssl;

    ssl_certificate     example.com.rsa.crt;
    ssl_certificate_key example.com.rsa.key;

    ssl_certificate     example.com.ecdsa.crt;
    ssl_certificate_key example.com.ecdsa.key;

    ...
}

異なる証明書に対して別々の証明書チェーンをサポートするのは、OpenSSL 1.0.2 以降のみです。古いバージョンでは、1つの証明書チェーンのみを使用できます。

file の代わりに data:certificate という値を指定できます (1.15.10)。これにより、中間ファイルを使用せずに証明書がロードされます。この構文の不適切な使用は、秘密鍵データをエラーログに書き込むなど、セキュリティ上の問題を引き起こす可能性があることに注意してください。

構文 ssl_certificate_key file;
デフォルト
コンテキスト mailserver

指定されたサーバーの秘密鍵を PEM 形式で指定する file を指定します。

file の代わりに engine:name:id という値を指定できます (1.7.9)。これにより、指定された id の秘密鍵が OpenSSL エンジン name からロードされます。

file の代わりに data:key という値を指定できます (1.15.10)。これにより、中間ファイルを使用せずに秘密鍵がロードされます。この構文の不適切な使用は、秘密鍵データをエラーログに書き込むなど、セキュリティ上の問題を引き起こす可能性があることに注意してください。

構文 ssl_ciphers ciphers;
デフォルト
ssl_ciphers HIGH:!aNULL:!MD5;
コンテキスト mailserver

有効な暗号化スイートを指定します。暗号化スイートは OpenSSL ライブラリで理解される形式で指定します。例:

ssl_ciphers ALL:!aNULL:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;

完全なリストは “openssl ciphers” コマンドで確認できます。

以前のバージョンの nginx では、デフォルトで異なる暗号化スイートが使用されていました。

構文 ssl_client_certificate file;
デフォルト
コンテキスト mailserver

このディレクティブはバージョン 1.7.11 で登場しました。

クライアント証明書を検証するために使用される信頼された CA 証明書を PEM 形式で指定する file を指定します。

証明書のリストがクライアントに送信されます。これを望まない場合は、ssl_trusted_certificate ディレクティブを使用できます。

構文 ssl_conf_command name value;
デフォルト
コンテキスト mailserver

このディレクティブはバージョン 1.19.4 で登場しました。

任意の OpenSSL 設定コマンドを設定します。

このディレクティブは OpenSSL 1.0.2 以降を使用している場合にサポートされます。

複数の ssl_conf_command ディレクティブを同じレベルで指定できます。

ssl_conf_command Options PrioritizeChaCha;
ssl_conf_command Ciphersuites TLS_CHACHA20_POLY1305_SHA256;

これらのディレクティブは、現在のレベルで ssl_conf_command ディレクティブが定義されていない場合にのみ、前の設定レベルから継承されます。

OpenSSL を直接設定すると、予期しない動作が発生する可能性があることに注意してください。

構文 ssl_crl file;
デフォルト
コンテキスト mailserver

このディレクティブはバージョン 1.7.11 で登場しました。

クライアント証明書を検証するために使用される、失効した証明書 (CRL) を PEM 形式で指定する file を指定します。

構文 ssl_dhparam file;
デフォルト
コンテキスト mailserver

このディレクティブはバージョン 0.7.2 で登場しました。

DHE 暗号化スイートの DH パラメータを含む file を指定します。

デフォルトではパラメータは設定されていないため、DHE 暗号化スイートは使用されません。

バージョン 1.11.0 より前は、デフォルトで組み込みのパラメータが使用されていました。

構文 ssl_ecdh_curve curve;
デフォルト
ssl_ecdh_curve auto;
コンテキスト mailserver

このディレクティブはバージョン 1.1.0 および 1.0.6 で登場しました。

ECDHE 暗号化スイートの curve を指定します。

OpenSSL 1.0.2 以降を使用する場合、複数の curve を指定できます (1.11.0)。例:

ssl_ecdh_curve prime256v1:secp384r1;

特別な値 auto (1.11.0) を指定すると、OpenSSL 1.0.2 以降を使用している場合は OpenSSL ライブラリに組み込まれたリストを使用し、古いバージョンでは prime256v1 を使用するように nginx に指示します。

バージョン 1.11.0 より前は、デフォルトで prime256v1 curve が使用されていました。

OpenSSL 1.0.2 以降を使用する場合、このディレクティブはサーバーでサポートされる curve のリストを設定します。したがって、ECDSA 証明書が機能するためには、証明書で使用されている curve を含めることが重要です。

構文 ssl_password_file file;
デフォルト
コンテキスト mailserver

このディレクティブはバージョン 1.7.3 で登場しました。

秘密鍵のパスフレーズを含む file を指定します。各パスフレーズは別々の行に指定されます。鍵のロード時にパスフレーズが順番に試されます。

mail {
    ssl_password_file /etc/keys/global.pass;
    ...

    server {
        server_name mail1.example.com;
        ssl_certificate_key /etc/keys/first.key;
    }

    server {
        server_name mail2.example.com;

        # named pipe can also be used instead of a file
        ssl_password_file /etc/keys/fifo;
        ssl_certificate_key /etc/keys/second.key;
    }
}

構文 ssl_prefer_server_ciphers on | off;
デフォルト
ssl_prefer_server_ciphers off;
コンテキスト mailserver

SSLv3 および TLS プロトコルを使用する場合に、クライアント暗号化スイートよりもサーバー暗号化スイートを優先するかどうかを指定します。

構文 ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2] [TLSv1.3];
デフォルト
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
コンテキスト mailserver

指定されたプロトコルを有効にします。

TLSv1.1 および TLSv1.2 パラメータ (1.1.13, 1.0.12) は、OpenSSL 1.0.1 以降が使用されている場合にのみ機能します。

TLSv1.3 パラメータ (1.13.0) は、OpenSSL 1.1.1 以降が使用されている場合にのみ機能します。

TLSv1.3 パラメータは 1.23.4 以降、デフォルトで使用されています。

構文 ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
デフォルト
ssl_session_cache none;
コンテキスト mailserver

セッションパラメータを格納するキャッシュの種類とサイズを設定します。キャッシュは次のいずれかのタイプにすることができます。

off
セッションキャッシュの使用は厳密に禁止されています。nginx はクライアントにセッションを再利用できないことを明示的に伝えます。
none
セッションキャッシュの使用は穏やかに禁止されています。nginx はクライアントにセッションを再利用できることを伝えますが、実際にはセッションパラメータをキャッシュに格納しません。
builtin
OpenSSL に組み込まれたキャッシュです。1 つのワーカープロセスのみで使用されます。キャッシュサイズはセッション数で指定します。サイズが指定されていない場合は、20480 セッションになります。組み込みキャッシュを使用すると、メモリの断片化が発生する可能性があります。
shared
すべてのワーカープロセス間で共有されるキャッシュです。キャッシュサイズはバイト単位で指定します。1メガバイトは約4000セッションを格納できます。各共有キャッシュには任意の名前を付ける必要があります。同じ名前のキャッシュを複数のサーバーで使用できます。また、ssl_session_ticket_key ディレクティブを使用して明示的に設定されていない限り、TLS セッションチケットキーを自動的に生成、保存、定期的にローテーションするためにも使用されます (1.23.2)。

両方のキャッシュタイプを同時に使用できます。例:

ssl_session_cache builtin:1000 shared:SSL:10m;

ただし、組み込みキャッシュを使用せずに共有キャッシュのみを使用する方が効率的です。

構文 ssl_session_ticket_key file;
デフォルト
コンテキスト mailserver

このディレクティブはバージョン 1.5.7 で登場しました。

TLS セッションチケットの暗号化および復号化に使用される秘密鍵を持つ file を設定します。同じキーを複数のサーバー間で共有する必要がある場合、このディレクティブが必要です。デフォルトでは、ランダムに生成されたキーが使用されます。

複数のキーが指定されている場合は、最初のキーのみが TLS セッションチケットの暗号化に使用されます。これにより、キーローテーションを構成できます。例:

ssl_session_ticket_key current.key;
ssl_session_ticket_key previous.key;

file には、80 バイトまたは 48 バイトのランダムデータが含まれている必要があり、次のコマンドを使用して作成できます。

openssl rand 80 > ticket.key

ファイルサイズに応じて、暗号化には AES256 (80 バイトキーの場合、1.11.8) または AES128 (48 バイトキーの場合) が使用されます。

構文 ssl_session_tickets on | off;
デフォルト
ssl_session_tickets on;
コンテキスト mailserver

このディレクティブはバージョン 1.5.9 で登場しました。

TLS セッションチケットによるセッション再開を有効または無効にします。

構文 ssl_session_timeout time;
デフォルト
ssl_session_timeout 5m;
コンテキスト mailserver

クライアントがセッションパラメータを再利用できる時間を指定します。

構文 ssl_trusted_certificate file;
デフォルト
コンテキスト mailserver

このディレクティブはバージョン 1.7.11 で登場しました。

クライアント証明書を検証するために使用される信頼された CA 証明書を PEM 形式で指定する file を指定します。

ssl_client_certificate で設定された証明書とは対照的に、これらの証明書のリストはクライアントに送信されません。

構文 ssl_verify_client on | off | optional | optional_no_ca;
デフォルト
ssl_verify_client off;
コンテキスト mailserver

このディレクティブはバージョン 1.7.11 で登場しました。

クライアント証明書の検証を有効にします。検証結果は、認証リクエストの “Auth-SSL-Verify” ヘッダーに渡されます。

optional パラメータはクライアント証明書を要求し、証明書が存在する場合は検証します。

optional_no_ca パラメータはクライアント証明書を要求しますが、信頼された CA 証明書で署名されている必要はありません。これは、nginx の外部にあるサービスが実際の証明書検証を実行する場合に使用することを目的としています。証明書の内容は、認証サーバーに送信されるリクエストを通じてアクセスできます。

構文 ssl_verify_depth number;
デフォルト
ssl_verify_depth 1;
コンテキスト mailserver

このディレクティブはバージョン 1.7.11 で登場しました。

クライアント証明書チェーンの検証の深さを設定します。

構文 starttls on | off | only;
デフォルト
starttls off;
コンテキスト mailserver

on
POP3 の STLS コマンドと、IMAP および SMTP の STARTTLS コマンドの使用を許可します。
off
STLS および STARTTLS コマンドの使用を拒否する。
唯一
事前の TLS トランジションを要求する。