如何在Nginx上优化TLS配置以平衡并提升安全性与连接性能?

如何在Nginx上优化TLS配置以平衡并提升安全性与连接性能?

在当今的互联网世界中,安全性和隐私性成为了每个用户和组织关注的重点。传输层安全(TLS,Transport Layer Security)协议作为一种广泛应用的加密协议,正是为了解决这一问题而设计的。TLS 通过加密传输的数据,确保了在客户端和服务器之间的通信是安全的,防止了数据被窃取、篡改或伪造。无论是电子商务交易、在线银行业务,还是简单的电子邮件通信,TLS 都在保护用户的敏感信息和维护网络安全方面起着至关重要的作用。

虽然 TLS 在保护数据传输安全方面表现卓越,但其加密和解密过程不可避免地会引入一些性能开销。特别是在高流量和高并发的环境中,TLS 的性能问题变得尤为突出。为了保证用户体验和服务器响应速度,我们需要仔细配置 TLS,优化其性能。这不仅涉及到选择合适的加密算法,还包括配置证书缓存、会话重用以及启用 HTTP/2 等技术。本文将重点介绍如何在 Nginx 上配置 TLS,以在保证安全性的同时最大限度地提升连接性能。

一、详解

建立 TLS 会话过程中需要客户端和服务进行协商,协商过程需要 2 个完整的来回 (roundtrip, 简称 RTT)。

如何在Nginx上优化TLS配置以平衡并提升安全性与连接性能?

TLS 会话缓存

为了提高性能,我们可以将握手过程的一些参数缓存起来,当客户重新连接时不需要再进行这些参数的协商,而是直接“恢复”会话。Nginx 支持两种 TLS 会话缓存技术:会话 ID 恢复和 会话 Ticket 恢复。

会话 ID 恢复

每个 TLS 会话都有一个唯一的会话 ID,Nginx 可以将每个会话的 ID 和这次会话使用的加密参数一起保存起来,此时的协商流程就能被简化到只有一次网络传输来回 (1-RTT)。

如何在Nginx上优化TLS配置以平衡并提升安全性与连接性能?

事实上,如果浏览器需要与同一主机的多个连接,它通常会故意等待第一个 TLS 协商完成,然后再打开与同一服务器的其他连接,以便它们可以“恢复”并重用相同的会话参数。

需要注意的一个问题是,当服务端有 N 台服务器时,客户端连接到同一台服务器的概率只有 1/N,所以在缓存中能查到这个 Session ID 的概率也只有 1/N。我们可以用两个方法来解决这个问题:

  1. 让同一个客户端每次都连接到同一个服务器,比如根据客户端 IP 地址来判断;
  2. 让多个服务器共享同一个会话缓存,可以让多个 Nginx 进程共享内存缓存,或者使用共享的 memcache 缓存服务等方式来实现;

会话 Ticket 恢复

会话 ID 恢复的一个挑战在于连接数量越多,服务端需要缓存的会话参数也越多,每个连接都会消耗内存、需要执行适当的缓存和清理策略。为了解决服务端 TLS 会话缓存的问题,可以使用客户端 TLS Ticket 缓存。

当客户端表明自己支持会话 ticket 功能时,服务端可以把自己的会话参数加密保存为一个只有服务端能解密的 ticket 数据返回给客户端。之后 ticket 由客户端存储,在后续会话中客户将自己的加密参数和 ticket 数据一起发送给服务端。因此,所有会话数据仅存储在客户端上,但 ticket 仍然安全,因为它是使用只有服务器知道的密钥加密的。

如何在Nginx上优化TLS配置以平衡并提升安全性与连接性能?

如果所有服务器都使用相同的 ticket 加密密钥,不管客户端将 ticket 数据发给哪个服务器,服务器都能将 ticket 解开。不好的消息是如果这个 ticket 加密密钥泄漏,所有 ticket 数据都可能泄漏,TLS 会话也可能暴露!

一个可行的做法是定期更新 ticket 密钥,比如每小时生成一个 ticket 密钥,然后部署到所有服务器上。

TLS 1.3

TLS 协议经过了多个版本的更新和增强,最新版本是 TLS 1.3。与之前的版本相比,TLS 1.3 在安全性和性能方面都有提升。

在第一次会话协商时,网络来回传输次数从 2 RTT 降低到了 1 RTT。如果客户端之前连接过服务端,TLS 1.3 甚至能做到 0 RTT。

如何在Nginx上优化TLS配置以平衡并提升安全性与连接性能?

二、配置示例

# Mozilla Guideline v5.7, nginx 1.17.7, OpenSSL 1.1.1k, modern configuration, no HSTS
# https://ssl-config.mozilla.org/#server=nginx&version=1.17.7&config=modern&openssl=1.1.1k&hsts=false&guideline=5.7
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    ssl_certificate /path/to/signed_cert_plus_intermediates;
    ssl_certificate_key /path/to/private_key;
    # TLS 会话缓存配置
    ssl_session_timeout 1d;
    # 会话 ID 共享内存缓存,1 mb 内存能缓存 4000 个左右的会话
    ssl_session_cache shared:MozSSL:10m;  
    # 会话 ticket 缓存
    ssl_session_tickets off;

    # 使用 TLS 1.3
    ssl_protocols TLSv1.3;
    ssl_prefer_server_ciphers off;

    # OCSP stapling
    ssl_stapling on;
    ssl_stapling_verify on;

    # verify chain of trust of OCSP response using Root CA and Intermediate certs
    ssl_trusted_certificate /path/to/root_CA_cert_plus_intermediates;

    # replace with the IP address of your resolver
    resolver 127.0.0.1;
}

三、参考

延展阅读:

MongoDB 4.0至7.0:这些主版本更新带来了哪些关键特性与性能飞跃?

如何在Web开发中安全有效地解决电商网站的跨域资源共享(CORS)问题?

CAP理论与Raft协议如何在分布式系统中确保一致性和可用性?

咨询方案 预约演示                        
(1)
研发专家-leo研发专家-leo
上一篇 2024年7月5日 上午11:14
下一篇 2024年7月5日 下午3:21

相关推荐