☰
win-acme:Windows 下自动部署与续期 Let‘s Encrypt 证书
2026/10/14 5:48:56 网站建设 项目流程

如果你手里有一台 Windows Server,想让网站从 HTTP 升级到 HTTPS,又不想花钱买证书,Let's Encrypt 基本是绕不开的答案。但问题在于,Let's Encrypt 官方推荐的开源客户端大多面向 Linux,Windows 上要么配置麻烦,要么对 IIS 的支持很弱。直到我用上了 win-acme,整个流程才算真正顺畅起来:下载解压、选择站点、自动申请证书、自动绑定 IIS、自动续期,几乎一条龙完成。

这篇文章我不打算给你搬运官方文档,而是把我自己在 Windows 服务器上一遍遍装 Let's Encrypt SSL 证书的真实过程、参数取舍和踩坑记录整理出来。内容覆盖从环境准备、win-acme 配置、IIS 绑定,再到自动续期和问题排查,适合刚开始折腾 HTTPS 的新手,也适合想把手动流程固化成自动运维的同行参考。

1. 为什么在 Windows 上更推荐用 win-acme

1.1 Let's Encrypt 的工作原理与 90 天有效期

先简单交代一下背景。Let's Encrypt 是一个免费、开放、自动化的证书颁发机构(CA),它通过 ACME 协议和服务器端程序完成“证明你拥有域名 -> 签发证书 -> 部署证书”的全流程。它的最大特点是证书有效期只有 90 天,要求你必须在过期前自动续期,否则证书一失效,用户的浏览器马上就会弹出不安全警告。

90 天设计看起来“反人类”,但其实是在倒逼你建立自动化机制。手动购买的传统证书有效期通常是一年甚至两年,很多人装完就忘,等到过期才发现。而 Let's Encrypt 用短周期强制你配置自动续期,反而让证书管理的稳定性更高。理解这一点非常重要,因为后面我们配置 win-acme 的自动计划任务,就是围绕 90 天这个周期来设计的。

1.2 win-acme 与其他 ACME 客户端的对比

市面上 ACME 客户端种类不少,最出名的可能是 Certbot,但 Certbot 的 Windows 支持一直不是它的强项,安装依赖复杂,而且对 IIS 的集成需要额外脚本。还有各种用 Python 或 Go 写的第三方客户端,功能虽然也能用,但遇到 IIS 站点绑定、证书存储、权限切换这些 Windows 特色问题时,往往需要你自己写一堆 PowerShell 去处理。

win-acme 的前身是 letsencrypt-win-simple,后来改名重构为 win-acme,定位非常纯粹:专门跑在 Windows 上的 ACME 客户端。它内置了多套“安装器”,可以直接识别本机 IIS 站点,自动创建 HTTPS 绑定,也能把证书导入到指定证书存储位置,供邮件服务、远程桌面或其他服务调用。这种“开箱即用”的集成度,是我选择它的核心原因。

1.3 win-acme 能解决什么问题

简而言之,win-acme 帮你完成了四件事:

  • 与 Let's Encrypt 服务器自动通信,完成域名验证和证书申请。
  • 在本地生成私钥和证书文件,并按照 Windows 习惯存入证书存储区。
  • 自动添加或更新 IIS 站点的 HTTPS 绑定,省去手动导入证书的步骤。
  • 通过计划任务实现每日自动续期检查,让证书在过期前自动更换。

对我这种不喜欢折腾的人来说,前三点能让我把精力放在正事上,第四点才是真正让人放心的关键。下面我会按实际操作的顺序,从准备工作开始,一步步带你走完整个流程。

2. 动手前的准备:环境检查与工具下载

2.1 准备条件清单

在下载 win-acme 之前,先把服务器和域名环境检查一遍,避免做到一半才发现缺条件。我把需要的项目列成了一张清单:

检查项要求说明
服务器系统Windows Server 2016/2019/2022,或 Windows 10/11win-acme 支持较新版本的 Windows,旧版本需要确认 .NET 环境
域名解析需要申请证书的域名必须已解析到该服务器公网 IP申请时会向 Let's Encrypt 验证域名所有权
端口可用性HTTP 验证需要 80 端口;TLS-ALPN 验证需要 443 端口端口被占用会导致验证失败
IIS 角色若网站运行在 IIS 上,需提前安装并启用 IIS 管理服务win-acme 的 IIS 安装器依赖 IIS 元数据库
管理员权限安装并运行 win-acme 需要本地管理员权限涉及证书存储和 IIS 绑定操作
邮箱地址用于接收证书到期提醒部分版本交互流程中会要求填写

这里尤其要提醒一点:HTTP 验证和 TLS-ALPN 验证都依赖公网能访问到你的服务器端口。如果你所在网络有防火墙、安全组或者运营商封锁了 80/443 端口,必须先解决外网访问问题。我在实际操作中遇到过一次客户机房只开放了 8080 端口的情况,最后只能改用 DNS 验证方式,这个后面专门讲。

2.2 下载与解压 win-acme

win-acme 的安装方式非常简单,它不需要传统意义上的“安装”,而是下载一个压缩包,解压后直接运行可执行文件即可。打开 win-acme 的官方项目主页,到 Releases 页面下载最新版本,文件名通常类似 win-acme.x.x.x.zip。

解压时建议放到一个固定路径,比如C:\win-acme,因为后续创建计划任务会持续调用这个目录下的程序,路径不稳定容易导致自动续期失败。解压后目录里主要有这些内容:

  • wacs.exe:主程序,交互式配置和命令行操作都靠它。
  • settings.json:默认配置文件,里面可以预设验证方式、安装方式等参数。
  • wwwroot:内置的一个简单验证文件目录,用于 HTTP 验证时的临时文件存放。
  • 其他 DLL 和资源文件:程序运行依赖库,不需要手动处理。

初次运行时,我建议直接双击wacs.exe进入交互菜单模式。这个交互界面虽然是英文的,但结构很清晰,核心菜单项包括:

菜单项含义
N创建新的证书申请
M管理现有证书
S设置或查看自动续期任务
R立即执行续期检查
Q退出

如果你是第一次使用,从 N 开始是最顺的。

2.3 初次运行的交互逻辑

选择 N 之后,win-acme 会问你打算给什么类型的站点申请证书。常见选项包括:

  • 直接从 IIS 站点中选取。
  • 手动输入域名(适用于非 IIS 服务,如 Tomcat、Nginx、自建程序)。
  • 从配置文件批量读取域名列表。

选“IIS 站点”是最省事的,它会自动列出本机所有 IIS 站点及其绑定域名,你只需要选中目标站点,程序就能读取到对应域名。如果你服务器上跑的不是 IIS,比如是某个 Java 应用或 Node 服务,那就选择手动输入域名,后面我会专门讲这种场景如何处理。

3. 核心实操:创建证书申请并绑定 IIS

3.1 选择域名验证方式:HTTP、TLS-ALPN 还是 DNS

win-acme 支持的验证方式不同,对应的适用场景也不一样,这一节值得仔细看,因为选错验证方式几乎是你遇到所有问题的根源。

验证方式原理适用场景注意事项
HTTP 验证在网站根目录放置随机验证文件,Let's Encrypt 通过 HTTP 访问确认域名控制权最常见的网站场景,80 端口可访问需要公网 80 端口可达,若站点本身就是 HTTPS 跳转环境要特别处理
TLS-ALPN 验证通过 443 端口的特殊 TLS 握手完成验证只开放 443 端口的环境要求 443 端口未被占用,不适合端口被复用的服务器
DNS 验证要求你添加一条 TXT 记录到域名 DNS 解析中通配符证书、服务器无法被公网访问、或 80/443 端口被封时支持手动添加和 API 自动添加,通配符场景必须用这个

我个人的习惯是:能走 HTTP 验证就走 HTTP,因为它最快最直观。但对于*.example.com这类通配符证书,Let's Encrypt 只接受 DNS 验证,这点没有商量的余地。如果你的域名 DNS 托管在支持 API 的平台上,win-acme 可以通过插件自动添加和删除 TXT 记录,实现全自动续期;如果不支持,那就只能选手动模式,每次续期时在弹窗提示下手工去 DNS 平台加一条记录,然后回来按回车继续。手动模式也能用,就是要记住在证书到期前收到通知后去操作一遍。

3.2 以 IIS 站点为例的完整申请流程

下面以最常见的场景走一遍流程:服务器上有 IIS 站点,域名是example.com,外网 80 端口正常开放。

第一步,在交互菜单输入 N,选择创建新证书申请。第二步,选择“IIS 站点”来源,win-acme 会枚举出本机的 IIS 站点列表。这里有可能会出现站点列表为空的情况,多数原因是 IIS 服务未启动,或者当前用户权限不足,需要确认 Windows 的 IIS 管理服务(W3SVC)处于运行状态,并且以管理员身份运行 wacs.exe。

选中站点后,win-acme 会自动识别站点绑定的域名,并问你确认要申请的域名列表。如果站点上绑定了多个域名,你可以勾选需要证书的那几个,也可以只选主域名。这里要注意一个原则:证书内的域名列表越少越好,因为证书域名越多,证书体积越大,握手时传递的信息也更多,对访问速度有那么一丁点影响。当然,如果你的站点本来就希望example.com和www.example.com都走 HTTPS,那就需要把两个域名都放进同一张证书里。

接着是选择验证方式,我选 HTTP。win-acme 会自动在 IIS 默认网站的根目录下创建.well-known/acme-challenge/临时目录并写入验证文件,验证完成后会自动清理。这个过程的底层逻辑非常简单:Let's Encrypt 服务器请求http://example.com/.well-known/acme-challenge/xxx,如果返回内容与预期一致,就证明对该域名有控制权。验证通过后,win-acme 会连接 Let's Encrypt 的 ACME 服务签发证书,并把证书安装到本机证书存储区。

3.3 安装证书到 IIS 站点

证书签发成功后,win-acme 会继续问你要不要安装到 IIS 站点。选择安装后,它会列出本机站点,让你指定要把 HTTPS 绑定加在哪个站点上。确认后,win-acme 会自动完成两件事:

  • 将证书导入到 Windows 本机证书存储(通常存放在“个人”证书存储区)。
  • 在目标 IIS 站点上创建或更新https类型的绑定,并关联到刚导入的证书。

整个过程中你不需要碰 IIS 管理器,也无需手动导出 PFX 再导入,这是 win-acme 相比其他客户端最舒服的地方。

这里有一个容易踩的坑:如果你的 IIS 站点已经存在一个 HTTPS 绑定,win-acme 会尝试替换成新证书。但如果你在 IIS 管理器里手动改过该绑定的主机名、IP 地址或端口,win-acme 判断绑定状态时可能会出现“未找到匹配绑定”的提示。遇到这种情况,我通常先到 IIS 管理器里把现有的 HTTPS 绑定删除,再重新执行 win-acme 的安装流程,让它重新创建绑定,成功率会高很多。

3.4 非 IIS 服务如何安装证书

如果服务器上跑的不是 IIS,而是 Tomcat、Nginx、私有化部署的 Web 程序,win-acme 依然可以申请证书,但“安装”步骤就不一样了。此时你需要在来源选择时用手动域名模式,验证完并拿到证书后,win-acme 会提供几个安装选项:

  • 导出为 PFX 文件。
  • 导出为 PEM 证书和私钥文件。
  • 安装到 Windows 证书存储区。

我一般选择导出 PEM 文件,因为 Nginx、Tomcat 这类服务最常用的就是.pem和.key格式。导出时 win-acme 会问你导出路径和密码,PFX 需要设置密码,PEM 不用。导出完成后,再根据你的 Web 服务配置去指定证书文件路径。需要特别注意,这类服务不会像 IIS 那样自动重载证书,所以每次续期完成后你都得手动重启服务或执行热加载操作,否则老证书会一直服务到进程重启为止。

4. 让证书“永不过期”:自动续期配置

4.1 为什么必须做自动续期

Let's Encrypt 证书有效期只有 90 天,过期前 30 天才能续期,也就是说每张证书的最佳续期窗口其实就一个月。如果全靠人工,那么每隔两个月就要手工操作一次,还要记住每个站点的到期时间,这既不现实也容易出错。

win-acme 的解决方案是在申请并安装证书后,询问你是否要创建计划任务,选“是”即可。它会默认创建一个每天运行一次的 Windows 计划任务,调用wacs.exe --renew检查所有已管理的证书,若发现距离到期日小于 30 天则自动执行续期。这种方式把“续期”变成了一个被动检查动作,每天跑一次,比单纯在到期前一周跑一次要稳妥得多。

4.2 计划任务的创建与验证

在 win-acme 交互流程的最后一步,选择创建计划任务。它默认会生成一个以 win-acme 命名的任务,触发器是每天凌晨的某个时间点。这里有两个细节值得注意:

  • 计划任务运行的用户账号必须有权限写入证书存储区和操作 IIS,因此通常要指定一个本地管理员账号。
  • 如果你的服务器晚上会关机,任务触发时间正好在关机时段,建议把触发时间改到白天工作时间,比如上午九点,确保任务能实际执行。

创建好计划任务后,可以手动验证一下。打开“任务计划程序”,找到对应的任务,点击“运行”,然后观察 win-acme 日志输出。如果没有报错,并且日志中显示续期检查完成,那就说明自动续期链路已经打通。

4.3 续期完成后的额外动作

证书续期意味着新证书替换旧证书,但对于 IIS 来说,win-acme 会同步更新绑定的证书指纹,所以 IIS 站点通常能自动生效。然而如果你用证书的是其他服务,比如远程桌面服务、邮件服务器、或者前面提到的 Nginx/Tomcat,那么续期完成之后还需要额外动作:

  • Nginx/Tomcat:复制新证书文件到部署路径,然后 reload 服务。
  • Windows 远程桌面:需要在服务属性里重新选择证书。
  • 邮件服务:需要更新证书库引用并重启服务。

win-acme 提供了“续期后运行脚本”的功能,你可以在配置里指定续期完成后执行一个 PowerShell 或批处理脚本,把复制文件和重载服务的操作自动化。这也是我在实际项目中比较推荐的做法:证书自动续期是一回事,“续期后有人把它用起来”是另一回事,两者必须同时成立,这才叫完整的自动化。

5. 常见问题与排查技巧实录

5.1 验证失败的几大原因

证书验证失败是新手遇到最多的报错。我把常见原因和排查顺序整理如下:

现象可能原因排查方法
验证 HTTP 文件无法访问80 端口被占用、防火墙拦截、网站在验证时强制跳转 HTTPS先在本机浏览器访问http://域名/.well-known/acme-challenge/测试文件,确认返回内容
TLS-ALPN 验证失败443 端口被其他程序占用、旧证书绑定影响握手用 `netstat -ano
DNS 验证失败TXT 记录未生效、域名托管平台解析延迟在命令行执行nslookup -type=TXT 域名确认 TXT 记录是否出现在 DNS 中
403 或 404 错误IIS 默认文档配置、权限设置导致验证文件无法访问检查站点目录是否允许静态文件匿名访问,关闭 URL 重写中的强制跳转规则

有一个很容易被忽略的点:如果站点配置里开启了 HTTP 到 HTTPS 的强制跳转,Let's Encrypt 在请求验证文件时会被 301 重定向到 HTTPS,而验证服务器通常会拒绝跟随重定向,导致验证失败。解决办法是在验证期间暂时关闭跳转规则,等证书申请完成后再打开。win-acme 部分新版本已经能应对这种场景,但老版本遇到这个问题确实很头疼,我的习惯是申请证书前先检查一遍 URL 重写规则。

5.2 IIS 绑定未更新或证书不生效

证书续期成功后,IIS 绑定没换成新证书,是另一个高频问题。通常表现在:访问网站并没有报证书错误,但看了看证书到期时间还是旧日期。这种情况多半是 IIS 没有正确刷新绑定信息。

我的处理流程:

  1. 打开 IIS 管理器,确认站点 HTTPS 绑定中的证书是否已变为新证书。
  2. 如果没变,执行iisreset重启 IIS,或重启 W3SVC 服务。
  3. 确认 win-acme 安装步骤中确实选择了该站点,而不是装到了别的站点上。

这里多说一句,如果你服务器上有多个 IIS 站点共用同一个 IP 和端口,HTTPS 绑定的主机名必须与证书域名完全匹配。否则浏览器会报“证书名不匹配”的警告,即使证书本身是有效的也没用。这种多站点共用端口的情况,建议给每个站点单独绑定独立主机名,并确保证书包含对应的域名。

5.3 计划任务运行失败或续期静默失败

计划任务每天在跑,但你并不能每次都盯着它。我的做法是定期查看 win-acme 的日志目录,里面通常有一个.log文件记录了每次运行的详细输出。

如果发现任务显示“运行成功”但没有实际续期,先检查证书距离到期是否超过 30 天。Let's Encrypt 政策规定证书到期前 30 天内才能续期,如果你刚申请完证书去手动运行--renew,程序会告诉你“尚未到期”,这是正常行为,不是故障。

另一个值得警惕的场景是:DNS 验证的 TXT 记录依赖手动添加时,如果续期时 DNS 解析平台变化或记录设置方式变了,win-acme 会一直卡在等待 DNS 生效的交互提示,而计划任务模式下无人点按回车,导致续期失败。这种情况下建议改用支持 API 的 DNS 插件,或者修改策略为每 20 天自动提醒你手动介入,至少留出足够的缓冲时间。

6. 额外补充:多域名、通配符证书与安全加固

6.1 多域名与通配符证书的实际选择

在配置证书之前,先想清楚你到底需要单域名证书、多域名证书还是通配符证书。

  • 单域名证书:只覆盖example.com或www.example.com其中一个,最简单。
  • 多域名证书:同时覆盖多个域名,适用于一台服务器上有多个不同域名但想共用一张证书的场景。
  • 通配符证书:覆盖*.example.com和example.com,适合子域名数量多且不确定的情况。

通配符证书虽然方便,但只能用 DNS 验证,而且因为私钥要同时保护所有子域名,泄露风险相对更高。如果不是子域名特别多,我通常都推荐用多域名证书而不是无脑上通配符。

6.2 证书私钥类型的选择

win-acme 在申请时会让你选择密钥算法,常见的是 RSA 和 ECDSA。RSA 兼容性最好,几乎所有客户端都支持;ECDSA 密钥更短、握手性能更好,但少数老旧的客户端兼容性差一些。

我的做法是:公网面向普通用户的网站,优先使用 ECDSA;如果网站需要兼容很老的操作系统或浏览器,那就退回 RSA 2048。win-acme 也支持同时生成两种密钥,把两张证书都装上,由服务器协商选择用哪一个,但 IIS 场景配置起来稍显复杂,一般人不需要这么做。

6.3 安全加固建议

证书装上之后不能就完事了,还有一些和 SSL/TLS 相关的安全项值得顺手处理:

  • 关闭 SSLv3、TLS 1.0 和 TLS 1.1 协议,只保留 TLS 1.2 和 TLS 1.3,这些旧协议都已被业界认定不安全。
  • 配置 HSTS 响应头,让浏览器强制使用 HTTPS 访问,避免中间人劫持。
  • 在 IIS 的 URL 重写模块中设置 HTTP 自动跳转到 HTTPS,保持用户访问的稳定性。

这些操作在 IIS 管理器的“SSL 设置”和相关配置项里都能完成。不过要注意,HSTS 一旦启用,后续如果你在测试环境想临时退回 HTTP 访问,浏览器会拒绝,所以建议先在实验环境验证再上生产。

7. 我的实操心得与建议

最后分享几个我在反复装证书过程中沉淀下来的个人经验,不一定都写进官方文档,但非常实用。

第一,下载 win-acme 后先看一眼版本和依赖环境。新版需要较高的 .NET 运行时,如果服务器为了稳妥一直没更新系统补丁,可能跑不起来。遇到双击没反应的情况,先看 Windows 事件查看器里的 .NET 运行时错误,别急着换电脑。

第二,申请证书前备份一下当前 IIS 的配置。一个是导出站点配置,另一个是把现有的 HTTPS 证书追踪好来源。因为 win-acme 自动更新绑定可能会覆盖掉你之前手动配置的内容,如果出了问题,恢复配置比重新排查快得多。

第三,每次证书续期后,记得用手机流量访问一次网站,确认证书链完整、没有告警。因为你在内网测可能走了代理或缓存,结果不准。手机流量能真实模拟公网用户看到的证书状态。

第四,把 win-acme 的日志保留时间调长一点。默认日志可能只保留最近几次运行记录,万一你想追查一个月前的续期问题,日志已经被覆盖了。在settings.json里可以调整保留策略。

第五,如果这台 Windows 服务器上同时跑了多个 Web 服务,尽量让 win-acme 管好 IIS 的那部分,其他服务通过导出文件的方式人工部署。混在一起自动安装,很容易搞混证书到底装在了哪里,排查起来非常费劲。

按这套流程走下来,从零到跑通自动续期只需要十几分钟。后面你基本不用再操心证书的事情,顶多是偶尔看看日志和计划任务状态。如果你在操作中遇到什么奇怪的问题,先照着第 5 节的排查表对一遍,大部分情况都能自己解决。

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

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

立即咨询