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

> 在 Windows Nginx 配置 PEM 证书、TLS 1.2/1.3、HTTP/2、SNI 和 HSTS，并用握手测试替代“浏览器有小锁”的错觉。

**测试环境**

- 版本号: 26100.33650
- 版本: Standard / Datacenter
- 架构: x64
- 证据: E1
- 核验日期: 2026-10-29

## 一句话结论

Windows Nginx 读 **PEM 文件**，不读 Windows 证书存储：

```nginx
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

```nginx
server {
    listen 80;
    server_name lab.local;
    return 301 https://$host$request_uri;
}
```

所有名字的 HTTPS 都正常之前不要加 HSTS；HSTS 会被浏览器缓存。

## 响应头

```nginx
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 与多名字

每个证书/名字组一个 `server` 块。Nginx 按 SNI 选块；不发 SNI 的客户端拿 `default_server` 证书。

```nginx
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` 对不匹配名字直接关连接；不要拿某个站点的证书乱答。

## 验证

```powershell
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`）；
- 跳转到公网主机名，不是内部名。

> **警告: HTTP/2 不是 HTTP/3**
>
> `http2 on` 是 TCP 上的 HTTP/2。HTTP/3 是 QUIC/UDP，Windows Nginx 构建不提供。不要把 HTTP/2 站点标成 HTTP/3。

## 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。

## 来源

- [nginx — HTTPS 服务器](https://nginx.org/en/docs/http/configuring_https_servers.html)
- [nginx — SSL 模块](https://nginx.org/en/docs/http/ngx_http_ssl_module.html)
- [nginx — HTTP/2 模块](https://nginx.org/en/docs/http/ngx_http_v2_module.html)

---

来源页面: https://winbook.fyi/zh/server/web/nginx-tls/
