模块 ngx_mail_ssl_module

示例
Directives
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

该模块提供了必要的 支持邮件代理服务器使用 SSL/TLS 协议。ngx_mail_ssl_module

这个模块不是默认构建的,它应该使用 配置参数。--with-mail_ssl_module

此模块需要 OpenSSL 库。

示例配置

要减少处理器负载,建议

  • 工作进程数设置为等于处理器数,
  • 启用共享会话缓存,
  • 禁用内置会话缓存,
  • 并可能延长会话生存期(默认情况下为 5 分钟):

worker_processes auto;

mail {

    ...

    server {
        listen              993 ssl;

        ssl_protocols       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;

        ...
    }

Directives

语法: ssl on | off;
默认值:
ssl off;
上下文: mail,server

此Directives在版本 1.15.0 中已过时 ,并在版本 1.25.1 中删除。 参数 的 listen Directives 应该改用。ssl

语法: ssl_certificate file;
默认值:
上下文: mail,server

指定 a 和 PEM 格式的证书 对于给定的服务器。 如果除了主证书之外还应指定中间证书 certificate,则应在以下的同一文件中指定它们 顺序:首先是主证书,然后是中间证书。 PEM 格式的密钥可以放在同一个文件中。file

从 1.11.0 版本开始, 此Directives可以多次指定 要加载不同类型的证书,例如 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.15.10), 在不使用中间文件的情况下加载证书。 请注意,不恰当地使用此语法可能会产生其安全隐患。 例如将密钥数据写入错误日志datacertificatefile

语法: ssl_certificate_key file;
默认值:
上下文: mail,server

使用 PEM 格式的密钥指定 a 对于给定的服务器。file

可以指定值 :: 而不是 (1.7.9), 它加载具有从 OpenSSL 引擎指定的密钥。enginenameidfileidname

可以指定值 : 而不是 (1.15.10), 它加载密钥而不使用中间文件。 请注意,不恰当地使用此语法可能会产生其安全隐患。 例如将密钥数据写入错误日志datakeyfile

语法: 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

该Directives出现在版本 1.7.11 中。

指定具有 PEM 格式的受信任 CA 证书 用于验证客户端证书。file

证书列表将发送给客户端。 如果不需要,则可以使用 ssl_trusted_certificate Directives。

语法: ssl_conf_command name value;
默认值:
上下文: mail,server

该Directives出现在版本 1.19.4 中。

设置任意 OpenSSL 配置命令

使用 OpenSSL 1.0.2 或更高版本时,支持该Directives。

多个Directives 可以在同一级别上指定:ssl_conf_command

ssl_conf_command Options PrioritizeChaCha;
ssl_conf_command Ciphersuites TLS_CHACHA20_POLY1305_SHA256;

这些Directives继承自之前的配置级别 当且仅当没有Directives时 在当前级别上定义。ssl_conf_command

请注意,直接配置 OpenSSL 可能会导致意外行为。

语法: ssl_crl file;
默认值:
上下文: mail,server

该Directives出现在版本 1.7.11 中。

指定具有已吊销证书 (CRL) 的 采用用于验证客户端证书的 PEM 格式。file

语法: ssl_dhparam file;
默认值:
上下文: mail,server

该Directives出现在 0.7.2 版中。

为 DHE 密码指定 with DH 参数。file

默认情况下,不设置任何参数, 因此不会使用 DHE 密码。

在 1.11.0 版本之前,默认使用内置参数。

语法: ssl_ecdh_curve curve;
默认值:
ssl_ecdh_curve auto;
上下文: mail,server

该Directives出现在版本 1.1.0 和 1.0.6 中。

为 ECDHE 密码指定 a。curve

使用 OpenSSL 1.0.2 或更高版本时, 可以指定多条曲线 (1.11.0),例如:

ssl_ecdh_curve prime256v1:secp384r1;

特殊值 (1.11.0) 指示 nginx 使用 使用 OpenSSL 1.0.2 或更高版本时内置于 OpenSSL 库中的列表, 或使用旧版本。autoprime256v1

在 1.11.0 版本之前, 默认情况下,将使用曲线。prime256v1

使用 OpenSSL 1.0.2 或更高版本时, 此Directives设置 Server 支持的曲线列表。 因此,为了使 ECDSA 证书正常工作, 包括证书中使用的曲线非常重要。

语法: ssl_password_file file;
默认值:
上下文: mail,server

该Directives出现在版本 1.7.3 中。

指定 a with passphrases for secret keys,其中每个密码都在单独的行上指定。 加载密钥时依次尝试密码。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.2 TLSv1.3;
上下文: mail,server

启用指定的协议。

和 参数 (1.1.13、1.0.12)仅在使用 OpenSSL 1.0.1 或更高版本时有效。TLSv1.1TLSv1.2

参数 (1.13.0) 仅在 使用 OpenSSL 1.1.1 或更高版本。TLSv1.3

默认情况下使用该参数 从 1.23.4 开始。TLSv1.3

语法: ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
默认值:
ssl_session_cache none;
上下文: mail,server

设置存储会话参数的缓存的类型和大小。 缓存可以是以下任何类型:

off
严禁使用会话缓存: nginx 明确告诉客户端 session 不能被重用。
none
严格禁止使用 session cache: nginx 告诉客户端会话可以重用,但不会 实际上将会话参数存储在缓存中。
builtin
OpenSSL 中内置的缓存;仅由一个工作进程使用。 缓存大小在 sessions 中指定。 如果未给出 size,则等于 20480 个会话。 使用内置缓存可能会导致内存碎片。
shared
在所有工作进程之间共享的缓存。 缓存大小以字节为单位指定;1 MB 可以存储 大约 4000 个会话。 每个共享缓存都应该有一个任意名称。 具有相同名称的缓存可以在多个 服务器。 它还用于自动生成、存储和 定期轮换 TLS 会话票证密钥 (1.23.2) 除非明确配置 使用 ssl_session_ticket_key Directives。

两种缓存类型可以同时使用,例如:

ssl_session_cache builtin:1000 shared:SSL:10m;

但是只使用共享缓存而不使用内置缓存应该 更高效。

语法: ssl_session_ticket_key file;
默认值:
上下文: mail,server

该Directives出现在版本 1.5.7 中。

使用 secret 密钥设置 a 用于加密 以及解密 TLS 会话票证。 如果必须在 多个服务器。 默认情况下,使用随机生成的密钥。file

如果指定了多个键,则只有第一个键是 用于加密 TLS 会话票证。 这允许配置密钥轮换,例如:

ssl_session_ticket_key current.key;
ssl_session_ticket_key previous.key;

必须包含 80 或 48 字节 的随机数据,可以使用以下命令创建:file

openssl rand 80 > ticket.key

根据文件大小,AES256(对于 80 字节密钥,为 1.11.8) 或 AES128(用于 48 字节密钥)用于加密。

语法: ssl_session_tickets on | off;
默认值:
ssl_session_tickets on;
上下文: mail,server

该Directives出现在版本 1.5.9 中。

通过 TLS 会话票证启用或禁用会话恢复。

语法: ssl_session_timeout time;
默认值:
ssl_session_timeout 5m;
上下文: mail,server

指定客户端可以重用 session 参数。

语法: ssl_trusted_certificate file;
默认值:
上下文: mail,server

该Directives出现在版本 1.7.11 中。

指定具有 PEM 格式的受信任 CA 证书 用于验证客户端证书。file

ssl_client_certificate 设置的证书相比, 这些证书的列表不会发送给客户端。

语法: ssl_verify_client on | off | optional | optional_no_ca;
默认值:
ssl_verify_client off;
上下文: mail,server

该Directives出现在版本 1.7.11 中。

启用客户端证书验证。 验证结果在 身份验证请求的 “Auth-SSL-Verify” 标头。

该参数请求客户端 certificate 并验证证书是否存在。optional

参数 请求客户端 证书,但不要求它由受信任的 CA 证书签名。 这适用于当 nginx 外部的服务 执行实际的证书验证。 证书的内容可通过发送到身份验证服务器的请求进行访问。optional_no_ca

语法: ssl_verify_depth number;
默认值:
ssl_verify_depth 1;
上下文: mail,server

该Directives出现在版本 1.7.11 中。

设置客户端证书链中的验证深度。

语法: starttls on | off | only;
默认值:
starttls off;
上下文: mail,server

on
允许对 POP3 使用命令 以及用于 IMAP 和 SMTP 的命令;STLSSTARTTLS
off
否认使用 and 命令;STLSSTARTTLS
only
需要初步的 TLS 转换。