# Windows TLS 证书：win-acme、IIS 绑定与续期

> 用 win-acme 申请证书、绑定 IIS、为 Nginx 导出 PEM，并在旧证书过期前证明续期真的可用。

**测试环境**

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

## 一句话结论

Windows/IIS 上，**win-acme** 是实用的 ACME 客户端：

1. 申请/续期证书。
2. 装进 Windows 证书存储。
3. 绑定 IIS 站点。
4. 计划续期。
5. 在过期**之前**测续期。

Nginx 要导出 PEM（`fullchain.pem` + `privkey.pem`），续期后 reload。

## 安装 win-acme

下载 x64 zip，解压到 `C:\win-acme`，管理员运行 `wacs.exe`。第一次用交互菜单最稳：

- **N** 新证书；
- 手动输入或选 IIS 站点；
- 选站点/主机名；
- HTTP-01（80）或 DNS-01（通配/内网）；
- 存储：Windows store / PEM；
- 安装到 IIS；
- 创建续期任务。

CLI 形态（按你版本的 `wacs --help` 核对）：

```powershell
C:\win-acme\wacs.exe --target iis --host lab.example `
  --installation iis --store certificatestore
```

不要从旧博客直接粘 CLI 参数而不核对当前版本。

## 绑定 IIS

win-acme 装到 IIS 时会创建/更新 HTTPS 绑定。验证：

```powershell
Get-WebBinding -Name 'Lab' -Protocol https
netsh http show sslcert hostnameport=lab.example:443
```

SNI 用 hostname:port 绑定并保持 `SslFlags 1`。只绑 IP 无法在同一 IP 上服务多张证书。

## 为 Nginx 导出 PEM

Nginx 不读 Windows 存储。导出：

- 证书 + 中间证书为 `fullchain.pem`；
- 私钥为 `privkey.pem`；
- 私钥 ACL 只给服务账户 + Administrators。

然后：

```nginx
ssl_certificate     C:/nginx/certs/fullchain.pem;
ssl_certificate_key C:/nginx/certs/privkey.pem;
```

每次续期后 reload（`nginx -s reload`）；只换文件不 reload，旧证书还在内存里。

## 验证续期

```powershell
Get-ChildItem Cert:\LocalMachine\My |
  Where-Object Subject -like '*lab.example*' |
  Select-Object Subject,NotAfter,Thumbprint
```

确认续期任务存在且跑过。维护窗口做一次强制 dry run/续期。证书续了但没重新绑定，仍是故障。

> **警告: 不要等过期才测续期**
>
> 至少提前一个续期周期测。检查 DNS-01 凭据、HTTP-01 可达、IIS 绑定和 Nginx reload。

## 速率限制与通配

- Let’s Encrypt 有速率限制；不要循环失败验证。
- 通配必须 DNS-01；HTTP-01 不能签 `*.example.com`。
- DNS-01 凭据权限很大；最小权限保存。
- 内网名字拿不到公网证书；用内部 CA 或 Caddy `tls internal`（实验）。

## 实验室边界

E1。实验室 WAC 用自签名证书，没有跑 win-acme；命令是 Server 2025 上待验证的生产路径。

## 来源

- [win-acme](https://www.win-acme.com/)
- [win-acme — CLI 参考](https://www.win-acme.com/reference/cli)
- [Let's Encrypt — 验证类型](https://letsencrypt.org/docs/challenge-types/)

---

来源页面: https://winbook.fyi/zh/server/tls/certificates/
