SSL#

提供了邮件代理服务器使用SSL/TLS协议所需的支持。

当从源代码 构建 时, 默认不会构建此模块; 需要通过 ‑‑with‑mail_ssl_module 构建选项 启用。

在来自 我们仓库 的软件包和镜像中, 此模块已包含在构建中。

重要

此模块需要OpenSSL库。

配置示例#

为了减少处理器负载,建议

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/angie/conf/cert.pem;
        ssl_certificate_key /usr/local/angie/conf/cert.key;
        ssl_session_cache   shared:SSL:10m;
        ssl_session_timeout 10m;

    #    ...
    }

指令#

ssl_certificate#

语法

ssl_certificate file;

默认值

上下文

mail, server

指定给定服务器的PEM格式证书文件。如果除了主证书外还需要指定中间证书,则应该按照以下顺序在同一文件中指定:首先是主证书,然后是中间证书。PEM格式的私钥可以放在同一文件中。

可以多次指定此指令以加载不同类型的证书,例如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或更高版本支持为不同的证书链设置单独的证书链。在旧版本中,只能使用一个证书链。

重要

使用OpenSSL 1.0.2或更高版本时,文件名中可以使用变量:

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

请注意,使用变量意味着每次SSL握手都会加载证书,这可能对性能产生负面影响。

可以指定"data:certificate"作为 file 的值,这将加载不使用中间文件的证书。

请注意,不当使用此语法可能会带来安全隐患,例如将私钥数据写入 错误日志

ssl_certificate_key#

语法

ssl_certificate_key file;

默认值

上下文

mail, server

指定给定服务器的PEM格式私钥文件。

重要

使用OpenSSL 1.0.2或更高版本时,文件名中可以使用变量。

可以指定"engine:name:id"作为 file 的值,从OpenSSL引擎 name 中加载指定 id 的私钥。

可以指定"data:key"作为 file 的值,这将加载不使用中间文件的私钥。请注意,不当使用此语法可能会带来安全隐患,例如将私钥数据写入 错误日志

ssl_ciphers#

语法

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"命令查看完整列表。

ssl_client_certificate#

语法

ssl_client_certificate file;

默认值

上下文

mail, server

指定用于 验证 客户端证书的PEM格式受信任CA证书文件。

证书列表将发送给客户端。如果不希望这样,可以使用 ssl_trusted_certificate 指令。

ssl_conf_command#

语法

ssl_conf_command name value;

默认值

上下文

mail, server

设置任意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#

语法

ssl_crl file;

默认值

上下文

mail, server

指定用于 验证 客户端证书的PEM格式吊销证书 (CRL) 文件。

ssl_dhparam#

语法

ssl_dhparam file;

默认值

上下文

mail, server

指定用于DHE密码套件的DH参数文件。

小心

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

ssl_ecdh_curve#

语法

ssl_ecdh_curve curve;

默认值

ssl_ecdh_curve auto;

上下文

mail, server

指定用于ECDHE密码套件的曲线。

重要

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

ssl_ecdh_curve prime256v1:secp384r1;

特殊值 auto 指示Angie在使用OpenSSL 1.0.2或更高版本时使用OpenSSL库内置的列表,或在旧版本中使用prime256v1。

重要

使用OpenSSL 1.0.2或更高版本时,该指令设置服务器支持的曲线列表。因此,为了使ECDSA证书正常工作,重要的是要包括证书中使用的曲线。

ssl_password_file#

语法

ssl_password_file file;

默认值

上下文

mail, server

指定 私钥 的密码短语文件,其中每个密码短语在单独的行中指定。加载密钥时依次尝试这些密码短语。

示例:

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;

        # 可以使用命名管道代替文件
        ssl_password_file /etc/keys/fifo;
        ssl_certificate_key /etc/keys/second.key;
    }
}

ssl_prefer_server_ciphers#

语法

ssl_prefer_server_ciphers on | off;

默认值

ssl_prefer_server_ciphers off;

上下文

mail, server

指定在使用SSLv3和TLS协议时应优先选择服务器密码套件而不是客户端密码套件。

ssl_protocols#

语法

ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2] [TLSv1.3];

默认值

ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;

上下文

mail, server

在 1.2.0 版本发生变更: TLSv1.3 参数已添加到默认设置中。

启用指定的协议。

重要

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

TLSv1.3参数仅在使用OpenSSL 1.1.1或更高版本时有效。

ssl_session_cache#

语法

ssl_session_cache off | none | [builtin[:size]] [shared:name:size];

默认值

ssl_session_cache none;

上下文

mail, server

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

off

严格禁止使用会话缓存:Angie明确告知客户端会话不能被重用。

none

温和地不允许使用会话缓存:Angie告知客户端会话可以被重用,但实际上并不在缓存中存储会话参数。

builtin

OpenSSL内置缓存;仅供一个工作进程使用。缓存大小以会话数量指定。如果未给出大小,则等于20480个会话。使用内置缓存可能导致内存碎片化。

shared

所有工作进程共享的缓存。缓存大小以字节指定;一兆字节可以存储约4000个会话。每个共享缓存应有一个任意名称。可以在多个服务器中使用具有相同名称的缓存。它还用于自动生成、存储和定期轮换TLS会话票证密钥,除非使用 ssl_session_ticket_key 指令显式配置。

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

ssl_session_cache builtin:1000 shared:SSL:10m;

但仅使用共享缓存而不使用内置缓存的效率可能更高。

ssl_session_ticket_key#

语法

ssl_session_ticket_key file;

默认值

上下文

mail, server

设置用于加密和解密TLS会话票据的密钥文件。该指令在多个服务器需要共享同一个密钥时是必要的。默认情况下,使用随机生成的密钥。

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

ssl_session_ticket_key current.key;
ssl_session_ticket_key previous.key;

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

openssl rand 80 > ticket.key

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

ssl_session_tickets#

语法

ssl_session_tickets on | off;

默认值

ssl_session_tickets on;

上下文

mail, server

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

ssl_session_timeout#

语法

ssl_session_timeout time;

默认值

ssl_session_timeout 5m;

上下文

mail, server

指定客户端可以重用会话参数的时间。

ssl_trusted_certificate#

语法

ssl_trusted_certificate file;

默认值

上下文

mail, server

指定用于 验证 客户端证书的PEM格式的受信任CA证书文件。

与通过 ssl_client_certificate 设置的证书不同,这些证书列表不会发送给客户端。

ssl_verify_client#

语法

ssl_verify_client on | off | optional | optional_no_ca;

默认值

ssl_verify_client off;

上下文

mail, server

启用客户端证书的验证。验证结果在 认证 请求的“Auth-SSL-Verify”头中传递。

optional

请求客户端证书并在证书存在时验证。

optional_no_ca

请求客户端证书但不要求其由受信任的CA证书签名。这适用于当一个外部服务执行实际证书验证的场合。证书内容通过请求 发送 到认证服务器。

ssl_verify_depth#

语法

ssl_verify_depth number;

默认值

ssl_verify_depth 1;

上下文

mail, server

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

starttls#

语法

starttls on | off | only;

默认值

starttls off;

上下文

mail, server

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

on

允许在POP3中使用STLS命令以及在IMAP和SMTP中使用STARTTLS命令;

off

禁止使用STLS和STARTTLS命令;

only

要求预先进行TLS转换。