# win-acme 教程：Windows IIS 免费申请 Let's Encrypt 证书

> 用 win-acme（wacs.exe）为 IIS 申请 Let's Encrypt 免费证书：交互式和无人值守配置、HTTPS 绑定、计划任务自动续期、ARI 和 DNS 验证。

Source: https://ssl.sh/zh/guides/win-acme/
Last updated: 2026-11-10

win-acme（wacs.exe）是 Windows 上的 ACME 客户端，运行一次就能为 IIS 网站申请 Let's Encrypt 证书、添加或更新 HTTPS 绑定，并创建每天运行的续期计划任务。适用于 Windows Server 2019、2022、2025 上的 IIS 10 和 win-acme 2.2.x（写作时官网提供的是 2.2.9.1，最新版本以 win-acme.com 为准）。

## 前提条件

win-acme 在 IIS 服务器上以管理员权限运行。

- 装有 IIS 的 Windows Server，网站有主机名为 `example.com`（需要的话还有 `www.example.com`）的 HTTP 绑定。
- 这些域名的 A/AAAA 记录指向服务器，例如 `203.0.113.10`；服务器在中国大陆的需已备案。
- 不用 DNS 验证时，Windows 防火墙和云服务器安全组放行 TCP 80、443。
- 服务器能访问 `acme-v02.api.letsencrypt.org`。

## 第一步：下载 win-acme

从 win-acme.com 下载 x64 的 trimmed 压缩包（需要 DNS 插件就下载 pluggable 版本），解压到固定目录，因为计划任务会指向这里：

```powershell
New-Item -ItemType Directory -Force C:\Tools\win-acme
Expand-Archive -Path $HOME\Downloads\win-acme.v2.2.9.1.x64.trimmed.zip -DestinationPath C:\Tools\win-acme
```

压缩包文件名按实际下载的版本修改。

## 第二步：交互式申请证书

交互式菜单会读取 IIS 里的网站和绑定，按提示选择就能完成申请和绑定。以管理员身份打开 PowerShell：

```powershell
cd C:\Tools\win-acme
.\wacs.exe
```

选择 **N: Create certificate (default settings)**，选中 IIS 网站和要包含的绑定（主机名），同意 Let's Encrypt 条款，邮箱可填可不填。win-acme 逐个域名通过 HTTP 验证，保存证书，为每个主机名在 443 端口添加带 SNI 的 HTTPS 绑定，并创建计划任务。

## 第三步（可选）：无人值守配置

批量部署时用命令行调用同样的插件：

```powershell
.\wacs.exe --source iis --siteid 1 --host example.com,www.example.com `
  --installation iis --accepttos --emailaddress admin@example.com
```

网站 ID 用 `Get-Website | Select-Object ID, Name` 查看。申请通配符或 80 端口不通时，在 pluggable 版本里加 DNS 验证插件，例如 Cloudflare 用 `--validation cloudflare --cloudflareapitoken <token>`，其他服务商的参数见 win-acme 命令行文档。

## 第四步：HTTP 跳转 HTTPS

win-acme 不会添加跳转规则。按 [IIS 安装 SSL 证书](https://ssl.sh/zh/guides/iis-ssl-certificate/) 里的 URL 重写规则配置，并保留 HTTP 绑定，跳转和以后的 HTTP-01 验证都需要它。

## 验证

配置正确时，网站返回 Let's Encrypt 证书，IIS 有对应的 HTTPS 绑定，任务计划里有 win-acme 的续期任务。用 [SSL 证书检查](https://ssl.sh/zh/tools/ssl-checker/) 检查网站，或在终端运行：

```bash
curl ssl.sh/example.com
```

在服务器上：

```powershell
.\wacs.exe --list
Get-WebBinding -Name "Default Web Site" -Protocol https
Get-ScheduledTask | Where-Object TaskName -like "win-acme*"
```

## 自动续期

计划任务默认每天 9:00 运行 `wacs.exe --renew`。证书在签发 55 天后续期（`RenewalDays`），Let's Encrypt 的 ARI 建议更早时提前续期（除非设置了 `RenewalDisableServerSchedule`），剩余有效期不足 7 天时无论如何都会续期。续期后 win-acme 会把 IIS 绑定更新为新证书。

不想等的话可以立即测试一次：

```powershell
.\wacs.exe --renew --force --test
```

`--force` 会真实申请一次证书，不要频繁使用。设置保存在 `wacs.exe` 同目录的 `settings.json`。Let's Encrypt 不再发到期提醒邮件，建议把网站加到 [ssl.sh 监控](https://ssl.sh/zh/monitor/)（开发中）。

## 常见问题排查

- **验证超时或连接失败**：80 端口不通（安全组、运营商封端口、未备案拦截）、解析不对，或跳转把验证请求送到了别的主机，原因和 [certbot 连接超时](https://ssl.sh/zh/errors/certbot-timeout-during-connect/) 相同。
- **验证地址返回 403**：IIS 的身份验证、URL 重写等功能拦截了 `/.well-known/acme-challenge/`，把这个路径排除掉。
- **CAA record prevents issuance**：见 [CAA 记录阻止签发](https://ssl.sh/zh/errors/caa-record-prevents-issuance/)。
- **续期任务从不运行**：创建任务的用户失去权限，或 win-acme 目录被移动，在主菜单 “More options → Manage scheduled task” 里重建，并查看任务计划程序的历史记录。
- **验证失败次数过多被限制**：重试太快，见 [Let's Encrypt 频率限制](https://ssl.sh/zh/errors/lets-encrypt-rate-limit/)，调试时加 `--test` 使用测试环境。
