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
使用 Hugo 构建
主题 StackJimmy 设计