☰
win-acme 实战:Windows 下 ACME 证书自动化续期与避坑指南
2026/10/31 17:03:23 网站建设 项目流程

简介:win-acme.v2.1.18-x64 是一款面向 Windows 平台网站运维者与个人站长的免费 SSL 证书申请与管理工具,基于 ACME 协议对接 Let's Encrypt,帮助用户在不付费的前提下完成证书申请、安装、自动续订与多域名(含通配符)管理,适合希望为站点启用 HTTPS 却不想承担证书开支的中小项目与个人开发者。资源包共 27 个文件,以 15 个 ps1 脚本和 4 个 dll 运行库为主,另含 json 配置、bat 批处理、xml 与 dat 数据文件及 wacs-x64.exe 主程序,压缩包约 29.58MB,脚本与配置分离,便于按需调整验证方式与续订策略。目前已有 336 人学习下载。借助其中的命令行与图形化入口、默认配置模板及日志机制,读者可快速搭建证书自动化流程,理解 HTTP/DNS 验证与速率限制等要点,减少手工维护成本。

1. 从一张快过期的证书说起:win-acme 到底解决什么问题

去年冬天,某公司运维同事在周五下班前发现官网 HTTPS 证书只剩三天有效期,续期脚本因为验证方式配置错误一直静默失败,最后只能临时手工签发一张证书顶上。这件事之后,我把 Windows 环境下的证书自动化重新梳理了一遍,win-acme 就是那轮梳理里留下来的工具。它是一款运行在 Windows 上的 ACME 客户端,用来向支持 ACME 协议的证书颁发机构申请、续期、部署证书,核心价值是把「申请—验证—安装—续期」这条链路做成可计划任务化的自动流程。适合谁?手里有 Windows Server、IIS 站点、Exchange 或自建网关,又不想为每张证书手工点一遍的人。免费域名证书的申请门槛不高,难的是长期稳定地自动续期,这正是它要解决的问题。

2. 拆开 win-acme 的申请链路:ACME 验证、账户与存储

2.1 ACME 协议在 Windows 上的落地方式

ACME 协议的核心是「证明你控制了这个域名」,然后由证书颁发机构签发证书。win-acme 把这件事拆成几个可配置的环节:账户注册、订单创建、域名验证、证书下载、后续部署。验证方式常见两种,一种是 HTTP-01,机构会访问http://你的域名/.well-known/acme-challenge/随机串,要求返回指定内容;另一种是 DNS-01,要求在域名下创建一条 TXT 记录。前者配置简单,但要求 80 端口对外可达;后者不依赖 80 端口,适合内网服务器或泛域名场景,代价是需要域名解析服务商的 API 凭据。

我一般会先判断站点是否直接暴露在公网。如果 IIS 站点本身就在公网 80 端口上,HTTP-01 是最省事的;如果前面有反向代理、CDN 或者服务器根本不出网,就老老实实走 DNS-01。这里有个容易被忽略的点:HTTP-01 验证时,win-acme 会临时写入验证文件到站点目录,如果你的站点根目录被改过、或者有 URL 重写规则把.well-known路径拦掉了,验证就会失败,而且报错信息往往只告诉你「验证超时」,不会直接指向重写规则。

账户方面,win-acme 会在本地保存 ACME 账户密钥,默认位置在程序目录下的配置文件夹里。这个密钥相当于你和证书机构之间的身份凭证,丢了不影响已签发证书的使用,但重新注册会多一次交互。我的习惯是把整个程序目录放在一个固定路径,比如C:\Tools\win-acme,不要放在桌面或临时目录,因为计划任务里引用的是绝对路径,路径一变任务就失效。

2.2 交互式与命令行两种用法怎么选

win-acme 提供交互式菜单和命令行参数两种模式。第一次接触建议先走交互式,把流程跑通,看清每一步在做什么;真正上线时改用命令行加计划任务,因为交互式没法无人值守。下面是一次典型的交互式启动:

# 进入程序目录后启动主程序,进入交互式菜单 cd C:\Tools\win-acme .\wacs.exe

启动后会看到菜单,依次选择「创建新证书」「手动输入域名」「选择验证方式」「选择证书存储位置」。每一步的选项都有编号,按提示输入即可。交互式的好处是它会把你选过的参数在最后汇总成一条等价命令行,这条命令行可以直接复制到计划任务里,省去自己拼参数的麻烦。

命令行模式的关键参数如下:

# 非交互式申请:域名、验证方式、证书存储、安装目标一次给全 .\wacs.exe --target manual --host example.com --validation filesystem --webroot C:\inetpub\wwwroot --store pemfiles --pemfilespath C:\Certs\example --installation iis

逐段说明:--target manual表示手动指定域名而不是从 IIS 绑定里自动读取;--host后面跟域名,多个域名用逗号分隔;--validation filesystem是 HTTP-01 的文件系统验证方式,配合--webroot指定站点根目录;--store pemfiles表示把证书存成 PEM 文件,--pemfilespath是输出目录;--installation iis表示签发后自动安装到 IIS 绑定。如果你的场景是 DNS-01,验证参数要换成对应的 DNS 插件,比如--validation route53之类,具体插件名以程序内置列表为准,不要凭记忆硬写。

提示:命令行参数在不同小版本之间偶有增减,升级程序后先用--help核对一遍,再改计划任务,别直接沿用旧脚本。

2.3 证书存储与部署目标的选择

证书签发出来只是第一步,存哪里、怎么让服务用上才是落地环节。win-acme 支持多种存储方式:PEM 文件、PFX 文件、Windows 证书存储。选择逻辑很简单——IIS 站点用 PFX 或直接装进 Windows 证书存储最顺;Nginx、Apache 这类需要证书文件和私钥文件的,用 PEM;如果还要给其他程序读取,PEM 目录更通用。

部署目标同理,--installation iis会自动找到对应站点并绑定,适合纯 IIS 环境;如果站点前面还有负载均衡,或者证书要分发到多台机器,就不要让 win-acme 直接装,改成只输出文件,再由配置管理工具分发。我见过一种翻车场景:多台服务器各自跑 win-acme 申请同一域名,结果因为验证文件互相覆盖、或者触发机构频率限制,导致部分机器续期失败。正确做法是只在一台机器上申请,证书文件同步到其余机器。

3. 把续期做成计划任务:参数、日志与验证

3.1 计划任务的正确建法

win-acme 本身不带常驻服务,续期靠 Windows 计划任务触发。程序提供了一个便捷参数--setup之类的引导,但更稳妥的是自己建任务,把触发时间、运行账户、命令行都控制清楚。常见做法是每天跑一次,程序内部会判断证书是否临近过期,没到期就跳过,不会重复申请。

# 计划任务里执行的续期命令:遍历所有已保存的续期配置 .\wacs.exe --renew --baseuri https://acme-v02.api.letsencrypt.org/

--renew表示对所有已记录的证书执行续期检查;--baseuri指定 ACME 服务地址,一般用默认即可,写出来是为了在切换测试环境时方便。运行账户建议用具有站点目录写权限的账户,不要用 SYSTEM 硬扛,因为 SYSTEM 在某些网络代理配置下行为不一致,排查起来很费劲。

建任务时几个参数值得注意:勾选「不管用户是否登录都要运行」,否则服务器注销后任务不执行;勾选「使用最高权限运行」,避免写证书存储时权限不足;「起始于」填程序目录,因为部分相对路径依赖工作目录。这三项任意一项漏掉,表现都是「任务显示成功但证书没更新」,属于典型的黑匣子问题。

3.2 日志在哪、怎么看

win-acme 默认会在程序目录下生成日志文件,按日期滚动。续期失败时,先看日志里最后一次验证请求的返回内容,再对照验证方式判断。常见日志关键词包括验证文件写入路径、HTTP 响应码、DNS 记录查询结果。如果日志里出现「挑战失败」但没细节,把日志级别调高再跑一次,通常能看到机构返回的具体原因。

我一般会在计划任务里把标准输出重定向到单独文件,双保险:

# 把本次运行的输出追加到自定义日志,便于和程序日志对照 .\wacs.exe --renew >> C:\Logs\wacs-renew.log 2>&1

这样即使程序内部日志被轮转掉,外部日志还能保留一份时间线。排查时先看外部日志的起止时间,再定位到程序日志对应时段,效率高很多。

3.3 验证续期是否真的生效

证书更新后,不要只看文件修改时间,要实际验证服务端返回的证书。最直接的办法是用浏览器或命令行查看站点证书的到期时间,确认已经变成新日期。命令行方式:

# 查看目标站点实际返回的证书有效期 openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null | openssl x509 -noout -dates

输出里的notAfter就是服务端当前使用的证书到期时间。如果文件已经更新但这个时间没变,说明部署环节没生效——可能是 IIS 没重新加载绑定,也可能是前置代理还在用旧证书。这种情况要回到部署目标那一环检查,而不是怀疑申请失败。

4. 避坑清单:五类高频翻车与排查路径

4.1 验证文件写入成功但机构访问不到

现象:日志显示验证文件已写入,但机构侧返回 404 或超时。原因通常是站点根目录与实际对外服务的目录不一致,或者存在 URL 重写、防盗链规则拦截了.well-known路径。解决:先用浏览器直接访问验证 URL 确认可达,再检查重写规则里是否放行了该路径;如果站点走 CDN,确认 CDN 回源配置没有缓存 404。

4.2 计划任务显示成功但证书没续

现象:任务历史里上次运行结果为成功,证书到期时间却没变。原因多为任务的工作目录不对、运行账户权限不足,或者程序判断「未到续期时间」直接跳过。解决:在任务命令行里显式加日志重定向,手动以相同账户执行一次,观察输出;确认续期阈值设置,默认是到期前若干天才会真正申请。

4.3 多台机器重复申请触发频率限制

现象:部分机器续期报错,提示请求过于频繁。原因:同一域名在多台服务器上各自跑申请,验证记录互相覆盖,且触发机构对同一域名的签发频率限制。解决:收敛到单点申请,证书文件通过共享目录或配置管理分发;确需多点的,改用 DNS-01 并确保各机器使用不同的账户或错开时间。

4.4 升级程序后旧参数失效

现象:升级 win-acme 后计划任务报「未知参数」。原因:命令行参数随版本调整,旧脚本里的参数名被移除或语义变化。解决:升级前备份程序目录和续期配置,升级后先手动跑一次--help对照,再改任务命令行;不要在生产任务里直接指向「最新版」目录,固定版本路径更稳。

4.5 私钥文件权限过宽

现象:证书能正常签发和使用,但安全扫描提示私钥可被普通用户读取。原因:PEM 输出目录继承了父目录的宽松权限,程序写入时没有收紧。解决:给证书目录单独设置 ACL,只允许运行 win-acme 的账户和服务账户读取;PFX 场景下注意导出时的密码保护,不要把空密码 PFX 放在共享目录。

5. 进阶:用 DNS-01 覆盖泛域名与内网场景

HTTP-01 够用,但遇到泛域名(*.example.com)或者服务器完全不出网时就不行了,这时要切到 DNS-01。它的原理是在域名下创建一条_acme-challenge的 TXT 记录,机构查询到这条记录即认为你控制域名。win-acme 通过 DNS 插件调用服务商 API 自动增删记录,插件在程序发布包里按服务商分类,选对应插件并填入 API 凭据即可。

配置时有两个参数要留意:一是记录传播等待时间,不同服务商生效速度差异很大,设太短会导致机构查询时记录还没生效,表现为「验证失败但记录明明存在」;二是凭据的存放位置,不要把 API 密钥写进计划任务命令行,明文会留在任务历史里,应该用程序支持的凭据文件或环境变量方式传入。

泛域名申请的命令行大致如下:

# 泛域名 + 主域名一起申请,走 DNS 插件验证 .\wacs.exe --target manual --host example.com,*.example.com --validation <插件名> --store pemfiles --pemfilespath C:\Certs\wildcard

--host里泛域名和主域名要分别列出,不能只写泛域名就指望覆盖主域名;--validation后的插件名以程序内置列表为准,填错会直接报「验证方式不存在」。签发完成后,建议用同样的openssl s_client方法验证泛域名在各子域上的实际返回,确认部署没有漏掉某个站点。

还有一个容易被低估的点:DNS-01 的 TXT 记录是临时的,程序验证完会删除。如果你在验证期间手动去解析控制台看,可能正好看到记录被删掉,误以为没创建成功。判断依据应该看日志里的创建和删除时间点,而不是控制台快照。

从那以后我每次上线新的证书自动化,都会先在一台非关键机器上把申请、续期、部署、验证四步完整走一遍,确认日志和实际证书时间对得上,再推到生产。证书这东西平时没人注意,出事就是全站不可用,多花半小时验证比事后救火划算得多。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询