Windows Nginx TLS:证书、HTTP/2 与合理默认值
在 Windows Nginx 配置 PEM 证书、TLS 1.2/1.3、HTTP/2、SNI 和 HSTS,并用握手测试替代“浏览器有小锁”的错觉。
测试环境Standard / Datacenter · 版本号 26100.33650 · x64
E1- 版本号
- 26100.33650
- 版本
- Standard / Datacenter
- 架构
- x64
- 支持
- 文档(E1)
- 证据
- E1官方文档
- 核验日期
- 2026-10-29
- 页面类型
- 任务
Windows Nginx 读 PEM 文件,不读 Windows 证书存储:
server { listen 443 ssl; http2 on; server_name lab.local;
ssl_certificate C:/nginx/certs/lab.crt; ssl_certificate_key C:/nginx/certs/lab.key;
ssl_protocols TLSv1.2 TLSv1.3; ssl_session_cache shared:SSL:10m; ssl_session_timeout 1d;}把证书 + 私钥导出为 PEM(全链在前),限制私钥 ACL,用 nginx -t 测。
HTTP 跳 HTTPS
Section titled “HTTP 跳 HTTPS”server { listen 80; server_name lab.local; return 301 https://$host$request_uri;}所有名字的 HTTPS 都正常之前不要加 HSTS;HSTS 会被浏览器缓存。
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;add_header X-Content-Type-Options "nosniff" always;add_header Referrer-Policy "strict-origin-when-cross-origin" always;CSP 跟应用强相关;不要把随机 CSP 粘到每个站点。错的 CSP 会打挂应用,然后被删掉,什么也没学到。
SNI 与多名字
Section titled “SNI 与多名字”每个证书/名字组一个 server 块。Nginx 按 SNI 选块;不发 SNI 的客户端拿 default_server 证书。
server { listen 443 ssl default_server; server_name _; ssl_certificate C:/nginx/certs/default.crt; ssl_certificate_key C:/nginx/certs/default.key; return 444;}return 444 对不匹配名字直接关连接;不要拿某个站点的证书乱答。
cd C:\nginx.\nginx.exe -t.\nginx.exe -s reloadcurl.exe -I --resolve lab.local:443:127.0.0.1 https://lab.local/ -kopenssl s_client -connect 127.0.0.1:443 -servername lab.local -tls1_3检查:
- 证书 subject/SAN 匹配主机名;
- 不再提供 TLS 1.0/1.1;
- 协商 HTTP/2(
curl --http2显示HTTP/2); - 跳转到公网主机名,不是内部名。
Windows 证书注意
Section titled “Windows 证书注意”- Nginx 不读
Cert:\LocalMachine\My;先导出 PFX,再转 PEM/key。 - 私钥不要放 Web 根;ACL 只给 Nginx 服务账户 + Administrators。
- 续期必须
nginx -s reload,只换文件不重载不够。 - 自签名只用于实验;客户端要显式信任。
E1。实验室只在 8081 跑了 Nginx HTTP;TLS、SNI、HTTP/2 未在 Windows 复现。Server 2025 上用真实证书验证后再标 E2。