Featured image of post Nginx 服务器端 TLS 最佳配置

Nginx 服务器端 TLS 最佳配置

来自 Mozilla 的《Server Side TLS》

Mozilla 为使用 TLS 的服务器提供三种推荐配置。请根据你的受众选择正确的配置 (配置生成器)

  • 现代 (Modern): 支持 TLS 1.3 的现代客户端, 无需向后兼容
  • 中间 (Intermediate): 通用服务器的推荐配置
  • 旧版 (Old): 由非常旧的客户端或库访问的服务, 例如 Internet Explorer 8 (Windows XP)、Java 6 或 OpenSSL 0.9.8
配置 Firefox Android Chrome Edge Internet Explorer Java OpenSSL Opera Safari
现代 63 10.0 70 75 – 11 1.1.1 57 12.1
中间 27 4.4.2 31 12 11 (Win7) 8u31 1.0.1 20 9
旧版 1 2.3 1 12 8 (WinXP) 6 0.9.8 5 1

中间和旧版配置中的密码套件顺序非常重要, 因为它决定了算法选择的优先级

OpenSSL 会忽略其不支持的密码套件, 因此始终按照以下推荐顺序使用完整的密码套件集。在现代版本的 OpenSSL 中使用旧版配置可能需要支持已弃用密码的自定义构建。

现代兼容性 (Modern Compatibility)

对于支持 TLS 1.3 且不需要向后兼容的客户端, 现代配置提供了极高的安全性

  • 密码套件 (Cipher Suites):
    • TLS 1.3: TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
    • TLS 1.2: 无 (完全禁用)
  • 协议 (Protocols): TLS 1.3
  • TLS 曲线 (TLS Curves):
    • X25519
    • prime256v1 (P-256)
    • secp384r1 (P-384)
  • 证书类型 (Certificate Type): ECDSA (P-256) 椭圆曲线证书
  • HSTS (HTTP 严格传输安全): max-age=63072000 (两年)
  • 证书生命周期 (Certificate Lifespan): 90 days
  • 密码套件优先级 (Cipher Preference): 客户端选择, 以优化硬件加速支持
标识          密码套件名称                    协议    密钥交换 (Kx)  认证 (Au)  加密算法 (Enc)       消息认证 (Mac)
0x13,0x01  -  TLS_AES_128_GCM_SHA256        TLSv1.3  Kx=any  Au=any  Enc=AESGCM(128)             Mac=AEAD
0x13,0x02  -  TLS_AES_256_GCM_SHA384        TLSv1.3  Kx=any  Au=any  Enc=AESGCM(256)             Mac=AEAD
0x13,0x03  -  TLS_CHACHA20_POLY1305_SHA256  TLSv1.3  Kx=any  Au=any  Enc=CHACHA20/POLY1305(256)  Mac=AEAD

使用建议 (Rationale):

  • 所有密码套件均支持 前向保密 (forward secret) 和 认证加密 (authenticated)
  • 这些密码套件都很强大, 因此允许客户端选择, 以便根据硬件支持优化性能 (如硬件加速的 AES)
  • 推荐使用 ECDSA 证书, 并选用 P-256 曲线。P-384 曲线对安全性的提升有限, 而 Ed25519 尚未被广泛支持。

对于不需要兼容旧版客户端 (如 Windows XP 或旧版 OpenSSL) 服务。这是针对绝大多数服务的推荐配置, 因为它非常安全, 并且与过去五年 (或更长时间) 发布的几乎所有客户端兼容。

  • 密码套件 (Cipher Suites):
    • TLS 1.3: TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
    • TLS 1.2: ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305
  • 协议 (Protocols): TLS 1.2, TLS 1.3
  • TLS 曲线 (TLS Curves):
    • X25519
    • prime256v1 (P-256)
    • secp384r1 (P-384)
  • 证书类型 (Certificate Type): ECDSA (P-256) (推荐), 或者 RSA (2048-bits)
  • DH 参数大小 (DH Parameter Size): 2048 (ffdhe2048, 符合 RFC 7919)
  • HSTS (HTTP 严格传输安全): max-age=63072000 (两年)
  • 证书生命周期 (Certificate Lifespan): 90 days (推荐) to 366 days
  • 密码套件优先级 (Cipher Preference): 客户端选择
0x13,0x01  -  TLS_AES_128_GCM_SHA256         TLSv1.3  Kx=any   Au=any    Enc=AESGCM(128)             Mac=AEAD
0x13,0x02  -  TLS_AES_256_GCM_SHA384         TLSv1.3  Kx=any   Au=any    Enc=AESGCM(256)             Mac=AEAD
0x13,0x03  -  TLS_CHACHA20_POLY1305_SHA256   TLSv1.3  Kx=any   Au=any    Enc=CHACHA20/POLY1305(256)  Mac=AEAD
0xC0,0x2B  -  ECDHE-ECDSA-AES128-GCM-SHA256  TLSv1.2  Kx=ECDH  Au=ECDSA  Enc=AESGCM(128)             Mac=AEAD
0xC0,0x2F  -  ECDHE-RSA-AES128-GCM-SHA256    TLSv1.2  Kx=ECDH  Au=RSA    Enc=AESGCM(128)             Mac=AEAD
0xC0,0x2C  -  ECDHE-ECDSA-AES256-GCM-SHA384  TLSv1.2  Kx=ECDH  Au=ECDSA  Enc=AESGCM(256)             Mac=AEAD
0xC0,0x30  -  ECDHE-RSA-AES256-GCM-SHA384    TLSv1.2  Kx=ECDH  Au=RSA    Enc=AESGCM(256)             Mac=AEAD
0xCC,0xA9  -  ECDHE-ECDSA-CHACHA20-POLY1305  TLSv1.2  Kx=ECDH  Au=ECDSA  Enc=CHACHA20/POLY1305(256)  Mac=AEAD
0xCC,0xA8  -  ECDHE-RSA-CHACHA20-POLY1305    TLSv1.2  Kx=ECDH  Au=RSA    Enc=CHACHA20/POLY1305(256)  Mac=AEAD
0x00,0x9E  -  DHE-RSA-AES128-GCM-SHA256      TLSv1.2  Kx=DH    Au=RSA    Enc=AESGCM(128)             Mac=AEAD
0x00,0x9F  -  DHE-RSA-AES256-GCM-SHA384      TLSv1.2  Kx=DH    Au=RSA    Enc=AESGCM(256)             Mac=AEAD
0xCC,0xAA  -  DHE-RSA-CHACHA20-POLY1305      TLSv1.2  Kx=DH    Au=RSA    Enc=CHACHA20/POLY1305(256)  Mac=AEAD

使用建议:

  • 所有密码套件均支持 前向保密 (forward secret) 和 认证加密 (authenticated)
  • TLS 1.2 是最低支持的协议, 符合 RFC 7525 和 PCI DSS 的要求
  • 建议使用 ECDSA 证书, 而不是 RSA 证书, 因为它们允许在使用 Internet Explorer 11 的 Windows 7 客户端上使用 ECDHE, 可兼容 Windows Server 2008 R2 的 IE11
  • 密码套件都很安全, 因此我们允许客户进行选择, 因为他们最清楚是否支持硬件加速的 AES
  • Microsoft 已停止支持 Windows XP (包括所有嵌入式版本), 因此无需支持旧协议和密码
  • 需要提供对 Windows Server 2008 R2 的 IE 11 的访问权限且无法切换或添加 ECDSA 证书的可以添加 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
  • 虽然我们的目标是支持广泛的客户端, 但我们会合理地禁用支持较少的密码 (如 ARIA、Camellia、3DES、SEED)
  • 建议的最长证书有效期为 90 天, 以鼓励自动化颁发流程

旧版向后兼容配置 (Old Backward Compatibility)

此配置适用于许多非常老旧的客户端, 只应在必要时作为最后手段使用。它支持更广泛的协议和密码套件, 确保兼容某些非常老旧的客户端, 如 Internet Explorer 8 (Windows XP)、Java 6 或 OpenSSL 0.9.8

  • 密码套件 (Cipher Suites):
    • TLS 1.3: TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
    • TLS 1.0 - 1.2: ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA
  • 协议 (Protocols): TLS 1.0, TLS 1.1, TLS 1.2, TLS 1.3
  • TLS 曲线 (TLS Curves):
    • X25519
    • prime256v1 (P-256)
    • secp384r1 (P-384)
  • 证书类型 (Certificate Type): RSA (2048-bits)
  • 证书曲线 (Certificate Curve): 无
  • DH 参数大小 (DH Parameter Size): 1024 (生成时使用 openssl dhparam 1024)
  • HSTS (HTTP 严格传输安全): max-age=63072000 (两年)
  • 证书生命周期 (Certificate Lifespan): 90 days (推荐) to 366 days
  • 密码套件优先级 (Cipher Preference): 服务器选择
0x13,0x01  -  TLS_AES_128_GCM_SHA256         TLSv1.3  Kx=any   Au=any    Enc=AESGCM(128)             Mac=AEAD
0x13,0x02  -  TLS_AES_256_GCM_SHA384         TLSv1.3  Kx=any   Au=any    Enc=AESGCM(256)             Mac=AEAD
0x13,0x03  -  TLS_CHACHA20_POLY1305_SHA256   TLSv1.3  Kx=any   Au=any    Enc=CHACHA20/POLY1305(256)  Mac=AEAD
0xC0,0x2B  -  ECDHE-ECDSA-AES128-GCM-SHA256  TLSv1.2  Kx=ECDH  Au=ECDSA  Enc=AESGCM(128)             Mac=AEAD
0xC0,0x2F  -  ECDHE-RSA-AES128-GCM-SHA256    TLSv1.2  Kx=ECDH  Au=RSA    Enc=AESGCM(128)             Mac=AEAD
0xC0,0x2C  -  ECDHE-ECDSA-AES256-GCM-SHA384  TLSv1.2  Kx=ECDH  Au=ECDSA  Enc=AESGCM(256)             Mac=AEAD
0xC0,0x30  -  ECDHE-RSA-AES256-GCM-SHA384    TLSv1.2  Kx=ECDH  Au=RSA    Enc=AESGCM(256)             Mac=AEAD
0xCC,0xA9  -  ECDHE-ECDSA-CHACHA20-POLY1305  TLSv1.2  Kx=ECDH  Au=ECDSA  Enc=CHACHA20/POLY1305(256)  Mac=AEAD
0xCC,0xA8  -  ECDHE-RSA-CHACHA20-POLY1305    TLSv1.2  Kx=ECDH  Au=RSA    Enc=CHACHA20/POLY1305(256)  Mac=AEAD
0x00,0x9E  -  DHE-RSA-AES128-GCM-SHA256      TLSv1.2  Kx=DH    Au=RSA    Enc=AESGCM(128)             Mac=AEAD
0x00,0x9F  -  DHE-RSA-AES256-GCM-SHA384      TLSv1.2  Kx=DH    Au=RSA    Enc=AESGCM(256)             Mac=AEAD
0xCC,0xAA  -  DHE-RSA-CHACHA20-POLY1305      TLSv1.2  Kx=DH    Au=RSA    Enc=CHACHA20/POLY1305(256)  Mac=AEAD
0xC0,0x23  -  ECDHE-ECDSA-AES128-SHA256      TLSv1.2  Kx=ECDH  Au=ECDSA  Enc=AES(128)                Mac=SHA256
0xC0,0x27  -  ECDHE-RSA-AES128-SHA256        TLSv1.2  Kx=ECDH  Au=RSA    Enc=AES(128)                Mac=SHA256
0xC0,0x09  -  ECDHE-ECDSA-AES128-SHA         TLSv1    Kx=ECDH  Au=ECDSA  Enc=AES(128)                Mac=SHA1
0xC0,0x13  -  ECDHE-RSA-AES128-SHA           TLSv1    Kx=ECDH  Au=RSA    Enc=AES(128)                Mac=SHA1
0xC0,0x24  -  ECDHE-ECDSA-AES256-SHA384      TLSv1.2  Kx=ECDH  Au=ECDSA  Enc=AES(256)                Mac=SHA384
0xC0,0x28  -  ECDHE-RSA-AES256-SHA384        TLSv1.2  Kx=ECDH  Au=RSA    Enc=AES(256)                Mac=SHA384
0xC0,0x0A  -  ECDHE-ECDSA-AES256-SHA         TLSv1    Kx=ECDH  Au=ECDSA  Enc=AES(256)                Mac=SHA1
0xC0,0x14  -  ECDHE-RSA-AES256-SHA           TLSv1    Kx=ECDH  Au=RSA    Enc=AES(256)                Mac=SHA1
0x00,0x67  -  DHE-RSA-AES128-SHA256          TLSv1.2  Kx=DH    Au=RSA    Enc=AES(128)                Mac=SHA256
0x00,0x6B  -  DHE-RSA-AES256-SHA256          TLSv1.2  Kx=DH    Au=RSA    Enc=AES(256)                Mac=SHA256
0x00,0x9C  -  AES128-GCM-SHA256              TLSv1.2  Kx=RSA   Au=RSA    Enc=AESGCM(128)             Mac=AEAD
0x00,0x9D  -  AES256-GCM-SHA384              TLSv1.2  Kx=RSA   Au=RSA    Enc=AESGCM(256)             Mac=AEAD
0x00,0x3C  -  AES128-SHA256                  TLSv1.2  Kx=RSA   Au=RSA    Enc=AES(128)                Mac=SHA256
0x00,0x3D  -  AES256-SHA256                  TLSv1.2  Kx=RSA   Au=RSA    Enc=AES(256)                Mac=SHA256
0x00,0x2F  -  AES128-SHA                     SSLv3    Kx=RSA   Au=RSA    Enc=AES(128)                Mac=SHA1
0x00,0x35  -  AES256-SHA                     SSLv3    Kx=RSA   Au=RSA    Enc=AES(256)                Mac=SHA1
0x00,0x0A  -  DES-CBC3-SHA                   SSLv3    Kx=RSA   Au=RSA    Enc=3DES(168)               Mac=SHA1

使用建议:

  • 此配置仅应在某些需要兼容老旧客户端的特殊情况下使用
  • 如果可能的话, 仅对需要此此兼容性配置的接入点 (endpoints) 使用, 与其他流量隔离
  • 完全禁用 SSLv3 支持, 终止了对旧版 Windows XP SP2 客户端的支持。对于需要支持 Windows XP SP2 的用户可以使用此配置的 先前版本, 但需要注意的是 SSLv3 已不再安全。
  • 此配置需要自定义构建才能与 OpenSSL 的现代版本配合使用, 使用 OpenSSL 的 enable-ssl3, enable-ssl3-method, enable-deprecated, 和 enable-weak-ssl-ciphers 选项
  • 支持大多数尚未被明确破解和使用起来很危险的密码套件

原文

Security/Server Side TLS

最后更新于 2019-07-09