突发奇想想把原来的RSA证书换成体积更小更安全的ECC证书, 但是宝塔面板自动申请的Let’s Encrypt证书是RSA的而且不能改这个有点坑, 想要搞ECC证书还要自定义各种参数且自动续期就很难. 于是到宝塔的论坛上对线开发者,得到的答复是暂不准备支持. 那就只能自己动手了.
先看了一眼宝塔面板自动申请Let’s Encrypt证书的逻辑, 发现是位于/www/server/panel/class/acme_v2.py的一个python程序, 用openssl实现证书申请(注释详细, 好评). 于是去翻阅openssl的相关模板, 准备自行魔改一番, 发现openssl对ECC证书似乎并不友好, 难怪宝塔没这功能. 文档里面相关的内容只有寥寥几句, 实在搞不清具体逻辑… 只好另寻它路. 最后发现果然还是acme.sh大法好.
首先安装依赖yum install curl cron socat -y
或apt-get install curl cron socat -y
安装本体curl https://get.acme.sh | sh
创建一个 bash 的 alias, 方便你的使用: alias acme.sh=~/.acme.sh/acme.sh
以上默认在/root/内进行(如果是用的root账户).
由于使用dns验证所有权, 要导入dns的api(这里是cloudflare 其它参考官方文档):
export CF_Key="CloudFlare API Key"
export CF_Email="CF账号的邮箱"
申请ECC证书: acme.sh --issue --dns dns_cf --ecc -k secp384r1 -d xxx.cn -d *.xxx.cn
安装ECC证书, 注意之前要先手动创建出/www/server/panel/vhost/ssl/xxx.cn/
这个文件夹, 开始没有, 会导致安装证书报错.
这一步和官方文档里的不同, 首先要说明下/www/server/panel/vhost/ssl/xxx.cn/
对应宝塔面板的”证书夹”, /www/server/panel/vhost/cert/xxx.cn/
是nginx的证书路径, nginx从后者中读取证书而不是前者, 所以要用cp命令; 其次宝塔里面force-relaod
命令用不了, 要用service nginx restart
重启nginx才能读取新证书. 安装命令:
acme.sh --installcert --ecc -k secp384r1 -d xxx.cn -d *.xxx.cn \
--key-file /www/server/panel/vhost/ssl/xxx.cn/privkey.pem \
--fullchain-file /www/server/panel/vhost/ssl/xxx.cn/fullchain.pem \
--reloadcmd "cp /www/server/panel/vhost/ssl/xxx.cn/privkey.pem /www/server/panel/vhost/cert/xxx.cn/privkey.pem&&cp /www/server/panel/vhost/ssl/xxx.cn/fullchain.pem /www/server/panel/vhost/cert/xxx.cn/fullchain.pem&&service nginx restart"
如果是第一次安装证书, acme不会帮你修改nginx配置和开启ssl监听. 于是我们进入到/www/server/panel/vhost/ssl/xxx.cn/
里面创建一个info.json
文件, 内容: {"issuer": "Let's Encrypt", "notAfter": "2666-08-17", "notBefore": "1926-08-17", "dns": ["*.xxx.cn", "xxx.cn"], "subject": "xxx.cn"}
, 使得宝塔可以识别我们的证书. 然后直接在面板的证书夹里面点击部署即可.
这之后acme.sh会自动添加计划任务自动续签并记住--reloadcmd
后面的命令在每次更新证书之后会自动执行(拷贝新证书+重启nginx). 所以可以把宝塔面板自己的续签计划任务停掉了.
不过强迫症会发现宝塔居然自动修改了info.json, 改成了真正的有效期, 其是否会在acme续签证书后自动更新, 不自动更新日期会有什么后果还有待观察.
acme.sh自身的自动更新: acme.sh --upgrade --auto-upgrade
证书到期前强制更新: acme.sh --renew-all --force
注意不要再去点开网站控制面板里面的SSL选项卡, 会导致宝塔自己的计划任务再次打开
检测网站配置: https://www.ssllabs.com/ https://myssl.com/
本文参考了前人的尝试: https://www.yindan.me/website/7.html https://www.yindan.me/website/8.html