skip to content
w00d1f

nginx网站升级http3

/ 6 min read

Table of Contents

HTTP2 的网站配置

server {
# 监听IPv4 443端口,并使用SSL/TLS(HTTPS)协议进行加密通信
listen 443 ssl;
# 同上,只是增加了IPv6
listen [::]:443 ssl;
# 启用HTTP2,注意在1.25.1版本后,启用HTTP2不需要在listen行中增加http2参数,可以作为单独的指令使用
http2 on;
# 规定SSL协议版本,禁用SSL v3.0,TLS v1.0 及 v1.1
ssl_protocols TLSv1.2 TLSv1.3;
# 规定TLS加密算法,排除弱加密算法
ssl_ciphers TLS13_AES_128_GCM_SHA256:TLS13_AES_256_GCM_SHA384:TLS13_CHACHA20_POLY1305_SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305;
# 优先使用服务器端加密算法,而不是客户端偏好,保证安全性与算法性能
ssl_prefer_server_ciphers on;
# 全链证书文件路径
sl_certificate /path/to/fullchain.crt;
# 证书相匹配的私钥文件路径
ssl_certificate_key /path/to/private.key;
# 该Server配置响应的域名,如匹配上,则使用此Server块配置
server_name host.example.com;
# “/”表示匹配所有访问该Server下的URL
location / {
# 网站根目录路径
root /path/to/website
}
}

HTTP3 的网站配置

在 HTTP2 配置不变的基础上,再增加一些配置即可。

server {
# HTTP2配置不变,这里省略不写
# 注意HTTP3底层不再是TCP协议而是UDP协议,因此不存在端口竞争,不是必需在listen中使用reuseport参数,
# 但使用了后允许多个Worker共享端口,显著提高并发性能与负载均衡效率
# 在IPv4 443上监听QUIC(HTTP3)协议
listen 443 quic reuseport;
# 同上在IPv6上监听
listen [::]:443 quic reuseport;
# 启用HTTP3
http3 on;
# 启用 QUIC 地址验证功能。这包括在重试数据包或 NEW_TOKEN 帧中发送新令牌,以及验证在初始数据包中收到的令牌。
quic_retry on;
# 启用分段卸载以优化的批处理模式启用发送。
# GSO(Generic Segmentation Offload)是一种内核特性,允许应用程序(Nginx)将大的数据块一次性提交给内核,由内核在发送时进行分段。
# 这减少了内核与用户空间之间的交互,并减轻了 CPU 负载,从而提高 QUIC 性能。
quic_gso on;
# 增加协议切换告知头: Nginx 在响应客户端(通过 TCP/HTTP/2 连接)时,返回这个 HTTP 头部。
# 它告诉兼容的客户端:“我在这个端口上(:443)也支持 HTTP/3 (h3),有效期是 86400 秒。”
# 客户端收到后,会尝试切换到更快的 QUIC/HTTP/3 连接。
add_header Alt-Svc 'h3=":443"; ma=86400';
# 增加 启用 HSTS (HTTP严格传输安全) 头:
# Strict-Transport-Security 头部要求浏览器在接下来的 31536000 秒(一年)内,只能通过 HTTPS 访问该网站,即使输入的是 http://。
# includeSubDomains 适用于所有子域名,preload 表示希望被加入浏览器内置的 HSTS 列表中(需要单独提交)。
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
# 启用 TLS 0-RTT (零往返时间):
# 这是 TLS 1.3 的一个功能,允许客户端在第一个连接数据包中发送应用数据(在 QUIC 中体现为 Initial 数据包),从而显著加快后续访问的加载速度。
ssl_early_data on;
}

抗量子

量子计算机的出现,对现在的加密算法是一个威胁,现在不可被破解的加密,在量子计算机上则可以被破解。TLS 证书加密的 HTTPS 连接在量子计算机环境下也变得不再安全。攻击者可以先存储现在的加密流量,等若干年后,量子计算机问世,再进行解密存储的流量。要解决这个问题,一方面是在 TLS 证书上改用抗量子的算法,但现在各大证书商尚未支持。现阶段的折中做法是混合加密,在 X25519 等经典算法基础上混合抗量子算法,即使未来量子计算机攻破了经典算法,但信息是经过双重混合加密的,抗量子算法无法被攻破,则信息仍然是安全的。

在 Nginx 中配置抗量子加密,注意服务端的 Nginx 与 OpenSSL 版本,抗量子只在 OpenSSL 大于 3.5 的版本中可用。

server {
# 其他TLS配置不变,只需要增加一行
# 定义 Nginx 在 TLS 握手过程中,用于进行密钥交换的 椭圆曲线列表,按偏好顺序排列。
# X25519MLKEM768 混合后量子算法 将经典的 X25519(高性能椭圆曲线)与 ML-KEM-768(基于格的后量子算法)结合
# X25519 现代椭圆曲线 它比传统曲线(如 prime256v1)更快、更安全、实现更简单,是目前最受欢迎的选择
# prime256v1 传统 NIST 曲线 这是美国国家标准与技术研究院 (NIST) 推荐的曲线之一,也称为 P-256
# secp384r1 高强度 NIST 曲线 也称为 P-384,比 P-256 提供更高的安全级别,但计算开销也更大
ssl_ecdh_curve X25519MLKEM768:X25519:prime256v1:secp384r1;
}