ngx_http_ssl_module 模組

範例配置
指令
     ssl
     ssl_buffer_size
     ssl_certificate
     ssl_certificate_key
     ssl_ciphers
     ssl_client_certificate
     ssl_conf_command
     ssl_crl
     ssl_dhparam
     ssl_early_data
     ssl_ecdh_curve
     ssl_key_log
     ssl_ocsp
     ssl_ocsp_cache
     ssl_ocsp_responder
     ssl_password_file
     ssl_prefer_server_ciphers
     ssl_protocols
     ssl_reject_handshake
     ssl_session_cache
     ssl_session_ticket_key
     ssl_session_tickets
     ssl_session_timeout
     ssl_stapling
     ssl_stapling_file
     ssl_stapling_responder
     ssl_stapling_verify
     ssl_trusted_certificate
     ssl_verify_client
     ssl_verify_depth
錯誤處理
嵌入變數

ngx_http_ssl_module 模組提供了 HTTPS 所需的支援。

此模組預設不會建置,應使用 --with-http_ssl_module 配置參數啟用。

此模組需要 OpenSSL 程式庫。

範例配置

為減少處理器負載,建議:

worker_processes auto;

http {

    ...

    server {
        listen              443 ssl;
        keepalive_timeout   70;

        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;
上下文 httpserver

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

語法 ssl_buffer_size size;
預設
ssl_buffer_size 16k;
上下文 httpserver

此指令出現在 1.5.9 版本。

設定用於傳送資料的緩衝區大小。

預設情況下,緩衝區大小為 16k,這對傳送大型回應時的額外負擔最小。為了盡量減少首次位元組的時間,使用較小的值可能會有所幫助,例如:

ssl_buffer_size 4k;

語法 ssl_certificate file;
預設
上下文 httpserver

指定一個 file,其中包含給定虛擬伺服器的 PEM 格式憑證。如果除了主要憑證之外還應指定中繼憑證,則應按照以下順序在同一個檔案中指定它們:主要憑證首先出現,然後是中繼憑證。PEM 格式的密鑰可以放在同一個檔案中。

自 1.11.0 版本起,此指令可以多次指定,以載入不同類型的憑證,例如 RSA 和 ECDSA。

server {
    listen              443 ssl;
    server_name         example.com;

    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.15.9 版本起,在使用 OpenSSL 1.0.2 或更高版本時,可以在 file 名稱中使用變數。

ssl_certificate     $ssl_server_name.crt;
ssl_certificate_key $ssl_server_name.key;

請注意,使用變數表示將為每個 SSL 交握載入憑證,這可能會對效能產生負面影響。

可以使用 data:$variable 值來取代 file (1.15.10),該值會從變數載入憑證,而無需使用中繼檔案。請注意,不當使用此語法可能會產生安全性影響,例如將密鑰資料寫入錯誤日誌

應記住,由於 HTTPS 協定的限制,為了獲得最大互通性,虛擬伺服器應監聽不同的 IP 位址

語法 ssl_certificate_key file;
預設
上下文 httpserver

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

可以使用 engine:name:id 值來取代 file (1.7.9),該值會從 OpenSSL 引擎 name 載入具有指定 id 的密鑰。

可以使用 data:$variable 值來取代 file (1.15.10),該值會從變數載入密鑰,而無需使用中繼檔案。請注意,不當使用此語法可能會產生安全性影響,例如將密鑰資料寫入錯誤日誌

自 1.15.9 版本起,在使用 OpenSSL 1.0.2 或更高版本時,可以在 file 名稱中使用變數。

語法 ssl_ciphers ciphers;
預設
ssl_ciphers HIGH:!aNULL:!MD5;
上下文 httpserver

指定啟用的密碼。密碼以 OpenSSL 程式庫理解的格式指定,例如:

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

可以使用 “openssl ciphers” 命令檢視完整清單。

nginx 的先前版本預設使用不同的密碼。

語法 ssl_client_certificate file;
預設
上下文 httpserver

指定一個 file,其中包含 PEM 格式的受信任 CA 憑證,用於驗證用戶端憑證和 OCSP 回應(如果啟用 ssl_stapling)。

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

語法 ssl_conf_command name value;
預設
上下文 httpserver

此指令出現在 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;
預設
上下文 httpserver

此指令出現在 0.8.7 版本。

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

語法 ssl_dhparam file;
預設
上下文 httpserver

此指令出現在 0.7.2 版本。

指定一個 file,其中包含 DHE 密碼的 DH 參數。

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

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

語法 ssl_early_data on | off;
預設
ssl_early_data off;
上下文 httpserver

此指令出現在 1.15.3 版本。

啟用或停用 TLS 1.3 早期資料

在早期資料中傳送的要求容易受到重播攻擊。為了在應用程式層防止此類攻擊,應使用 $ssl_early_data 變數。

proxy_set_header Early-Data $ssl_early_data;

當使用 OpenSSL 1.1.1 或更高版本 (1.15.4) 和 BoringSSL 時,支援此指令。

語法 ssl_ecdh_curve curve;
預設
ssl_ecdh_curve auto;
上下文 httpserver

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

指定 ECDHE 密碼的 curve

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

ssl_ecdh_curve prime256v1:secp384r1;

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

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

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

語法 ssl_key_log path;
預設
上下文 httpserver

此指令出現在 1.27.2 版本。

啟用用戶端連線 SSL 金鑰的記錄,並指定金鑰記錄檔的路徑。金鑰以與 Wireshark 相容的 SSLKEYLOGFILE 格式記錄。

此指令是我們商業訂閱的一部分。

語法 ssl_ocsp on | off | leaf;
預設
ssl_ocsp off;
上下文 httpserver

此指令出現在 1.19.0 版本。

啟用用戶端憑證鏈的 OCSP 驗證。leaf 參數僅啟用用戶端憑證的驗證。

為了使 OCSP 驗證運作,ssl_verify_client 指令應設定為 onoptional

為了解析 OCSP 回應器主機名稱,還應指定 resolver 指令。

範例

ssl_verify_client on;
ssl_ocsp          on;
resolver          192.0.2.1;

語法 ssl_ocsp_cache off | [shared:name:size];
預設
ssl_ocsp_cache off;
上下文 httpserver

此指令出現在 1.19.0 版本。

設定儲存用於 OCSP 驗證的用戶端憑證狀態的快取的 namesize。快取在所有工作程序之間共用。具有相同名稱的快取可以在多個虛擬伺服器中使用。

off 參數禁止使用快取。

語法 ssl_ocsp_responder url;
預設
上下文 httpserver

此指令出現在 1.19.0 版本。

覆寫 “Authority Information Access” 憑證擴展中指定的 OCSP 回應器 URL,用於驗證用戶端憑證。

僅支援 “http://” OCSP 回應器。

ssl_ocsp_responder http://ocsp.example.com/;

語法 ssl_password_file file;
預設
上下文 httpserver

此指令出現在 1.7.3 版本。

指定一個 file,其中包含 密鑰的密碼,其中每個密碼在單獨的一行中指定。載入金鑰時,會依次嘗試密碼。

範例

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

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

    server {
        server_name www2.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;
上下文 httpserver

指定在使用 SSLv3 和 TLS 協定時,應優先使用伺服器密碼而不是用戶端密碼。

語法 ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2] [TLSv1.3];
預設
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
上下文 httpserver

啟用指定的協定。

如果在 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_reject_handshake on | off;
預設
ssl_reject_handshake off;
上下文 httpserver

此指令出現在 1.19.4 版本。

如果啟用,則會拒絕 server 區塊中的 SSL 交握。

例如,在以下配置中,會拒絕與 example.com 以外的伺服器名稱進行 SSL 交握:

server {
    listen               443 ssl default_server;
    ssl_reject_handshake on;
}

server {
    listen              443 ssl;
    server_name         example.com;
    ssl_certificate     example.com.crt;
    ssl_certificate_key example.com.key;
}

語法 ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
預設
ssl_session_cache none;
上下文 httpserver

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

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

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

ssl_session_cache builtin:1000 shared:SSL:10m;

但是只使用共享快取而不使用內建快取應該更有效率。

語法 ssl_session_ticket_key file;
預設
上下文 httpserver

此指令出現在 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;
上下文 httpserver

此指令出現在 1.5.9 版本。

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

語法 ssl_session_timeout time;
預設
ssl_session_timeout 5m;
上下文 httpserver

指定客戶端可以重用會話參數的時間。

語法 ssl_stapling on | off;
預設
ssl_stapling off;
上下文 httpserver

此指令出現在 1.3.7 版本中。

啟用或停用伺服器對 OCSP 回應的釘選。範例

ssl_stapling on;
resolver 192.0.2.1;

為了使 OCSP 釘選正常工作,應該知道伺服器憑證頒發者的憑證。如果 ssl_certificate 檔案不包含中繼憑證,則伺服器憑證頒發者的憑證應該存在於 ssl_trusted_certificate 檔案中。

為了解析 OCSP 回應程式的主機名稱,還應該指定 resolver 指令。

語法 ssl_stapling_file file;
預設
上下文 httpserver

此指令出現在 1.3.7 版本中。

設定後,釘選的 OCSP 回應將從指定的 file 中取得,而不是查詢伺服器憑證中指定的 OCSP 回應程式。

該檔案應該是 “openssl ocsp” 命令產生的 DER 格式。

語法 ssl_stapling_responder url;
預設
上下文 httpserver

此指令出現在 1.3.7 版本中。

覆寫 “Authority Information Access” 憑證擴充中指定的 OCSP 回應程式的 URL。

僅支援 “http://” OCSP 回應器。

ssl_stapling_responder http://ocsp.example.com/;

語法 ssl_stapling_verify on | off;
預設
ssl_stapling_verify off;
上下文 httpserver

此指令出現在 1.3.7 版本中。

啟用或停用伺服器對 OCSP 回應的驗證。

為了使驗證正常工作,伺服器憑證頒發者的憑證、根憑證和所有中繼憑證都應該使用 ssl_trusted_certificate 指令設定為信任憑證。

語法 ssl_trusted_certificate file;
預設
上下文 httpserver

此指令出現在 1.3.7 版本中。

指定一個 file,其中包含 PEM 格式的受信任 CA 憑證,用於驗證用戶端憑證和 OCSP 回應(如果啟用 ssl_stapling)。

ssl_client_certificate 設定的憑證不同,這些憑證的列表不會傳送給客戶端。

語法 ssl_verify_client on | off | optional | optional_no_ca;
預設
ssl_verify_client off;
上下文 httpserver

啟用客戶端憑證的驗證。驗證結果儲存在 $ssl_client_verify 變數中。

optional 參數 (0.8.7+) 會請求客戶端憑證,並且如果存在憑證,則會驗證該憑證。

optional_no_ca 參數 (1.3.8, 1.2.5) 會請求客戶端憑證,但不要求該憑證由受信任的 CA 憑證簽署。這適用於 nginx 外部的服務執行實際憑證驗證的情況。憑證的內容可透過 $ssl_client_cert 變數存取。

語法 ssl_verify_depth number;
預設
ssl_verify_depth 1;
上下文 httpserver

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

錯誤處理

ngx_http_ssl_module 模組支援幾個非標準的錯誤代碼,這些錯誤代碼可以使用 error_page 指令進行重新導向

495
在客戶端憑證驗證期間發生錯誤;
496
客戶端未提供所需的憑證;
497
已將一般請求傳送到 HTTPS 連接埠。

重新導向發生在完全解析請求後,並且變數(例如 $request_uri$uri$args 等)可用。

嵌入變數

ngx_http_ssl_module 模組支援嵌入式變數

$ssl_alpn_protocol
傳回在 SSL 交握期間由 ALPN 選取的協定,否則傳回空字串 (1.21.4);
$ssl_cipher
傳回用於已建立的 SSL 連線的密碼名稱;
$ssl_ciphers
傳回客戶端支援的密碼列表 (1.11.7)。已知的密碼以名稱列出,未知的密碼以十六進制顯示,例如
AES128-SHA:AES256-SHA:0x00ff
只有在使用 OpenSSL 1.0.2 或更高版本時才完全支援此變數。對於較舊版本,此變數僅適用於新會話,並且僅列出已知的密碼。
$ssl_client_escaped_cert
傳回已建立的 SSL 連線的客戶端憑證,格式為 PEM (urlencoded) (1.13.5);
$ssl_client_cert
傳回已建立的 SSL 連線的客戶端憑證,格式為 PEM,除了第一行之外,每一行的開頭都加上製表符;這適用於在 proxy_set_header 指令中使用;
此變數已棄用,應該改用 $ssl_client_escaped_cert 變數。
$ssl_client_fingerprint
傳回已建立的 SSL 連線的客戶端憑證的 SHA1 指紋 (1.7.1);
$ssl_client_i_dn
根據 RFC 2253 傳回已建立的 SSL 連線的客戶端憑證的「頒發者 DN」字串 (1.11.6);
$ssl_client_i_dn_legacy
傳回已建立的 SSL 連線的客戶端憑證的「頒發者 DN」字串;
在 1.11.6 版本之前,變數名稱為 $ssl_client_i_dn
$ssl_client_raw_cert
傳回已建立的 SSL 連線的客戶端憑證,格式為 PEM;
$ssl_client_s_dn
根據 RFC 2253 傳回已建立的 SSL 連線的客戶端憑證的「主體 DN」字串 (1.11.6);
$ssl_client_s_dn_legacy
傳回已建立的 SSL 連線的客戶端憑證的「主體 DN」字串;
在 1.11.6 版本之前,變數名稱為 $ssl_client_s_dn
$ssl_client_serial
傳回已建立的 SSL 連線的客戶端憑證的序號;
$ssl_client_v_end
傳回客戶端憑證的結束日期 (1.11.7);
$ssl_client_v_remain
傳回直到客戶端憑證過期前的天數 (1.11.7);
$ssl_client_v_start
傳回客戶端憑證的開始日期 (1.11.7);
$ssl_client_verify
傳回客戶端憑證驗證的結果:「SUCCESS」、「FAILED:reason」,如果不存在憑證,則傳回「NONE」;
在 1.11.7 版本之前,「FAILED」結果不包含 reason 字串。
$ssl_curve
傳回用於 SSL 交握金鑰交換過程的已協商曲線 (1.21.5)。已知的曲線以名稱列出,未知的曲線以十六進制顯示,例如
prime256v1
只有在使用 OpenSSL 3.0 或更高版本時才支援此變數。對於較舊版本,變數值將為空字串。
$ssl_curves
傳回客戶端支援的曲線列表 (1.11.7)。已知的曲線以名稱列出,未知的曲線以十六進制顯示,例如
0x001d:prime256v1:secp521r1:secp384r1
只有在使用 OpenSSL 1.0.2 或更高版本時才支援此變數。對於較舊版本,變數值將為空字串。
此變數僅適用於新會話。
$ssl_early_data
如果使用 TLS 1.3 早期資料 且交握尚未完成,則傳回 “1”,否則傳回 “”(1.15.3)。
$ssl_protocol
傳回已建立的 SSL 連線的協定;
$ssl_server_name
傳回透過 SNI 請求的伺服器名稱 (1.7.0);
$ssl_session_id
傳回已建立的 SSL 連線的會話識別碼;
$ssl_session_reused
如果重用了 SSL 會話,則傳回 “r”,否則傳回 “.”(1.5.11)。