资讯动态

win-acme 实战:Windows 下自动申请与续期 Let‘s Encrypt 证书

发布时间:2026/10/14 3:48:25 来源:尧图企业网站定制
简介win-acme.v2.2.9.1701.x64.pluggable.zip 是一款面向 Windows 平台网站管理员与系统集成商的免费 SSL 证书自动化管理工具包主要解决从 Lets Encrypt 等机构申请、部署与续订证书时官方下载缓慢、手动配置繁琐的问题尤其适合需要为 IIS、nginx 等 Web 服务器快速启用 HTTPS 的中小站点运维人员。压缩包共 28 个文件约 35.58MB以 21 个 ps1 脚本和 2 个 bat 批处理为主覆盖 Exchange、RDS、Azure 应用代理、DNS 验证等多种导入与部署场景另含 wacs.exe 主程序、settings_default.json 配置、public_suffix_list.dat 域名列表及 Web_Config.xml 示例模板便于按需调用与二次调整。目前已有 376 人学习下载。借助这套脚本化组件读者可省去逐台手工签发证书的重复劳动直接复用现成的自动化导入流程并结合配置模板快速完成证书申请、更新与定时续订降低 HTTPS 改造的运维成本。1. 从一次证书过期事故说起win-acme 到底解决什么问题凌晨两点收到告警某台 Windows 上的业务站点证书过期浏览器直接红锁。登上去一看IIS 里那张证书还是半年前手动导入的续期提醒邮件躺在某个没人看的邮箱里。这种事故在中小团队里太常见了——不是不懂 HTTPS而是没人愿意每隔 90 天手动跑一遍申请、导出、绑定、重启的流程。win-acme 就是冲着这个痛点来的它是一个在 Windows 上运行的 ACME 客户端能自动向 Lets Encrypt 这类 CA 申请免费 SSL 证书并且把续期做成计划任务到期前自己换掉。标题里那个win-acme.v2.2.9.1701.x64.pluggable.zip是它的可插拔版本压缩包解压即用不需要装运行时。它适合谁适合在 Windows Server 上跑 IIS、同时又用 nginx 做前置反代的运维和开发尤其是那些不想为一张 DV 证书掏钱、又懒得写脚本的团队。下面我按自己拆包、跑通、踩坑的顺序把这份资源讲透。2. 拆包与运行模式pluggable 版和普通版差在哪拿到win-acme.v2.2.9.1701.x64.pluggable.zip之后第一件事不是双击 exe而是先搞清楚这个 pluggable 到底意味着什么。很多人下载完直接解压运行结果发现目录里一堆 dll 和插件文件夹跟网上教程截图对不上就开始怀疑包是不是坏的。其实这是 win-acme 从 v2.1 之后主推的架构核心程序只负责 ACME 协议交互和证书生命周期管理具体的证书怎么用交给插件去实现。IIS 绑定、Exchange、DNS 验证、文件导出全都是插件。普通版把这些插件预编译进主程序pluggable 版则拆成独立目录好处是升级插件不用动主程序坏处是初次配置时你得知道该启用哪个。2.1 目录结构与关键文件解压后典型结构是这样的不同小版本可能略有出入以实际为准路径作用wacs.exe主程序交互式向导和命令行入口settings.json全局配置首次运行后生成validation/域名验证插件如 http-01、dns-01installation/证书安装插件如 IIS、PEM 文件导出store/证书存储插件决定私钥放哪logs/运行日志排错第一现场我一般会先跑一次wacs.exe --version确认能正常启动再看--help里列出的插件列表。如果插件目录缺失主程序会提示找不到对应插件而不是静默失败这点比某些工具友好。2.2 交互式向导 vs 命令行win-acme 提供两种使用方式。交互式向导适合第一次配置它会一步步问你域名、验证方式、安装目标最后生成一个可复用的配置。命令行适合放进脚本或计划任务。我通常先用向导跑通一次把生成的参数记下来再改写成命令行固化。# 交互式向导按提示走 wacs.exe # 查看当前版本和插件加载情况 wacs.exe --version wacs.exe --help向导过程中最关键的一步是选择验证方式。如果你的域名解析在 Cloudflare、阿里云 DNS 这类支持 API 的服务商选 dns-01 最省事不需要开放 80 端口。如果域名直接指向这台 Windows 服务器且 80 端口可用http-01 更简单。选错验证方式会导致申请卡在 pending 状态日志里能看到 challenge 失败的记录。提示pluggable 版首次运行会在同目录生成settings.json里面记录了插件路径和默认参数。迁移服务器时把这个文件一起带走能省掉重新配置的功夫。3. 申请第一张证书http-01 验证的完整流程这一章把 http-01 验证从头走一遍因为它是理解 ACME 协议最直观的入口。http-01 的原理是CA 给你一个随机 token你把它放到http://你的域名/.well-known/acme-challenge/下面CA 从公网访问这个地址能读到正确内容就证明你控制了这个域名。win-acme 会自动帮你起一个临时监听、写文件、等验证、再清理你只需要保证 80 端口能从公网访问到这台机器。3.1 前置条件检查在跑申请之前先确认三件事。第一域名 A 记录已经指向这台服务器的公网 IP用nslookup 你的域名确认。第二Windows 防火墙放行 80 端口入站或者你的前置 nginx 已经把 80 转发过来。第三如果 IIS 占用了 80win-acme 的 http-01 插件需要能临时接管这个端口或者你改用 nginx 来响应 challenge。我遇到过 IIS 和 win-acme 抢 80 端口导致验证失败的情况日志里报 address already in use解决办法是让 nginx 统一监听 80把 challenge 路径反代给 win-acme 的临时端口。3.2 命令行申请与参数说明# 申请证书http-01 验证手动指定安装为 PEM 文件 wacs.exe ^ --target manual ^ --host example.com ^ --validation http-01 ^ --webroot C:\nginx\html ^ --store pemfiles ^ --pemfilespath C:\certs\example.com ^ --accepttos ^ --emailaddress opsexample.com逐段解释--target manual表示不自动绑定到 IIS手动指定域名--host是要签的域名多个域名用逗号分隔--validation http-01指定验证方式--webroot告诉 win-acme 把 challenge 文件写到哪个目录这里指向 nginx 的站点根目录前提是 nginx 配置里/.well-known/acme-challenge/能直接映射到该目录--store pemfiles表示把证书和私钥导出成 PEM 格式方便 nginx 使用--pemfilespath是导出路径--accepttos同意 CA 服务条款--emailaddress用于到期提醒和账户恢复。跑完之后C:\certs\example.com下会出现几个文件example.com-chain.pem证书链、example.com-key.pem私钥、example.com-crt.pem纯证书。nginx 里这样引用server { listen 443 ssl; server_name example.com; ssl_certificate C:/certs/example.com/example.com-chain.pem; ssl_certificate_key C:/certs/example.com/example.com-key.pem; location / { proxy_pass http://127.0.0.1:8080; } }注意 Windows 路径在 nginx 配置里用正斜杠反斜杠会被当转义符。改完nginx -t测试再nginx -s reload。3.3 验证结果与日志排查申请成功后win-acme 会在logs/下写一条记录包含证书指纹和到期时间。如果失败先看日志最后 20 行常见错误有三类DNS 解析不到A 记录没生效或 TTL 没到、连接超时防火墙或安全组没放行 80、challenge 内容不匹配webroot 路径配错或者 nginx 有 rewrite 规则把.well-known请求重定向了。我一般会在申请前手动curl http://example.com/.well-known/acme-challenge/test确认路径可达虽然文件不存在会返回 404但至少证明请求能打到正确目录而不是被重定向到首页。4. 自动续期与 nginx 联动把 90 天变成无感证书签下来只是开始真正省心的是续期。Lets Encrypt 的证书有效期 90 天win-acme 默认会在到期前 30 天尝试续期。你要做的是把它挂到 Windows 计划任务里并且让续期后 nginx 自动加载新证书。4.1 创建续期计划任务# 手动触发一次续期检查--renew 只续快到期的 wacs.exe --renew --force # 查看当前所有证书的到期状态 wacs.exe --list--renew会遍历所有已配置的证书只对进入续期窗口的执行申请。--force是强制立即续测试用正式环境别加否则可能触发 CA 的频率限制。正式做法是在计划任务里每天跑一次wacs.exe --renew让它自己判断。用schtasks创建任务schtasks /create /tn win-acme renew /tr C:\win-acme\wacs.exe --renew /sc daily /st 03:00 /ru SYSTEM/ru SYSTEM让任务以系统账户运行避免用户未登录时不执行。时间选凌晨低峰减少对业务的影响。4.2 续期后让 nginx 重载win-acme 支持在证书更新后执行自定义脚本。在settings.json里找到对应证书的配置加上Script和ScriptParameters或者在命令行用--script指定。我一般写一个简单的 batecho off C:\nginx\nginx.exe -s reload echo %date% %time% nginx reloaded C:\certs\reload.log然后在 win-acme 的安装插件配置里指向这个 bat。这样每次证书文件被覆盖后nginx 会自动重新读取不需要人工介入。注意脚本要以能访问 nginx 安装目录的账户运行SYSTEM 账户通常没问题但如果 nginx 装在用户目录下可能会权限不足。4.3 续期失败的常见原因续期失败比首次申请更隐蔽因为没人盯着。最常见的是验证方式依赖的东西变了比如 http-01 依赖的 webroot 目录被清理了或者 dns-01 用的 API Token 过期了。其次是磁盘满了导致写不进新证书。还有一种情况是 CA 端的速率限制——同一个域名一周内重复申请次数过多会被临时封禁。我习惯在计划任务里加一个失败告警win-acme 本身支持--notification参数发邮件配置好 SMTP 就能在续期失败时收到通知比等证书过期强。5. 避坑与排查那些让我返工三次的细节这一章集中讲我踩过的坑每条按现象、原因、解决来写你对照自己的环境看有没有中招。现象一申请时报 No validation plugin found for http-01。原因pluggable 版的插件目录没被正确加载可能是解压时杀软把某个 dll 隔离了或者目录层级不对。 解决检查validation/下是否有http-01相关文件重新解压并给目录加杀软白名单。用wacs.exe --help确认插件列表里能看到 http-01。现象二验证一直 pending日志显示 challenge file not found。原因webroot 路径配错或者 nginx 的 location 规则把.well-known请求拦截了。常见于用了伪静态规则、把所有请求 rewrite 到 index.php 的站点。 解决在 nginx 里为/.well-known/acme-challenge/单独加一条 location优先级高于其他规则直接指向 webroot 目录不做任何 rewrite。现象三证书申请成功但浏览器仍报不受信任。原因nginx 只配了ssl_certificate没配ssl_certificate_key或者引用了错误的文件——比如把-crt.pem当成了-chain.pem。-crt.pem只有站点证书缺少中间 CA浏览器无法构建完整信任链。 解决ssl_certificate必须用-chain.pem它包含站点证书加中间证书。用openssl s_client -connect example.com:443 -showcerts检查返回的证书链是否完整。现象四续期任务跑了但证书没更新。原因计划任务以 SYSTEM 运行但 win-acme 的配置和证书路径在某个用户目录下SYSTEM 无权访问或者--renew判断还没到续期窗口直接跳过了。 解决把 win-acme 和证书目录放在所有账户都能访问的路径比如C:\win-acme和C:\certs。用wacs.exe --list确认到期时间如果确实在窗口内还没续加--verbose看详细日志。现象五dns-01 验证时 API 报 403。原因DNS 服务商的 API Token 权限不足或者 Token 绑定的 IP 白名单不包含这台服务器。 解决确认 Token 有目标域名的 DNS 编辑权限检查服务商控制台的白名单设置。有些服务商的 Token 区分全局和单域名用错类型也会 403。注意win-acme 的配置里会保存 DNS API 的密钥settings.json要按敏感文件对待别提交到代码仓库。6. 进阶用 PEM 导出配合多站点与通配符走到这里基础的申请和续期已经能跑了。最后说一个我实际用得最多的技巧用 PEM 导出插件配合 nginx 的多站点和通配符证书。很多团队有十几个子域名每个都单独签一张证书管理起来很累用一张通配符证书*.example.com覆盖所有子域名续期一次全搞定。通配符只能用 dns-01 验证因为 http-01 无法验证*.example.com这种泛域名。配置通配符的命令行大致是这样wacs.exe ^ --target manual ^ --host *.example.com ^ --validation dns-01 ^ --dnscreatescript C:\scripts\dns-add.bat ^ --dnsdeletescript C:\scripts\dns-del.bat ^ --store pemfiles ^ --pemfilespath C:\certs\wildcard ^ --accepttos ^ --emailaddress opsexample.com--dnscreatescript和--dnsdeletescript分别指向添加和删除 TXT 记录的脚本win-acme 会在验证前调用创建脚本、验证后调用删除脚本。脚本里用服务商的 API 添加_acme-challenge.example.com的 TXT 记录值从 win-acme 传入的环境变量或参数里取。这样即使服务商没有内置插件也能通过脚本接入。拿到通配符证书后nginx 里所有*.example.com的 server 块共用同一对 PEM 文件ssl_certificate C:/certs/wildcard/example.com-chain.pem; ssl_certificate_key C:/certs/wildcard/example.com-key.pem;新增子域名时只需要加 server 块证书不用动。续期时 win-acme 更新这两个文件所有站点同时生效。验证方法上我习惯在续期后跑一次openssl x509 -in C:/certs/wildcard/example.com-chain.pem -noout -dates看新的到期时间再curl -vI https://任意子域名确认握手用的证书指纹和文件一致。两步都过了才算续期成功。从那以后我每次配新站点都强制先跑一遍wacs.exe --list确认证书状态再动 nginx 配置——这个习惯帮我省掉了至少三次半夜被叫起来换证书的麻烦。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑