[实战] Windows下PhpStudy+Apache实现泛域名SSL证书自动续签

📌 前言
在 Windows 服务器上使用 PhpStudy 建站非常方便,但 SSL 证书的维护一直是个痛点:
- 手动续签麻烦:免费证书通常只有 3 个月有效期,过期忘记续签会导致网站“红锁”报警。
- 子域名多:如果有
api.xxx.com、admin.xxx.com等多个子域名,一个个申请证书非常繁琐。 - 自动化难:PhpStudy 面板自带的 SSL 功能有时不够灵活,且重启服务容易失败。
本文将介绍如何使用 Win-ACME 配合 Let's Encrypt,申请 泛域名 (Wildcard) 证书,并实现全自动续签和 Apache 服务的自动重载。
🛠️ 环境准备
- 操作系统:Windows Server 2012 R2 / 2016 / 2019 / 2022
- Web环境:PhpStudy Pro (Apache 2.4.x)
- 核心工具:Win-ACME (建议下载 x64.pluggable 版本)
- 域名解析:建议使用 Cloudflare、阿里云、腾讯云等支持 API 的 DNS 服务商(用于自动验证域名所有权)。
📂 第一步:规划目录
为了方便管理和自动化,我们需要规范路径(请根据实际情况修改盘符):
- 工具目录:解压 Win-ACME 到
D:\win-acme\。 - 证书目录:在 Apache 配置目录下新建
ssl_certs文件夹。 - 例如:
D:\phpstudy_pro\Extensions\Apache2.4.39\conf\ssl_certs\
⚡ 第二步:申请泛域名证书
以管理员身份运行 wacs.exe,按照以下步骤操作(不同版本菜单略有差异,认准关键词):
- 选择模式:输入
M(Create certificate in full options)。 - 输入域名:输入
2(Manual input)。 - 填写:
*.yourdomain.com(将yourdomain.com替换为你的真实域名)。 - 域名别名:直接回车(默认)。
- 验证方式:选择
[dns-01]验证。 - 根据你的 DNS 服务商选择(如 Cloudflare, Aliyun 等)。
- 按照提示输入 API Token(为了安全,建议去 DNS 服务商后台申请仅有 DNS 编辑权限的 Token)。
- 私钥类型:选择
RSA Key。 - 存储方式:选择
PEM Encoded files。 - 路径:输入刚才创建的证书目录
D:\phpstudy_pro\Extensions\Apache2.4.39\conf\ssl_certs。 - 密码:选择
None(不设置密码)。 - 后续步骤:
- Store in Certificate Store? ->
No - 安装步骤 (关键):选择
Run script。 - 脚本路径:
D:\win-acme\Scripts\restart_apache.bat(稍后创建)。 - 参数:
{CertPaths}。
💡 成功提示:当屏幕显示绿色的 Authorization result: valid 时,说明证书已成功生成到指定文件夹。⚙️ 第三步:配置 Apache 站点
核心思路是:所有站点(主域名和子域名)都指向同一个自动更新的证书文件。
进入 Apache 的 vhosts 目录(例如 D:\phpstudy_pro\Extensions\Apache2.4.39\conf\vhosts\),修改配置文件。
1. 主域名配置 (yourdomain.com_443.conf)
<VirtualHost *:443>
DocumentRoot "D:/wwwroot/your_project/public"
ServerName yourdomain.com
# ⚠️ 关键:指定别名,防止泛域名配置抢占其他子域名流量
ServerAlias www.yourdomain.com
# --- SSL 核心配置 ---
SSLEngine on
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite HIGH:!aNULL:!MD5:!SEED:!IDEA
# 指向 Win-ACME 自动更新的 .pem 文件
SSLCertificateFile "D:/phpstudy_pro/Extensions/Apache2.4.39/conf/ssl_certs/yourdomain.com-chain.pem"
SSLCertificateKeyFile "D:/phpstudy_pro/Extensions/Apache2.4.39/conf/ssl_certs/yourdomain.com-key.pem"
# --- SSL 配置结束 ---
# 其他配置保持原样...
<Directory "D:/wwwroot/your_project/public">
Options FollowSymLinks ExecCGI
AllowOverride All
Order allow,deny
Allow from all
Require all granted
</Directory>
</VirtualHost>
2. 子域名配置 (例如 https://www.google.com/url?sa=E&source=gmail&q=admin.yourdomain.com)
<VirtualHost *:443>
DocumentRoot "D:/wwwroot/admin_project"
ServerName admin.yourdomain.com
# 如果没有别名,请删除 ServerAlias 这一行,不要留空
SSLEngine on
# 引用和主域名完全一样的证书路径!
SSLCertificateFile "D:/phpstudy_pro/Extensions/Apache2.4.39/conf/ssl_certs/yourdomain.com-chain.pem"
SSLCertificateKeyFile "D:/phpstudy_pro/Extensions/Apache2.4.39/conf/ssl_certs/yourdomain.com-key.pem"
# 其他配置...
</VirtualHost>
🔄 第四步:编写暴力重启脚本
由于 PhpStudy 的 Apache 服务名可能不固定(有时叫 Apache,有时叫 Apache2.4.39),且直接 restart 容易卡死,我们采用“先杀进程,再启动”的暴力方案,确保 100% 重载成功。
创建文件:D:\win-acme\Scripts\restart_apache.bat
@echo off
:: ------------------------------------------------
:: Apache 强制重启脚本 (适用于 Win-ACME 自动续签)
:: ------------------------------------------------
:: 1. 强制结束所有 httpd.exe 进程 (静默模式)
taskkill /F /IM httpd.exe >nul 2>&1
:: 2. 等待 3 秒端口释放
timeout /t 3 /nobreak >nul
:: 3. 启动 Apache
:: ⚠️ 注意:请务必修改为您服务器上 httpd.exe 的真实绝对路径
start "" "D:\phpstudy_pro\Extensions\Apache2.4.39\bin\httpd.exe"
:: 4. 退出
exit
注意:脚本中绝对不能包含 pause 命令,否则后台任务会卡死。⏰ 第五步:配置自动任务
Win-ACME 会尝试自动创建任务,但为了稳妥,建议手动检查或创建 Windows 任务计划。
- 打开 任务计划程序 (Task Scheduler)。
- 创建新任务:
- 名称:
win-acme auto renew - 用户:
SYSTEM(务必勾选“使用最高权限运行”,确保不管用户是否登录都能运行)。 - 触发器:每天早上 09:00。
- 操作:
- 程序:
D:\win-acme\wacs.exe - 参数:
--renew --baseuri "https://acme-v02.api.letsencrypt.org/" - 起始于:
D:\win-acme\
✅ 最终验证
- 验证脚本:双击
restart_apache.bat,观察黑框是否一闪而过,且 Apache 服务正常重启。 - 验证续签逻辑:在任务计划程序中手动运行该任务,查看“上次运行结果”是否为
0x0(成功)。 - 验证 HTTPS:浏览器访问你的所有子域名,检查证书是否已生效,有效期通常为 90 天。
📝 总结
通过这套方案,我们实现了:
- 一张证书走天下:泛域名证书覆盖所有子站。
- 全自动无人值守:每天自动检查,过期自动续签。
- 服务稳定重启:解决了 PhpStudy 重启服务容易失败的老大难问题。
以后再也不用担心网站证书过期了!🚀