模块 ngx_stream_ssl_module (1.9.0 版本)提供了流代理服务器与 SSL/TLS 协议配合工作所需的支持。该模块默认未构建,需要使用 --with-stream_ssl_module 配置参数启用。
ngx_stream_ssl_module
--with-stream_ssl_module
为了降低处理器负载,建议
worker_processes auto; stream { server { listen 12345 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; map $ssl_alpn_protocol $proxy { h2 127.0.0.1:8001; http/1.1 127.0.0.1:8002; server { listen 12346; proxy_pass $proxy; ssl_alpn h2 http/1.1; 指定给定服务器的 PEM 格式的证书文件。如果除主要证书外还应指定中间证书,则应按以下顺序在同一文件中指定它们:首先是主要证书,然后是中间证书。 PEM 格式的密钥也可以放置在同一文件中。 自 1.11.0 版本起,此指令可多次指定以加载不同类型的证书,例如 RSA 和 ECDSA: server { listen 12345 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; 自 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),它会从变量加载证书而不使用中间文件。请注意,不恰当地使用此语法可能会导致安全问题,例如将密钥数据写入错误日志。 指定给定服务器的 PEM 格式的密钥文件。 可以在 file 之外指定值 engine:name:id,它会从 OpenSSL 引擎 name 中加载具有指定 id 的密钥。 可以指定值 data:$variable 来代替 file (1.15.10),它会从变量加载密钥而不使用中间文件。请注意,不恰当地使用此语法可能会导致安全问题,例如将密钥数据写入错误日志。 自 1.15.9 版本起,在使用 OpenSSL 1.0.2 或更高版本时,可以在 file 名称中使用变量。 ssl_conf_command Options PrioritizeChaCha; ssl_conf_command Ciphersuites TLS_CHACHA20_POLY1305_SHA256; 如果当前级别没有定义ssl_conf_command指令,则这些指令将从上一级配置级别继承。 注意直接配置OpenSSL可能导致意外行为。 # named pipe can also be used instead of a file ssl_password_file /etc/keys/fifo; ssl_certificate_key /etc/keys/second.key; listen 443 ssl; server_name example.com; ssl_certificate example.com.crt; ssl_certificate_key example.com.key; 设置用于加密和解密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字节密钥)进行加密。 此指令首次出现于版本1.11.8。 启用客户端证书验证。验证结果存储在$ssl_client_verify变量中。如果在客户端证书验证过程中发生错误或客户端未提供所需证书,则关闭连接。 参数optional请求客户端证书并在证书存在时验证它。 参数optional_no_ca请求客户端证书,但不要求其由受信任的CA证书签名。这适用于nginx外部服务执行实际证书验证的情况。证书的内容可通过$ssl_client_cert变量访问。
map $ssl_alpn_protocol $proxy { h2 127.0.0.1:8001; http/1.1 127.0.0.1:8002; server { listen 12346; proxy_pass $proxy; ssl_alpn h2 http/1.1; 指定给定服务器的 PEM 格式的证书文件。如果除主要证书外还应指定中间证书,则应按以下顺序在同一文件中指定它们:首先是主要证书,然后是中间证书。 PEM 格式的密钥也可以放置在同一文件中。 自 1.11.0 版本起,此指令可多次指定以加载不同类型的证书,例如 RSA 和 ECDSA: server { listen 12345 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; 自 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),它会从变量加载证书而不使用中间文件。请注意,不恰当地使用此语法可能会导致安全问题,例如将密钥数据写入错误日志。 指定给定服务器的 PEM 格式的密钥文件。 可以在 file 之外指定值 engine:name:id,它会从 OpenSSL 引擎 name 中加载具有指定 id 的密钥。 可以指定值 data:$variable 来代替 file (1.15.10),它会从变量加载密钥而不使用中间文件。请注意,不恰当地使用此语法可能会导致安全问题,例如将密钥数据写入错误日志。 自 1.15.9 版本起,在使用 OpenSSL 1.0.2 或更高版本时,可以在 file 名称中使用变量。 ssl_conf_command Options PrioritizeChaCha; ssl_conf_command Ciphersuites TLS_CHACHA20_POLY1305_SHA256; 如果当前级别没有定义ssl_conf_command指令,则这些指令将从上一级配置级别继承。 注意直接配置OpenSSL可能导致意外行为。 # named pipe can also be used instead of a file ssl_password_file /etc/keys/fifo; ssl_certificate_key /etc/keys/second.key; listen 443 ssl; server_name example.com; ssl_certificate example.com.crt; ssl_certificate_key example.com.key; 设置用于加密和解密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字节密钥)进行加密。 此指令首次出现于版本1.11.8。 启用客户端证书验证。验证结果存储在$ssl_client_verify变量中。如果在客户端证书验证过程中发生错误或客户端未提供所需证书,则关闭连接。 参数optional请求客户端证书并在证书存在时验证它。 参数optional_no_ca请求客户端证书,但不要求其由受信任的CA证书签名。这适用于nginx外部服务执行实际证书验证的情况。证书的内容可通过$ssl_client_cert变量访问。
指定给定服务器的 PEM 格式的证书文件。如果除主要证书外还应指定中间证书,则应按以下顺序在同一文件中指定它们:首先是主要证书,然后是中间证书。 PEM 格式的密钥也可以放置在同一文件中。
自 1.11.0 版本起,此指令可多次指定以加载不同类型的证书,例如 RSA 和 ECDSA:
server { listen 12345 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; 自 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),它会从变量加载证书而不使用中间文件。请注意,不恰当地使用此语法可能会导致安全问题,例如将密钥数据写入错误日志。 指定给定服务器的 PEM 格式的密钥文件。 可以在 file 之外指定值 engine:name:id,它会从 OpenSSL 引擎 name 中加载具有指定 id 的密钥。 可以指定值 data:$variable 来代替 file (1.15.10),它会从变量加载密钥而不使用中间文件。请注意,不恰当地使用此语法可能会导致安全问题,例如将密钥数据写入错误日志。 自 1.15.9 版本起,在使用 OpenSSL 1.0.2 或更高版本时,可以在 file 名称中使用变量。 ssl_conf_command Options PrioritizeChaCha; ssl_conf_command Ciphersuites TLS_CHACHA20_POLY1305_SHA256; 如果当前级别没有定义ssl_conf_command指令,则这些指令将从上一级配置级别继承。 注意直接配置OpenSSL可能导致意外行为。 # named pipe can also be used instead of a file ssl_password_file /etc/keys/fifo; ssl_certificate_key /etc/keys/second.key; listen 443 ssl; server_name example.com; ssl_certificate example.com.crt; ssl_certificate_key example.com.key; 设置用于加密和解密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字节密钥)进行加密。 此指令首次出现于版本1.11.8。 启用客户端证书验证。验证结果存储在$ssl_client_verify变量中。如果在客户端证书验证过程中发生错误或客户端未提供所需证书,则关闭连接。 参数optional请求客户端证书并在证书存在时验证它。 参数optional_no_ca请求客户端证书,但不要求其由受信任的CA证书签名。这适用于nginx外部服务执行实际证书验证的情况。证书的内容可通过$ssl_client_cert变量访问。
自 1.15.9 版本起,在使用 OpenSSL 1.0.2 或更高版本时,可以在 file 名称中使用变量:
file
ssl_certificate $ssl_server_name.crt; ssl_certificate_key $ssl_server_name.key; 注意,使用变量意味着每个 SSL 握手将加载一个证书,这可能会对性能产生负面影响。 可以指定值 data:$variable 来代替 file (1.15.10),它会从变量加载证书而不使用中间文件。请注意,不恰当地使用此语法可能会导致安全问题,例如将密钥数据写入错误日志。 指定给定服务器的 PEM 格式的密钥文件。 可以在 file 之外指定值 engine:name:id,它会从 OpenSSL 引擎 name 中加载具有指定 id 的密钥。 可以指定值 data:$variable 来代替 file (1.15.10),它会从变量加载密钥而不使用中间文件。请注意,不恰当地使用此语法可能会导致安全问题,例如将密钥数据写入错误日志。 自 1.15.9 版本起,在使用 OpenSSL 1.0.2 或更高版本时,可以在 file 名称中使用变量。 ssl_conf_command Options PrioritizeChaCha; ssl_conf_command Ciphersuites TLS_CHACHA20_POLY1305_SHA256; 如果当前级别没有定义ssl_conf_command指令,则这些指令将从上一级配置级别继承。 注意直接配置OpenSSL可能导致意外行为。 # named pipe can also be used instead of a file ssl_password_file /etc/keys/fifo; ssl_certificate_key /etc/keys/second.key; listen 443 ssl; server_name example.com; ssl_certificate example.com.crt; ssl_certificate_key example.com.key; 设置用于加密和解密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字节密钥)进行加密。 此指令首次出现于版本1.11.8。 启用客户端证书验证。验证结果存储在$ssl_client_verify变量中。如果在客户端证书验证过程中发生错误或客户端未提供所需证书,则关闭连接。 参数optional请求客户端证书并在证书存在时验证它。 参数optional_no_ca请求客户端证书,但不要求其由受信任的CA证书签名。这适用于nginx外部服务执行实际证书验证的情况。证书的内容可通过$ssl_client_cert变量访问。
注意,使用变量意味着每个 SSL 握手将加载一个证书,这可能会对性能产生负面影响。
可以指定值 data:$variable 来代替 file (1.15.10),它会从变量加载证书而不使用中间文件。请注意,不恰当地使用此语法可能会导致安全问题,例如将密钥数据写入错误日志。
data
$variable
指定给定服务器的 PEM 格式的密钥文件。
可以在 file 之外指定值 engine:name:id,它会从 OpenSSL 引擎 name 中加载具有指定 id 的密钥。
engine
name
id
可以指定值 data:$variable 来代替 file (1.15.10),它会从变量加载密钥而不使用中间文件。请注意,不恰当地使用此语法可能会导致安全问题,例如将密钥数据写入错误日志。
自 1.15.9 版本起,在使用 OpenSSL 1.0.2 或更高版本时,可以在 file 名称中使用变量。
ssl_conf_command Options PrioritizeChaCha; ssl_conf_command Ciphersuites TLS_CHACHA20_POLY1305_SHA256; 如果当前级别没有定义ssl_conf_command指令,则这些指令将从上一级配置级别继承。 注意直接配置OpenSSL可能导致意外行为。 # named pipe can also be used instead of a file ssl_password_file /etc/keys/fifo; ssl_certificate_key /etc/keys/second.key; listen 443 ssl; server_name example.com; ssl_certificate example.com.crt; ssl_certificate_key example.com.key; 设置用于加密和解密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字节密钥)进行加密。 此指令首次出现于版本1.11.8。 启用客户端证书验证。验证结果存储在$ssl_client_verify变量中。如果在客户端证书验证过程中发生错误或客户端未提供所需证书,则关闭连接。 参数optional请求客户端证书并在证书存在时验证它。 参数optional_no_ca请求客户端证书,但不要求其由受信任的CA证书签名。这适用于nginx外部服务执行实际证书验证的情况。证书的内容可通过$ssl_client_cert变量访问。
如果当前级别没有定义ssl_conf_command指令,则这些指令将从上一级配置级别继承。
ssl_conf_command
设置用于加密和解密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字节密钥)进行加密。 此指令首次出现于版本1.11.8。 启用客户端证书验证。验证结果存储在$ssl_client_verify变量中。如果在客户端证书验证过程中发生错误或客户端未提供所需证书,则关闭连接。 参数optional请求客户端证书并在证书存在时验证它。 参数optional_no_ca请求客户端证书,但不要求其由受信任的CA证书签名。这适用于nginx外部服务执行实际证书验证的情况。证书的内容可通过$ssl_client_cert变量访问。
该file必须包含80或48字节的随机数据,可以使用以下命令创建:
openssl rand 80 > ticket.key 根据文件大小,将使用AES256(用于80字节密钥,1.11.8)或AES128(用于48字节密钥)进行加密。 此指令首次出现于版本1.11.8。 启用客户端证书验证。验证结果存储在$ssl_client_verify变量中。如果在客户端证书验证过程中发生错误或客户端未提供所需证书,则关闭连接。 参数optional请求客户端证书并在证书存在时验证它。 参数optional_no_ca请求客户端证书,但不要求其由受信任的CA证书签名。这适用于nginx外部服务执行实际证书验证的情况。证书的内容可通过$ssl_client_cert变量访问。
根据文件大小,将使用AES256(用于80字节密钥,1.11.8)或AES128(用于48字节密钥)进行加密。
此指令首次出现于版本1.11.8。
启用客户端证书验证。验证结果存储在$ssl_client_verify变量中。如果在客户端证书验证过程中发生错误或客户端未提供所需证书,则关闭连接。
参数optional请求客户端证书并在证书存在时验证它。
optional
参数optional_no_ca请求客户端证书,但不要求其由受信任的CA证书签名。这适用于nginx外部服务执行实际证书验证的情况。证书的内容可通过$ssl_client_cert变量访问。
optional_no_ca