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;
內容 mail, server

這個指令在 1.15.0 版本中已過時,並在 1.25.1 版本中移除。應改用 listen 指令的 ssl 參數。

語法 ssl_certificate file;
預設
內容 mail, server

指定一個 file,其中包含給定伺服器的 PEM 格式憑證。如果除了主要憑證外還應指定中繼憑證,則應在同一個檔案中依下列順序指定:先是主要憑證,然後是中繼憑證。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 或更高版本支援不同憑證的個別憑證鏈。在較舊的版本中,只能使用一個憑證鏈。

可以指定值 data:certificate 而不是 file (1.15.10),這會載入憑證而無需使用中繼檔案。請注意,不當使用此語法可能會產生安全性隱憂,例如將私密金鑰資料寫入錯誤日誌

語法 ssl_certificate_key file;
預設
內容 mail, server

指定一個 file,其中包含給定伺服器的 PEM 格式私密金鑰。

可以指定值 engine:name:id 而不是 file (1.7.9),這會從 OpenSSL 引擎 name 載入具有指定 id 的私密金鑰。

可以指定值 data:key 而不是 file (1.15.10),這會載入私密金鑰而無需使用中繼檔案。請注意,不當使用此語法可能會產生安全性隱憂,例如將私密金鑰資料寫入錯誤日誌

語法 ssl_ciphers 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 file;
預設
內容 mail, server

此指令出現在 1.7.11 版本中。

指定一個 file,其中包含 PEM 格式的受信任 CA 憑證,用於驗證用戶端憑證。

憑證清單將會傳送給用戶端。如果不希望這樣,可以使用 ssl_trusted_certificate 指令。

語法 ssl_conf_command name value;
預設
內容 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 file;
預設
內容 mail, server

此指令出現在 1.7.11 版本中。

指定一個 file,其中包含 PEM 格式的已撤銷憑證 (CRL),用於驗證用戶端憑證。

語法 ssl_dhparam file;
預設
內容 mail, server

此指令出現在 0.7.2 版本中。

指定一個 file,其中包含 DHE 加密演算法的 DH 參數。

預設情況下,不設定任何參數,因此不會使用 DHE 加密演算法。

在 1.11.0 版本之前,預設使用內建參數。

語法 ssl_ecdh_curve curve;
預設
ssl_ecdh_curve auto;
內容 mail, server

此指令出現在 1.1.0 和 1.0.6 版本中。

指定 ECDHE 加密演算法的 curve

當使用 OpenSSL 1.0.2 或更高版本時,可以指定多個曲線 (1.11.0),例如

ssl_ecdh_curve prime256v1:secp384r1;

當使用 OpenSSL 1.0.2 或更高版本時,特殊值 auto (1.11.0) 會指示 nginx 使用內建於 OpenSSL 程式庫的清單,或是在較舊的版本中使用 prime256v1

在 1.11.0 版本之前,預設使用 prime256v1 曲線。

當使用 OpenSSL 1.0.2 或更高版本時,此指令會設定伺服器支援的曲線清單。因此,為了讓 ECDSA 憑證能夠運作,務必包含憑證中使用的曲線。

語法 ssl_password_file 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 on | off;
預設
ssl_prefer_server_ciphers off;
內容 mail, server

指定在使用 SSLv3 和 TLS 協定時,應優先使用伺服器加密演算法,而非用戶端加密演算法。

語法 ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2] [TLSv1.3];
預設
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
內容 mail, server

啟用指定的協定。

只有在使用 OpenSSL 1.0.1 或更高版本時,TLSv1.1TLSv1.2 參數 (1.1.13, 1.0.12) 才能運作。

只有在使用 OpenSSL 1.1.1 或更高版本時,TLSv1.3 參數 (1.13.0) 才能運作。

自 1.23.4 開始,預設使用 TLSv1.3 參數。

語法 ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
預設
ssl_session_cache none;
內容 mail, server

設定儲存會話參數的快取類型和大小。快取可以是以下任何類型:

off
嚴格禁止使用會話快取:nginx 明確告知用戶端無法重複使用會話。
none
允許使用會話快取,但不明確表示禁止:nginx 告知用戶端可以重複使用會話,但實際上並未將會話參數儲存在快取中。
builtin
內建於 OpenSSL 的快取;僅由一個工作處理程序使用。快取大小以會話數指定。如果未給定大小,則等於 20480 個會話。使用內建快取可能會導致記憶體片段化。
shared
所有工作處理程序之間共用的快取。快取大小以位元組指定;1 MB 可以儲存大約 4000 個會話。每個共用快取都應該有一個任意名稱。具有相同名稱的快取可以在多個伺服器中使用。它也用於自動產生、儲存和定期輪換 TLS 會話票證金鑰 (1.23.2),除非使用 ssl_session_ticket_key 指令明確設定。

可以同時使用兩種快取類型,例如

ssl_session_cache builtin:1000 shared:SSL:10m;

但僅使用共用快取而不使用內建快取應該會更有效率。

語法 ssl_session_ticket_key file;
預設
內容 mail, server

此指令出現在 1.5.7 版本中。

設定一個 file,其中包含用於加密和解密 TLS 會話票證的私密金鑰。如果多個伺服器之間必須共用相同的金鑰,則此指令是必要的。預設情況下,會使用隨機產生的金鑰。

如果指定多個金鑰,則僅使用第一個金鑰來加密 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;
內容 mail, server

此指令出現在 1.5.9 版本中。

啟用或停用透過 TLS 會話票證的會話恢復。

語法 ssl_session_timeout time;
預設
ssl_session_timeout 5m;
內容 mail, server

指定用戶端可以重複使用會話參數的時間長度。

語法 ssl_trusted_certificate file;
預設
內容 mail, server

此指令出現在 1.7.11 版本中。

指定一個 file,其中包含 PEM 格式的受信任 CA 憑證,用於驗證用戶端憑證。

ssl_client_certificate 設定的憑證不同,這些憑證的清單不會傳送給用戶端。

語法 ssl_verify_client on | off | optional | optional_no_ca;
預設
ssl_verify_client off;
內容 mail, server

此指令出現在 1.7.11 版本中。

啟用用戶端憑證驗證。驗證結果會在驗證請求的「Auth-SSL-Verify」標頭中傳遞。

optional 參數會請求用戶端憑證,如果存在憑證則驗證該憑證。

optional_no_ca 參數會請求用戶端憑證,但不要求憑證由受信任的 CA 憑證簽署。這適用於 nginx 外部的服務執行實際憑證驗證的情況。憑證的內容可以透過傳送至驗證伺服器的請求存取

語法 ssl_verify_depth number;
預設
ssl_verify_depth 1;
內容 mail, server

此指令出現在 1.7.11 版本中。

設定用戶端憑證鏈的驗證深度。

語法 starttls on | off | only;
預設
starttls off;
內容 mail, server

on
允許使用 POP3 的 STLS 命令以及 IMAP 和 SMTP 的 STARTTLS 命令;
off
關閉
拒絕使用 STLSSTARTTLS 命令;
only