一些带有 cPanel 的共享托管套餐不提供AutoSSL或仅以更高的费率提供。结果:您无法通过 cPanel 界面颁发免费的 Let's Encrypt 证书,并且所有域都停留在自签名证书上。浏览器将页面显示为“不安全”。出路:使用acme.sh自行获取证书并通过 cPanel UAPI 安装它 - 自动续订,无需 AutoSSL。
HTTPS 早已成为强制性标准。因此,当你的主机套餐没有提供便捷的免费证书获取方式时,就显得格外令人沮丧。这种情况比你想象的要常见,例如在一些价格低廉的入门级套餐中,或者在套餐变更后证书突然不再包含在内。不过,只需几行 shell 代码,就能优雅且永久地解决这个问题——完整的过程如下所述。
1. 通过 SSH 登录
ssh -p <port> <user>@example.com
2. 安装 acme.sh
curl https://get.acme.sh | sh -s email=me@example.com
source ~/.bashrc
3. 将 Let's Encrypt 设置为证书颁发机构 (CA)。
acme.sh --set-default-ca --server letsencrypt
4. 颁发证书
acme.sh --issue -d example.com -d www.example.com -w ~/public_html
5. 安装到 cPanel
acme.sh --deploy -d example.com --deploy-hook cpanel_uapi
6. 检查
uapi SSL installed_hosts
echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null \
| openssl x509 -noout -issuer -dates
该挂钩通过 UAPI 将证书写入适当的 vHost。部署设置已保存 - 从现在开始,cron 将在到期之前独立更新并安装所有内容。发行人为“Let’s Encrypt”,到期日为未来 90 天左右。如果出现旧的自签名证书,则在浏览器中进行硬重新加载通常会有所帮助 - 可以暂时存储以前的证书。
有些主机商运行自己的 cPanel 钩子。 install_ssl 并回应如下: adminbin Cpanel/hooks2/...: exit 255. acme.sh 仍然报告“成功部署”——这是正确的。在这种情况下,挂钩会因后续步骤(例如来自主机的内部通知或同步作业)而失败,而不是因实际安装而失败。
对于带有变音符号的域名,acme.sh 会将证书以 Punycode 格式存储在内部(xn--…),而钩子的自动匹配器会比较 Unicode 形式。结果:“部署到 0 个站点中的 0 个”——未安装任何内容。棘手的是 acme.sh 在这里也报告“Success”,所以这个错误很容易被忽视。解决方案:直接使用 Punycode 域并关闭自动模式:
python3 -c "import sys;print(sys.argv[1].encode('idna').decode())" hallöle.de
acme.sh --issue -d xn--hallle-zxa.de -d www.xn--hallle-zxa.de -w ~/public_html
export DEPLOY_CPANEL_AUTO_ENABLED='false'
acme.sh --deploy -d xn--hallle-zxa.de --deploy-hook cpanel_uapi
使用 SSH 访问时,您不需要 AutoSSL:acme.sh 会颁发证书。 cpanel_uapi该钩子程序会安装它,并且内置的定时任务会使其自动更新。设置完成后,免费的 HTTPS 服务即可持续运行。那些投入初始精力进行设置的用户,以后就无需再手动续费了——而且只需一条命令,即可将相同的解决方案扩展到同一帐户下的任何其他域名。