Windows

win-acme 为 IIS 申请 Let's Encrypt 免费证书

作者: · 最后核实

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 版本),解压到固定目录,因为计划任务会指向这里:

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:

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

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

第三步(可选):无人值守配置

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

.\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 证书 里的 URL 重写规则配置,并保留 HTTP 绑定,跳转和以后的 HTTP-01 验证都需要它。

验证

配置正确时,网站返回 Let's Encrypt 证书,IIS 有对应的 HTTPS 绑定,任务计划里有 win-acme 的续期任务。用 SSL 证书检查 检查网站,或在终端运行:

curl ssl.sh/example.com

在服务器上:

.\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 绑定更新为新证书。

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

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

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

常见问题排查

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

常见问题

win-acme 必须开放 80 端口吗?

默认的 HTTP-01 验证需要:Let's Encrypt 会访问 80 端口上的 http://example.com/.well-known/acme-challenge/...。国内服务器 80 端口被封、域名未备案,或者要申请通配符证书时,改用 DNS 验证插件(pluggable 版本),支持的 DNS 服务商以 win-acme 文档为准。

证书有效期变短后,55 天续期还管用吗?

不一定,要检查设置。固定的 RenewalDays 默认值是按 90 天证书设计的,win-acme 也会遵循 ARI 建议、剩余不足 7 天时强制续期。在 2027 年 2 月 10 日 Let's Encrypt 默认改为 64 天之前,建议检查 settings.json 里的 RenewalDays 并保持 ARI 开启。默认值是否调整以 win-acme 发布说明为准。

win-acme 能对接 Let's Encrypt 以外的 CA 吗?

能。用 --baseuri 指定 CA 的 ACME 目录地址,CA 要求时再提供 EAB 外部账户绑定凭据。同时确认域名的 CAA 记录允许这家 CA。

资料来源

  1. win-acme
  2. win-acme: Getting started
  3. win-acme: Settings reference
  4. win-acme: Command line reference
  5. Let's Encrypt: Challenge Types