部署最佳实践

@2019-02-01 新版功能: 创建

参考 SSL and TLS Deployment Best Practices 。

证书

  1. 私钥

    至少选择 RSA 2048 位私钥(2030 年前),参考 密钥长度。

    Algorithm Key Size
    RSA 1024 80bits
    RSA 2048 112bits
    RSA 3072 128bits
    ECDSA 256 128bits
  2. 保护好私钥

    在拥有足够墒的可信的计算机上生成私钥。保护好私钥,控制扩散范围; 及时吊销旧的证书和私钥;降低证书更新的周期;如无必要,每次都使 用新的私钥生成证书。

  3. 证书覆盖范围

    足够多的主机/域;但尽可能控制证书扩散范围;

  4. 从可靠的 CA 申请证书

    考察 CA 的安全记录,业务覆盖范围,CRL/OCSP 服务;尽可能提前(一周) 更新证书。

  5. 使用强签名算法

    不要再使用 SHA1。

配置

  1. 使用完整的证书链

  2. 使用安全的协议

    SSL v2,SSL v3,TLS v1.0,TLS v1.1,TLS v1.2,TLS v1.3

    待处理

    补全各种攻击细节

    1. SSL v2 不要再使用。DROWN 攻击

      @2010-07-13 新版功能: 创建

      SSLv2 在协商密钥过程中所带的加密算法列表由于没有签名,因此可以被中间人替换 为较弱的加密算法,从而很容易被解密出明文。因此对SSL相关的应用最好都禁用 SSLv2。

      Apache 的配置如下:

      SSLProtocol all -SSLv2 # 禁用 SSLv2
      SSLCipherSuite HIGH:MEDIUM:!aNULL:!eNULL:!SSLv2 # 禁用弱密钥算法
      

      用如下命令测试是否生效(应该连接失败):

      openssl s_client -ssl2 -connect host:port

    2. SSL v3 不建议使用。HTTP 协议时不安全,POODLE 攻击

    3. TLS v1.0 BEAST 攻击

    4. TLV v1.1/v1.2 目前无已知漏洞,但 v1.2 才提供现代加密算法。

    5. 尽可能使用 v1.2/v1.3

  3. 使用安全的密钥算法

    使用 AEAD 算法。下列算法不应被使用:

    • ADH(Anonymous Diffie-Hellman) 无认证
    • NULL 无加密
    • Export 算法族 (FREAK 攻击)
    • 弱算法(密钥长度为 40 或 56 位)
    • RC4 不安全
    • 3DES 慢和弱

    如下是可用的一个算法配置:

    ssl_ciphers 'HIGH:-AECDH:-CAMELLIA:-DHE:!kECDHr:!kECDHe:!kPSK:!kRSA:!kSRP:!ADH:!kDH:!IDEA:!KRB5:!RC4:!SEED:!SSLv2'
    

    其包含的算法列表如下:

    # openssl ciphers -v -V 'HIGH:-AECDH:-CAMELLIA:-DHE:!kECDHr:!kECDHe:!kPSK:!kRSA:!kSRP:!ADH:!kDH:!IDEA:!KRB5:!RC4:!SEED:!SSLv2'
    0xC0,0x30 - ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(256) Mac=AEAD
    0xC0,0x2C - ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESGCM(256) Mac=AEAD
    0xC0,0x28 - ECDHE-RSA-AES256-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AES(256)  Mac=SHA384
    0xC0,0x24 - ECDHE-ECDSA-AES256-SHA384 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AES(256)  Mac=SHA384
    0xC0,0x14 - ECDHE-RSA-AES256-SHA    SSLv3 Kx=ECDH     Au=RSA  Enc=AES(256)  Mac=SHA1
    0xC0,0x0A - ECDHE-ECDSA-AES256-SHA  SSLv3 Kx=ECDH     Au=ECDSA Enc=AES(256)  Mac=SHA1
    0xC0,0x2F - ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(128) Mac=AEAD
    0xC0,0x2B - ECDHE-ECDSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESGCM(128) Mac=AEAD
    0xC0,0x27 - ECDHE-RSA-AES128-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AES(128)  Mac=SHA256
    0xC0,0x23 - ECDHE-ECDSA-AES128-SHA256 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AES(128)  Mac=SHA256
    0xC0,0x13 - ECDHE-RSA-AES128-SHA    SSLv3 Kx=ECDH     Au=RSA  Enc=AES(128)  Mac=SHA1
    0xC0,0x09 - ECDHE-ECDSA-AES128-SHA  SSLv3 Kx=ECDH     Au=ECDSA Enc=AES(128)  Mac=SHA1
    
  4. 选择最好的算法族:SSL 协议中,算法是客户端和服务端协商的,最好配置 由服务端来选择最好的算法。

  5. 使用前向保密(Perfect Forward Secrecy),保证会话不依赖服务的私钥。

  6. 使用更强的密钥交换方法,尽可能使用 ECDHE/DHE, 不要使用 RSA 作为密钥交换算法。 Logjam attack

  7. 缓解已知问题,跟踪安全披露信息,更新软件。

性能

  1. 避免过度的安全,大部分情况下密钥长度 128 位足够安全。
  2. 会话重用(Session Resumption)
  3. 使用 WAN 优化(CDN等),HTTP/2 。
  4. 缓存公开内容,避免无谓的加密。
  5. 使用 OCSP 装订(Stapling)。
  6. 使用快速加密方法,例如硬件加速。

HTTP 以及应用安全

  1. 加密所有

  2. 避免混合加密/非加密内容,防范中间人攻击(MITM)

  3. 理解并确认第三方信任(例如 Google Analytics)

  4. 使用安全 Cookie

  5. 安全的 HTTP 压缩(CRIME/TIME/BREACH 攻击)

  6. 部署 HSTS(HTTP Strict Transport Security)

    Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
    
  7. 部署 Content Security Policy(CSP)

    Content-Security-Policy: default-src https: 'unsafe-inline' 'unsafe-eval';
                             connect-src https: wss:
    
  8. 不要缓存敏感内容

高级配置

  1. 公钥固定,参考 RFC 7649 ,DNS CAA
  2. DNSSEC,DNAME
  3. HSTS