宝塔面板部署Let’s Encrypt的ECC证书并自动续签

突发奇想想把原来的RSA证书换成体积更小更安全的ECC证书, 但是宝塔面板自动申请的Let’s Encrypt证书是RSA的而且不能改这个有点坑, 想要搞ECC证书还要自定义各种参数且自动续期就很难. 于是到宝塔的论坛上对线开发者https://www.bt.cn/bbs/forum.php?mod=viewthread&tid=46817, 得到的答复是暂不准备支持. 那就只能自己动手了.

先看了一眼宝塔面板自动申请Let’s Encrypt证书的逻辑, 发现是位于/www/server/panel/class/acme_v2.py的一个python程序, 用openssl实现证书申请(注释详细, 好评). 于是去翻阅openssl的相关模板, 准备自行魔改一番, 发现openssl对ECC证书似乎并不友好, 难怪宝塔没这功能. 文档里面相关的内容只有寥寥几句, 实在搞不清具体逻辑… 只好另寻它路. 最后发现果然还是acme.sh大法好.

首先安装依赖yum install curl cron socat -yapt-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 xccbk.cn -d *.xccbk.cn

安装ECC证书, 注意之前要先手动创建出/www/server/panel/vhost/ssl/xccbk.cn/这个文件夹, 开始没有, 会导致安装证书报错.

这一步和官方文档里的不同, 首先要说明下/www/server/panel/vhost/ssl/xccbk.cn/对应宝塔面板的”证书夹”, /www/server/panel/vhost/cert/xccbk.cn/是nginx的证书路径, nginx从后者中读取证书而不是前者, 所以要用cp命令; 其次宝塔里面force-relaod命令用不了, 要用service nginx restart重启nginx才能读取新证书. 安装命令:

acme.sh --installcert --ecc -k secp384r1 -d xccbk.cn -d *.xccbk.cn \
--key-file /www/server/panel/vhost/ssl/xccbk.cn/privkey.pem \
--fullchain-file /www/server/panel/vhost/ssl/xccbk.cn/fullchain.pem \
--reloadcmd "cp /www/server/panel/vhost/ssl/xccbk.cn/privkey.pem /www/server/panel/vhost/cert/xccbk.cn/privkey.pem&&cp /www/server/panel/vhost/ssl/xccbk.cn/fullchain.pem /www/server/panel/vhost/cert/xccbk.cn/fullchain.pem&&service nginx restart"

如果是第一次安装证书, acme不会帮你修改nginx配置和开启ssl监听. 于是我们进入到/www/server/panel/vhost/ssl/xccbk.cn/里面创建一个info.json文件, 内容: {"issuer": "Let's Encrypt", "notAfter": "2666-08-17", "notBefore": "1926-08-17", "dns": ["*.xccbk.cn", "xccbk.cn"], "subject": "xccbk.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

赞(0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址