ngx_mail_ssl_module モジュール
ngx_mail_ssl_module モジュールは、メールプロキシサーバーが SSL/TLS プロトコルで動作するために必要なサポートを提供します。
このモジュールはデフォルトではビルドされません。--with-mail_ssl_module 設定パラメータで有効にする必要があります。
このモジュールは OpenSSL ライブラリが必要です。
設定例
プロセッサの負荷を軽減するため、以下の設定が推奨されます。
- ワーカープロセス数をプロセッサ数と同じに設定し、
- 共有セッションキャッシュを有効にし、
- 組み込みセッションキャッシュを無効にし、
- 場合によってはセッションの有効期間を長くします(デフォルトでは5分)。
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 |
|---|---|
| デフォルト |
ssl off; |
| コンテキスト |
mail、server |
このディレクティブはバージョン 1.15.0 で廃止となり、バージョン 1.25.1 で削除されました。代わりに、listen ディレクティブの ssl パラメータを使用する必要があります。
| 構文 |
ssl_certificate |
|---|---|
| デフォルト | — |
| コンテキスト |
mail、server |
指定されたサーバーの証明書を 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 |
|---|---|
| デフォルト | — |
| コンテキスト |
mail、server |
指定されたサーバーの秘密鍵を PEM 形式で指定する file を指定します。
file の代わりに engine:name:id という値を指定できます (1.7.9)。これにより、指定された id の秘密鍵が OpenSSL エンジン name からロードされます。
file の代わりに data:key という値を指定できます (1.15.10)。これにより、中間ファイルを使用せずに秘密鍵がロードされます。この構文の不適切な使用は、秘密鍵データをエラーログに書き込むなど、セキュリティ上の問題を引き起こす可能性があることに注意してください。
| 構文 |
ssl_ciphers |
|---|---|
| デフォルト |
ssl_ciphers HIGH:!aNULL:!MD5; |
| コンテキスト |
mail、server |
有効な暗号化スイートを指定します。暗号化スイートは OpenSSL ライブラリで理解される形式で指定します。例:
ssl_ciphers ALL:!aNULL:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
完全なリストは “openssl ciphers” コマンドで確認できます。
以前のバージョンの nginx では、デフォルトで異なる暗号化スイートが使用されていました。
| 構文 |
ssl_client_certificate |
|---|---|
| デフォルト | — |
| コンテキスト |
mail、server |
このディレクティブはバージョン 1.7.11 で登場しました。
クライアント証明書を検証するために使用される信頼された CA 証明書を PEM 形式で指定する file を指定します。
証明書のリストがクライアントに送信されます。これを望まない場合は、ssl_trusted_certificate ディレクティブを使用できます。
| 構文 |
ssl_conf_command |
|---|---|
| デフォルト | — |
| コンテキスト |
mail、server |
このディレクティブはバージョン 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 |
|---|---|
| デフォルト | — |
| コンテキスト |
mail、server |
このディレクティブはバージョン 1.7.11 で登場しました。
クライアント証明書を検証するために使用される、失効した証明書 (CRL) を PEM 形式で指定する file を指定します。
| 構文 |
ssl_dhparam |
|---|---|
| デフォルト | — |
| コンテキスト |
mail、server |
このディレクティブはバージョン 0.7.2 で登場しました。
DHE 暗号化スイートの DH パラメータを含む file を指定します。
デフォルトではパラメータは設定されていないため、DHE 暗号化スイートは使用されません。
バージョン 1.11.0 より前は、デフォルトで組み込みのパラメータが使用されていました。
| 構文 |
ssl_ecdh_curve |
|---|---|
| デフォルト |
ssl_ecdh_curve auto; |
| コンテキスト |
mail、server |
このディレクティブはバージョン 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 |
|---|---|
| デフォルト | — |
| コンテキスト |
mail、server |
このディレクティブはバージョン 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 |
|---|---|
| デフォルト |
ssl_prefer_server_ciphers off; |
| コンテキスト |
mail、server |
SSLv3 および TLS プロトコルを使用する場合に、クライアント暗号化スイートよりもサーバー暗号化スイートを優先するかどうかを指定します。
| 構文 |
ssl_protocols [ |
|---|---|
| デフォルト |
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; |
| コンテキスト |
mail、server |
指定されたプロトコルを有効にします。
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 |
|---|---|
| デフォルト |
ssl_session_cache none; |
| コンテキスト |
mail、server |
セッションパラメータを格納するキャッシュの種類とサイズを設定します。キャッシュは次のいずれかのタイプにすることができます。
off- セッションキャッシュの使用は厳密に禁止されています。nginx はクライアントにセッションを再利用できないことを明示的に伝えます。
none- セッションキャッシュの使用は穏やかに禁止されています。nginx はクライアントにセッションを再利用できることを伝えますが、実際にはセッションパラメータをキャッシュに格納しません。
builtin- OpenSSL に組み込まれたキャッシュです。1 つのワーカープロセスのみで使用されます。キャッシュサイズはセッション数で指定します。サイズが指定されていない場合は、20480 セッションになります。組み込みキャッシュを使用すると、メモリの断片化が発生する可能性があります。
- すべてのワーカープロセス間で共有されるキャッシュです。キャッシュサイズはバイト単位で指定します。1メガバイトは約4000セッションを格納できます。各共有キャッシュには任意の名前を付ける必要があります。同じ名前のキャッシュを複数のサーバーで使用できます。また、ssl_session_ticket_key ディレクティブを使用して明示的に設定されていない限り、TLS セッションチケットキーを自動的に生成、保存、定期的にローテーションするためにも使用されます (1.23.2)。
両方のキャッシュタイプを同時に使用できます。例:
ssl_session_cache builtin:1000 shared:SSL:10m;
ただし、組み込みキャッシュを使用せずに共有キャッシュのみを使用する方が効率的です。
| 構文 |
ssl_session_ticket_key |
|---|---|
| デフォルト | — |
| コンテキスト |
mail、server |
このディレクティブはバージョン 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 |
|---|---|
| デフォルト |
ssl_session_tickets on; |
| コンテキスト |
mail、server |
このディレクティブはバージョン 1.5.9 で登場しました。
TLS セッションチケットによるセッション再開を有効または無効にします。
| 構文 |
ssl_session_timeout |
|---|---|
| デフォルト |
ssl_session_timeout 5m; |
| コンテキスト |
mail、server |
クライアントがセッションパラメータを再利用できる時間を指定します。
| 構文 |
ssl_trusted_certificate |
|---|---|
| デフォルト | — |
| コンテキスト |
mail、server |
このディレクティブはバージョン 1.7.11 で登場しました。
クライアント証明書を検証するために使用される信頼された CA 証明書を PEM 形式で指定する file を指定します。
ssl_client_certificate で設定された証明書とは対照的に、これらの証明書のリストはクライアントに送信されません。
| 構文 |
ssl_verify_client |
|---|---|
| デフォルト |
ssl_verify_client off; |
| コンテキスト |
mail、server |
このディレクティブはバージョン 1.7.11 で登場しました。
クライアント証明書の検証を有効にします。検証結果は、認証リクエストの “Auth-SSL-Verify” ヘッダーに渡されます。
optional パラメータはクライアント証明書を要求し、証明書が存在する場合は検証します。
optional_no_ca パラメータはクライアント証明書を要求しますが、信頼された CA 証明書で署名されている必要はありません。これは、nginx の外部にあるサービスが実際の証明書検証を実行する場合に使用することを目的としています。証明書の内容は、認証サーバーに送信されるリクエストを通じてアクセスできます。
| 構文 |
ssl_verify_depth |
|---|---|
| デフォルト |
ssl_verify_depth 1; |
| コンテキスト |
mail、server |
このディレクティブはバージョン 1.7.11 で登場しました。
クライアント証明書チェーンの検証の深さを設定します。
| 構文 |
starttls |
|---|---|
| デフォルト |
starttls off; |
| コンテキスト |
mail、server |
on- POP3 の
STLSコマンドと、IMAP および SMTP のSTARTTLSコマンドの使用を許可します。 offSTLSおよびSTARTTLSコマンドの使用を拒否する。唯一- 事前の TLS トランジションを要求する。