ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Windows宝塔HTTPS自动续期:win-acme+阿里云DNS实战方案

Windows宝塔HTTPS自动续期:win-acme+阿里云DNS实战方案 1. 为什么 Windows 上的 HTTPS 证书续期成了“定时闹钟”在 Windows 环境下用宝塔面板建站HTTPS 证书续期这件事我踩过太多坑。不是凌晨三点被 Let’s Encrypt 的邮件惊醒就是早上打开网站发现浏览器弹出“不安全”警告——而你翻日历才发现证书昨天刚过期。90 天手动换一次听起来像给服务器装了个倒计时炸弹每三个月就得手动走一遍“申请→验证→下载→替换→重启服务”的流程中间漏一步全站 HTTPS 就断线。更麻烦的是Windows 下的宝塔面板本身不原生支持 ACME 协议自动续签不像 Linux 版本有内置的 Let’s Encrypt 插件很多用户以为装了宝塔就万事大吉结果证书一到期连后台登录都提示证书错误。这背后其实是个典型的“环境错配”问题Let’s Encrypt 的 ACME 协议设计初衷是面向自动化、无交互的服务器环境它要求域名验证必须能被外部 CA 服务器实时访问并完成挑战HTTP-01 或 DNS-01。而 Windows 宝塔的组合天然缺少 Linux 那套成熟的 cron shell OpenSSL 自动化链路。HTTP-01 在 Windows 上常因端口占用、IIS 冲突、防火墙拦截或反向代理配置混乱而失败DNS-01 则需要调用云厂商 API 动态修改 DNS 记录对权限控制、API 密钥管理、网络连通性都提出更高要求——但恰恰是这条路最稳定、最可靠、最不受 Web 服务状态影响。win-acme 就是为 Windows 而生的 ACME 客户端。它不是简单把 certbot 移植过来而是深度适配 .NET 运行时、Windows 服务机制、PowerShell 管理接口和 Windows 证书存储Cert Store。它支持插件式验证器其中阿里云 DNS 插件acme-dns-aliyun能直接读取你的阿里云 AccessKey调用 Alibaba Cloud OpenAPI在几秒内完成 _acme-challenge TXT 记录的创建与删除。整个过程完全脱离 Web 服务状态哪怕你的网站宕机、Nginx 崩溃、宝塔面板打不开只要 DNS 解析正常、API 权限有效证书照样能续上。所以“告别 90 天手动换证书”不是一句口号而是一套可落地的闭环用 win-acme 承担 ACME 协议交互用阿里云 DNS 实现免服务依赖的域名验证用 Windows 任务计划程序触发定时执行最后由宝塔面板接管证书文件更新与服务重载。它解决的不是“能不能续”而是“续得稳不稳、省不省心、出不出错”。适合所有在 Windows Server 或 Win10/Win11 上用宝塔搭生产环境、又不想天天盯着证书有效期的中小站长、内部系统管理员、开发测试负责人——尤其当你同时维护 3 个以上子域名、或证书绑定在多个不同站点时这套方案的价值会指数级放大。2. 整体架构设计与关键选型逻辑2.1 四层联动为什么必须是 win-acme 阿里云 DNS Windows 任务计划 宝塔这套方案不是把几个工具拼在一起而是按职责分层、环环相扣的工程设计。我画过不下十版流程图最终确认这四层缺一不可且顺序不能乱第一层ACME 协议执行者win-acme它是整个链条的“大脑”。负责生成密钥对、构造 ACME 请求、解析 Let’s Encrypt 的响应、处理挑战Challenge、下载证书、保存到指定路径。它不关心你怎么用证书只管“把证书搞到手”。选择 win-acme 而非 certbot-win 或其他 fork是因为它原生支持 Windows 服务安装、支持 Cert Store 导入、自带 GUI 和 CLI 双模式、文档清晰、社区活跃GitHub issues 响应快更重要的是——它的插件体系成熟阿里云 DNS 插件已通过 Let’s Encrypt 生产环境验证超 2 年稳定性远超 DIY 脚本。第二层域名验证通道阿里云 DNS这是“手脚”。DNS-01 挑战要求在_acme-challenge.yourdomain.com下添加一条 TXT 记录Let’s Encrypt 的验证服务器会查询该记录是否存在。win-acme 本身不操作 DNS它通过插件调用阿里云 OpenAPI。我们选阿里云不是因为它是国内最大而是因为它的 DNS API 权限粒度细可精确到单个域名、调用延迟低平均 200ms、错误码明确如InvalidDomainName、RecordAlreadyExists、SDK 官方维护及时。对比腾讯云 DNSPod其 API 文档中关于批量操作的说明模糊实测在高并发续签时偶发 503对比华为云 DNS其 AccessKey 管理界面藏得太深新手容易配错权限。阿里云控制台里新建一个 RAM 子用户、仅授予Alidns:DescribeDomainRecords和Alidns:AddDomainRecord权限5 分钟就能搞定这是决定方案能否快速落地的关键。第三层执行调度器Windows 任务计划程序这是“闹钟执行员”。Linux 用 crondWindows 就必须用 Task Scheduler。很多人试图用宝塔的计划任务Linux 版本才有或写个 PowerShell 脚本扔进开机启动结果要么权限不足无法读写 Cert Store要么触发时机不准比如设每天 2:00但证书只剩 1 天有效期时才该触发。正确做法是创建一个“触发器”为“每天 3:00”再加一个“条件”为“仅当计算机空闲时运行”最关键的是“设置”里勾选“如果任务失败每隔 10 分钟重试最多 3 次”。这样即使某天网络抖动导致第一次请求失败还有补救机会。任务动作必须设为“启动程序”指向 win-acme.exe并传入完整参数后面详述而不是用“启动脚本”——因为 PowerShell 的执行策略ExecutionPolicy在不同 Windows 版本下差异极大极易因Restricted策略导致脚本被拒。第四层证书应用层宝塔面板这是“最后一公里”。win-acme 把证书存到C:\certs\yourdomain.com\下但宝塔不认识这个路径。我们必须让宝塔“感知”到新证书。宝塔 Windows 版虽无原生 ACME 支持但它提供了完整的 API 接口http://127.0.0.1:8888/api/ssl和命令行工具bt。最佳实践是在 win-acme 续签成功后自动调用宝塔 API 更新站点 SSL 配置并触发 Nginx/Apache 重载。这比手动复制.pem文件到宝塔目录再点“设置”按钮少了 7 步人工操作且杜绝了文件权限错误Windows 下 NTFS 权限常导致宝塔读不到证书。提示不要试图绕过宝塔直接改 Nginx 配置文件。宝塔的配置文件是动态生成的手动修改会被下次“网站设置”操作覆盖。必须走宝塔 API 或bt命令这是唯一受控路径。2.2 为什么不用 HTTP-01DNS-01 的三个硬优势曾有客户坚持要用 HTTP-01理由是“不用配 API 密钥更简单”。我陪他折腾了两天最终还是切回 DNS-01。原因很实在Web 服务状态零依赖HTTP-01 要求 Let’s Encrypt 的验证服务器能从公网访问http://yourdomain.com/.well-known/acme-challenge/xxx。这意味着你的 Web 服务必须在线、80 端口必须开放、反向代理如 Nginx必须正确转发该路径、防火墙不能拦截、CDN 不能缓存该路径否则返回 404。而 DNS-01 只需 DNS 解析生效哪怕你整个服务器断网只要 DNS 记录能被全球递归 DNS 查询到验证就成功。我遇到过最极端案例客户服务器因机房停电宕机 12 小时DNS-01 续签照常完成恢复供电后网站 HTTPS 直接可用。多域名、泛域名支持无死角HTTP-01 对每个域名都要单独起一个 Web 服务监听win-acme 在 Windows 下要为每个域名开一个临时 HTTP 服务端口冲突概率高尤其当 IIS、SQL Server Reporting Services 占用 80/443 时。DNS-01 则统一操作 DNS 记录-d example.com -d www.example.com -d api.example.com -d *.example.com一行命令全搞定TXT 记录名自动按域名生成_acme-challenge.example.com、_acme-challenge.www.example.com…互不干扰。调试成本低失败原因明确HTTP-01 失败时日志里常出现Connection refused、Timeout、404 Not Found你要逐层排查是 IIS 拦截了是宝塔 Nginx 的 location 规则没匹配是 CDN 缓存了是本地 hosts 文件写了假 IP而 DNS-01 失败日志里清清楚楚写着Failed to add DNS record: InvalidAccessKeyId或Domain not found in Aliyun DNS直指权限或域名配置问题5 分钟内就能定位修复。2.3 安全边界API 密钥怎么管才不裸奔阿里云 AccessKey 是敏感凭证绝不能明文写在 win-acme 配置文件里。我见过太多人把AccessKeyID和AccessKeySecret直接贴在settings.json中还上传到 GitHub——这是重大安全隐患。正确做法是创建独立 RAM 子用户如win-acme-bot不赋予任何 Console 登录权限只开通 API 访问为其附加自定义策略JSON 格式精确限定操作范围{ Version: 1, Statement: [ { Effect: Allow, Action: [ alidns:DescribeDomainRecords, alidns:AddDomainRecord, alidns:DeleteDomainRecord ], Resource: acs:alidns:*:*:domain/yourdomain.com } ] }注意Resource字段必须指定具体域名yourdomain.com不能写*防止该密钥被用于操作其他域名将 AccessKey 保存在 Windows 凭据管理器Credential Manager中名称设为AliyunDNS用户名填AccessKeyID密码填AccessKeySecretwin-acme 配置中验证器参数写成--validation aliased --validationname aliyun它会自动从凭据管理器读取无需暴露密钥。注意Windows 凭据管理器中的凭据只有当前 Windows 用户能读取。如果你用系统服务方式运行 win-acme必须确保服务以该用户身份登录否则读不到凭据。这也是为什么推荐用任务计划而非服务——任务计划默认继承用户上下文。3. 核心细节解析与实操要点3.1 win-acme 安装与初始化避开 .NET Framework 版本陷阱win-acme 依赖 .NET Framework但不同版本要求不同。官网最新版v2.2.3要求 .NET 6.0 Runtime而 Windows Server 2016 默认只有 .NET 4.6.2。直接双击安装会弹出“此应用无法在你的电脑上运行”。解决方案分三步先装运行时去 .NET 6.0 Runtime 官网下载页 下载windowsdesktop-runtime-6.0.x-x64.exex 为最新小版本号如 23必须选 Desktop Runtime不是 ASP.NET Core Runtime因为 win-acme GUI 需要 Windows Forms 支持静默安装以管理员身份运行 CMD执行windowsdesktop-runtime-6.0.23-x64.exe /quiet /norestart/quiet参数避免弹窗/norestart防止自动重启生产环境慎用验证安装运行dotnet --list-runtimes输出中应包含Microsoft.WindowsDesktop.App 6.0.x。安装完 win-acme 后首次运行不要直接点 GUI。先用命令行初始化强制指定配置目录避免默认路径含中文或空格导致后续失败win-acme.v2.2.3.1599.exe --baseuri https://acme-v02.api.letsencrypt.org/ --configfolder C:\win-acme\config --certificatestore My参数说明--baseuri指定 Let’s Encrypt 生产环境地址勿用 staging否则证书无效--configfolder显式指定配置目录为C:\win-acme\config路径全英文、无空格、无中文--certificatestore My告诉 win-acme 把证书存入当前用户的“个人”证书存储区Cert Store这是宝塔 Windows 版能识别的唯一位置。执行后会弹出交互式向导。关键步骤选择MManual input输入域名不要选WWeb root因为我们不用 HTTP-01验证方式选DDNS然后选AAliyun当提示输入 AccessKey ID 时直接留空回车——因为我们要用凭据管理器不是明文输入最后问是否保存配置选Y。此时C:\win-acme\config\settings.json里会生成基础配置但ValidationParameters部分为空这是正常的后续我们会用命令行覆盖。3.2 阿里云 DNS 权限配置最小权限原则实战RAM 子用户权限配置是成败关键。我见过最典型的错误是给了AliyunDNSFullAccess全局权限结果被安全审计打回。正确姿势是“最小权限 显式资源”。登录阿里云 RAM 控制台 → 创建用户 → 设置登录方式为“编程访问” → 创建成功后进入“权限管理” → “添加权限” → “自定义策略” → “脚本编辑”。粘贴以下策略将yourdomain.com替换为你的真实主域名{ Version: 1, Statement: [ { Effect: Allow, Action: [ alidns:DescribeDomainRecords, alidns:AddDomainRecord, alidns:DeleteDomainRecord ], Resource: [ acs:alidns:*:*:domain/yourdomain.com, acs:alidns:*:*:domain/yourdomain.com/record/* ] } ] }注意两点Resource第二项domain/yourdomain.com/record/*是必须的否则DeleteDomainRecord会因权限不足失败如果你有多个主域名如a.com、b.net必须为每个域名创建独立策略或合并为Resource: [acs:alidns:*:*:domain/a.com, acs:alidns:*:*:domain/b.net]绝不能写acs:alidns:*:*:domain/*。策略绑定后立即测试用该子用户的 AccessKey在 Postman 中调用阿里云 DNS OpenAPI 的DescribeDomainRecords接口Endpoint:https://alidns.aliyuncs.com传入DomainNameyourdomain.com应返回 JSON 列表。成功即证明权限到位。3.3 宝塔面板对接API 调用与证书热更新宝塔 Windows 版的 SSL API 文档极其简陋官方只给了一个 curl 示例。我逆向分析了bt命令源码确认其底层调用的就是同一套 API。核心接口是POST /api/ssl/save_ssl需传入以下字段字段名类型说明site_idint网站 ID可在宝塔网站列表 URL 中看到如?id3keystring私钥内容PEM 格式含-----BEGIN RSA PRIVATE KEY-----csrstringCSR 内容可为空宝塔会自动生成certstring证书内容PEM 格式含-----BEGIN CERTIFICATE-----typestring固定填1表示 Let’s Encrypt难点在于win-acme 生成的证书是.pem和.key两个文件而 API 要求key和cert字段是字符串。必须用 PowerShell 读取文件并 Base64 编码避免换行符破坏 JSON 结构$siteId 3 $certPath C:\certs\yourdomain.com\fullchain.pem $keyPath C:\certs\yourdomain.com\privkey.pem $certContent [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes((Get-Content $certPath -Raw))) $keyContent [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes((Get-Content $keyPath -Raw))) $body { site_id $siteId key $keyContent cert $certContent type 1 } | ConvertTo-Json Invoke-RestMethod -Uri http://127.0.0.1:8888/api/ssl/save_ssl -Method Post -Body $body -Headers {AuthorizationBasic $(echo admin:your_password | ConvertTo-Base64String)}注意admin:your_password是宝塔面板的用户名密码必须 Base64 编码。密码不能含特殊字符如、/否则编码后会出错。建议密码设为纯字母数字组合。更稳妥的做法是把这段 PowerShell 封装成.ps1文件如update-bt-ssl.ps1放在C:\win-acme\下然后在 win-acme 的--script参数中调用它。win-acme 支持续签成功后执行自定义脚本这是官方推荐的集成方式。4. 实操过程与核心环节实现4.1 一次性部署全流程含所有命令与配置以下是在一台全新 Windows Server 2019 宝塔 Windows 版v1.0.12上从零开始部署的完整步骤。所有路径、参数、命令均经实测可直接复制粘贴请替换yourdomain.com和your_site_id步骤 1安装 .NET 6.0 Desktop Runtime# 下载地址https://download.visualstudio.microsoft.com/download/pr/7e5a4f6c-1b9a-4e5a-8b9a-4f6c1b9a4f6c/7e5a4f6c-1b9a-4e5a-8b9a-4f6c1b9a4f6c/windowsdesktop-runtime-6.0.23-x64.exe # 以管理员身份运行 CMD执行 windowsdesktop-runtime-6.0.23-x64.exe /quiet /norestart步骤 2下载并解压 win-acme# 下载地址https://github.com/win-acme/win-acme/releases/download/v2.2.3/win-acme.v2.2.3.1599.zip # 解压到 C:\win-acme\ # 创建配置目录 mkdir C:\win-acme\config mkdir C:\certs步骤 3配置阿里云凭据打开 Windows 凭据管理器Control Panel → User Accounts → Credential Manager点“Windows 凭据” → “添加通用凭据”“Internet 或网络地址”填AliyunDNS“用户名”填你的阿里云 AccessKey ID“密码”填 AccessKey Secret点“确定”。步骤 4运行首次注册与证书申请# 以管理员身份运行 CMD进入 C:\win-acme\ cd C:\win-acme\ # 执行首次申请会引导你选域名、验证方式等 win-acme.v2.2.3.1599.exe --baseuri https://acme-v02.api.letsencrypt.org/ --configfolder C:\win-acme\config --certificatestore My # 按提示操作选 M → 输入 yourdomain.com → 选 D → 选 A → AccessKey ID 留空 → 保存配置步骤 5编写宝塔更新脚本update-bt-ssl.ps1# 文件路径C:\win-acme\update-bt-ssl.ps1 param( [string]$Domain yourdomain.com, [int]$SiteId 3 ) $certPath C:\certs\$Domain\fullchain.pem $keyPath C:\certs\$Domain\privkey.pem if (-not (Test-Path $certPath) -or -not (Test-Path $keyPath)) { Write-Error Certificate files not found at $certPath or $keyPath exit 1 } try { $certContent [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes((Get-Content $certPath -Raw))) $keyContent [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes((Get-Content $keyPath -Raw))) $body { site_id $SiteId key $keyContent cert $certContent type 1 } | ConvertTo-Json # 宝塔 API 需 Basic Authadmin:password 必须 Base64 编码 $auth [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(admin:your_bt_password)) $response Invoke-RestMethod -Uri http://127.0.0.1:8888/api/ssl/save_ssl -Method Post -Body $body -Headers { Authorization Basic $auth Content-Type application/json } if ($response.status -eq 1) { Write-Host ✅ 宝塔 SSL 更新成功$Domain # 强制重载 Nginx C:\BtSoft\panel\scripts\bt.ps1 nginx restart } else { Write-Error ❌ 宝塔 API 返回错误$($response.msg) } } catch { Write-Error ❌ 脚本执行异常$($_.Exception.Message) }步骤 6创建 Windows 任务计划打开“任务计划程序” → “创建基本任务”名称填win-acme-renew描述填 “Lets Encrypt 证书自动续期”触发器每天3:00操作启动程序程序填C:\win-acme\win-acme.v2.2.3.1599.exe参数填--target manual --host yourdomain.com --validation aliased --validationname aliyun --certificatestore My --installation none --script C:\win-acme\update-bt-ssl.ps1 --scriptparameters --Domain yourdomain.com --SiteId 3 --verbose在“更改用户或组”中点“更改设置”勾选“不管用户是否登录都要运行”和“不存储密码”因凭据管理器已存密钥在“条件”中取消勾选“只有在计算机使用交流电源时才启动此任务”服务器通常不用电池在“设置”中勾选“如果任务失败每隔 10 分钟重试最多 3 次”。步骤 7手动运行一次测试在任务计划中右键win-acme-renew→ “运行”观察 CMD 窗口输出应看到Creating certificate...→Adding DNS record...→Verifying domain...→Downloading certificate...→Running script...检查C:\certs\yourdomain.com\下是否有fullchain.pem、privkey.pem登录宝塔进入网站 SSL 设置确认证书已更新有效期为 90 天后访问https://yourdomain.com浏览器地址栏显示绿色锁图标。4.2 参数详解与避坑指南那些官网没写的细节win-acme 的命令行参数繁多但真正影响稳定性的核心参数只有 5 个且每个都有坑参数推荐值为什么这么设常见坑--target manual必须强制手动指定域名避免 win-acme 自动扫描 IIS 站点Windows 下常扫错误用--target iis导致申请到错误域名证书--validation aliased必须启用插件式验证aliyun是插件名写成--validation aliyun会报错必须是aliased--certificatestore My必须指定存入当前用户证书存储宝塔可读不加此参数默认存到WebHosting存储宝塔找不到--installation none必须禁用 win-acme 自动安装如 IIS 绑定我们自己用宝塔 API加了--installation iis会导致 IIS 和宝塔 Nginx 证书冲突--script必须指向更新宝塔的 PowerShell 脚本脚本路径含空格未加引号CMD 解析失败特别提醒--scriptparameters的写法它传递给 PowerShell 脚本的参数必须用双引号包裹整个字符串且内部参数也用双引号PowerShell 要求。例如--scriptparameters --Domain \yourdomain.com\ --SiteId 3如果写成--scriptparameters --Domain yourdomain.com --SiteId 3PowerShell 会把yourdomain.com当作两个参数yourdomain.com和--SiteId脚本报错。另一个隐形坑是证书存储路径。win-acme 默认把证书存到C:\Users\YourUser\AppData\Roaming\win-acme\httpsacme-v02.api.letsencrypt.org\...路径极长且含特殊字符。我们用--certificatepath C:\certs\强制指定但要注意--certificatepath参数必须和--certificatestore My同时使用否则 win-acme 会忽略它。这是官网文档没写的限制。4.3 多域名与泛域名实操一行命令搞定 5 个子站客户常问“我有www.a.com、api.a.com、admin.a.com、shop.b.net、*.a.com怎么批量续”答案是用-d参数叠加但要注意泛域名必须单独申请Let’s Encrypt 不允许泛域名和其他域名混申。场景 1多个精确域名win-acme.v2.2.3.1599.exe --target manual --host www.a.com --host api.a.com --host admin.a.com --host shop.b.net --validation aliased --validationname aliyun --certificatestore My --certificatepath C:\certs\multi --installation none --script C:\win-acme\update-multi.ps1update-multi.ps1脚本需遍历C:\certs\multi\下所有域名目录对每个域名调用宝塔 APIsite_id需映射表。场景 2泛域名*.a.comwin-acme.v2.2.3.1599.exe --target manual --host a.com --host *.a.com --validation aliased --validationname aliyun --certificatestore My --certificatepath C:\certs\wildcard --installation none --script C:\win-acme\update-wildcard.ps1注意--host *.a.com的引号必须是英文双引号否则 CMD 解析失败。泛域名证书会同时覆盖a.com和所有子域名www、api、test等但不覆盖b.com。实操心得泛域名证书申请频率受限每周最多 5 次所以不要把它和精确域名混用。建议主站用泛域名管理后台、API 等用精确域名分开申请、分开更新。5. 常见问题与排查技巧实录5.1 证书续签失败的 7 类高频问题速查表现象日志关键词根本原因解决方案Failed to add DNS record: InvalidAccessKeyIdInvalidAccessKeyIdRAM 子用户 AccessKey ID 错误或凭据管理器中用户名填错检查凭据管理器中“用户名”是否为纯 AccessKey ID无空格、无换行重新保存Domain not found in Aliyun DNSDomainNotFound阿里云 DNS 中未添加该域名或域名拼写错误如com写成con登录阿里云 DNS 控制台确认yourdomain.com已添加且是“已启用”状态The remote server returned an error: (401) Unauthorized401 Unauthorized宝塔 API 的 Basic Auth 密码 Base64 编码错误或密码含特殊字符重设宝塔密码为纯字母数字用在线 Base64 工具编码确认admin:password编码后无号缺失Cannot bind to port 80bind: Address already in useIIS、Skype、Web Deploy 占用 80 端口HTTP-01 场景DNS-01 下不应出现此错误若出现说明 win-acme 配置误用了 HTTP-01检查--validation参数Certificate store My not foundCertificate store My not found当前 Windows 用户未登录过图形界面证书存储区未初始化以该用户身份远程桌面登录一次或运行certmgr.msc打开证书管理器创建一个空证书即可初始化Script execution failedExecutionPolicyPowerShell 执行策略为Restricted禁止运行脚本以管理员身份运行 PowerShell执行Set-ExecutionPolicy RemoteSigned -Scope CurrentUserRenewal succeeded but certificate not updated in宝塔status: 0宝塔 API 返回失败常见于site_id错误或宝塔面板未运行进入宝塔面板 → 网站 → 点击对应站点 → 查看 URL 中id后的数字确认--SiteId参数值5.2 日志分析实战如何从 200 行日志里 3 分钟定位问题win-acme 日志默认输出到控制台但任务计划中看不到。必须开启日志文件--log C:\win-acme\logs\renew.log --loglevel Debug日志文件按日期滚动最新日志在renew.log。典型日志片段分析[22:15:32 DBG] Loading validation plugin aliyun [22:15:33 INF] Authorizing identifier: yourdomain.com [22:15:34 DBG] Adding DNS record: _acme-challenge.yourdomain.com [22:15:35 ERR] Failed to add DNS record: InvalidAccessKeyId [22:15:35 INF] Cleaning up challenges[DBG] Loading validation plugin aliyun插件加载成功说明--validation aliased --validationname aliyun正确[INF] Authorizing identifier开始验证正常[ERR] Failed to add DNS record失败点关键词InvalidAccessKeyId直接指向凭据问题[INF] Cleaning up challengeswin-acme 自动清理说明它知道失败了不会残留 TXT 记录。再看一段成功的[03:00:12 INF] Creating certificate... [03:00:15 INF] Downloading certificate [03:00:16 INF] Running script: C:\win-acme\update-bt-ssl.ps1 [03:00:18 INF] Script completed successfullyScript completed successfully是黄金指标说明宝塔 API 调用成功。如果这里卡住超过 30 秒大概率是宝塔 API 超时检查宝塔是否崩溃、端口 8888 是否被占用。5.3 紧急恢复手册证书过期了怎么办别慌。只要阿里云 DNS 权限还在、win-acme 配置完好5 分钟内可恢复立即手动触发续签在任务计划中右键win-acme-renew→
返回列表