跳转到内容

Windows Nginx TLS:证书、HTTP/2 与合理默认值

核验于 1 分钟阅读

在 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 测。

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 会打挂应用,然后被删掉,什么也没学到。

每个证书/名字组一个 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 reload
curl.exe -I --resolve lab.local:443:127.0.0.1 https://lab.local/ -k
openssl 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);
  • 跳转到公网主机名,不是内部名。
  • 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。

来源