宝塔中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免费学习笔记(深入)”;
- 步骤简述:先在宝塔建一个“域名”为
123.45.67.89的站点 → 用acme.sh --issue -d 123.45.67.89 --webroot /www/wwwroot/123.45.67.89申请 → 再用--install-cert把证书写入宝塔面板 SSL 目录 - 关键限制:
acme.sh必须在独立 SSH 终端运行(不能用面板终端),否则面板重启会导致命令中断 - 风险提示:浏览器会报“您的连接不是私密连接”,因为主流浏览器不信任 IP 的 Let’s Encrypt 证书;生产环境请务必用真实域名



















