宝塔中Let’s Encrypt证书由Python脚本(acme_v2.py或acme.sh)申请,PHP仅处理加密请求;HTTPS生效依赖Nginx/Apache加载证书文件,与PHP无关。

宝塔不直接用 PHP 部署 Let’s Encrypt 证书
PHP 是运行在 Web 服务里的脚本语言,它本身不参与 SSL 证书申请、验证或 Nginx/Apache 配置。所谓“PHP 支持 HTTPS 自动部署”,是常见误解——实际执行证书申请的是宝塔后台的 Python 脚本(acme_v2.py)或 acme.sh 工具,PHP 只负责在启用 HTTPS 后正常处理加密请求。
- 证书申请阶段:由宝塔调用
/www/server/panel/class/acme_v2.py或外部acme.sh完成域名验证和证书下载 - HTTPS 生效阶段:Nginx/Apache 加载证书文件(
/www/server/panel/vhost/cert/xxx/fullchain.pem和privkey.pem),与 PHP 无关 - PHP 应用若需感知 HTTPS,应检查
$_SERVER['HTTPS']或$_SERVER['HTTP_X_FORWARDED_PROTO'],而非参与部署流程
Let’s Encrypt 证书在宝塔中真正怎么申请
宝塔提供两种主流方式,图形界面最常用,但底层逻辑一致:通过 HTTP-01 验证(访问 /.well-known/acme-challenge/xxx)确认你控制该域名。
- 前提必须满足:域名已正确解析到服务器 IP,且服务器 80 端口可被 Let’s Encrypt 服务器访问(国内部分云厂商如阿里云默认屏蔽 80 入向,需手动放行)
- 操作路径:
网站 → 选择站点 → SSL → Let’s Encrypt → 勾选域名 + 邮箱 → 点击【申请】 - 失败常见原因:
dns :: NXDOMAIN(DNS 未生效)、connection refused(80 端口被拦截)、urn:acme:error:unauthorized(.well-known 目录权限不对或被伪静态规则屏蔽)
自动续签不是“开个开关”就完事
宝塔默认开启 Let’s Encrypt 自动续签,但依赖计划任务 + 正确的环境链路,很多用户续签失败后才发现配置早断了。
- 续签脚本本质是:
/www/server/panel/pyenv/bin/python /www/server/panel/class/acme_v2.py --renew=1 - 必须确保该 Python 环境能联网、有读写
/www/server/panel/vhost/cert/权限,且站点未被误删或改名(否则路径找不到) - 建议手动执行一次续签测试:
bash -c "/www/server/panel/pyenv/bin/python /www/server/panel/class/acme_v2.py --renew=1" 2>&1,观察输出是否含success和新有效期 - 别只看面板里“剩余天数”,要进
/www/server/panel/vhost/cert/yourdomain/查看fullchain.pem的最后修改时间是否更新
IP 地址也能配 HTTPS?但得绕过宝塔图形界面
Let’s Encrypt 官方不签纯 IP 证书(除非你用 ACME-TLS-ALPN,但宝塔不支持),但可以通过 acme.sh + webroot 模式“骗过”验证,仅适用于测试或内网穿透场景。
立即学习“PHP免费学习笔记(深入)”;
宝塔的 HTTPS 自动化,核心是「Python 脚本 + Nginx 配置 + 定时任务」三者咬合,PHP 在其中只是受益者,不是参与者。最容易被忽略的,其实是 DNS 解析时效、云厂商安全组拦截、以及证书路径权限这三点——它们不出错时一切安静,一出错就全链路静默失败。











