Lucky本身是支持通过ACME申请Let’s Encrypt证书的,如果我们指定了泛域名证书,Lucky就会定期给泛域名续期。如果局域网内存在其他服务也需要证书,直接去拿Lucky申请好的证书就很惬意了,不仅节省了公共资源,也更稳妥。
下面给出Lucky给PVE提供证书的方法:
1 Lucky配置好泛域名证书
Lucky界面进入“SSL/TLS证书”,添加证书,
- 验证方式选择Cloudflare
- Token处填写可以编辑该域名的Cloudflare Token
- 域名列表填写主域名和泛域名,这里举例填写:(改成你自己的域名)
yins.top
*.yins.top
- 后面的“证书映射”启用
- 映射路径填写一个绝对路径,例如
/tmp/cert_share
- 如果你还想干点啥,可以在证书变化后触发脚本处写个脚本,不写也不影响。
2 让局域网能访问到证书
Lucky界面进入“web服务”,添加Web服务规则。默认端口是16666,要是有修改的需要也可以自行修改,默认没有占用的话用默认。监听改为仅 IPV4,避免V6公网被访问到。
- 默认规则不需要改
- 添加一个子规则,子规则名称随便起一个便于辨认
- 服务类型选择“文件服务”
- 前端地址写Lucky主机所在的ip,例如
192.168.2.1
- 文件挂载路径 点添加挂载设置,挂载类型
本地,本地路径写刚刚映射的路径 /tmp/cert_share,显示名称不用填
- 然后保存即可
这时候访问http://192.168.2.1:16666/ 就能看见证书文件了。
我们需要的只有yins.top.pem 和 yins.top.key这两个文件。
3 PVE拿取、安装证书
在 PVE 主机上创建一个脚本:
sudo nano /usr/local/bin/update-pve-cert.sh
内容为(证书名称改成你自己的域名):
#!/bin/bash
ACME_SERVER="http://192.168.2.1:16666"
CERT_DIR="/etc/pve/local"
TMP_DIR="/tmp/pve-cert"
mkdir -p "$TMP_DIR"
curl -fsSL "$ACME_SERVER/yins.top.pem" -o "$TMP_DIR/yins.top.pem"
curl -fsSL "$ACME_SERVER/yins.top.key" -o "$TMP_DIR/yins.top.key"
if [[ ! -s "$TMP_DIR/yins.top.pem" || ! -s "$TMP_DIR/yins.top.key" ]]; then
echo "下载证书失败"
exit 1
fi
REMOTE_HASH=$(openssl x509 -in "$TMP_DIR/yins.top.pem" -noout -fingerprint)
LOCAL_HASH=$(openssl x509 -in "$CERT_DIR/pve-ssl.pem" -noout -fingerprint 2>/dev/null)
if [[ "$REMOTE_HASH" == "$LOCAL_HASH" ]]; then
echo "证书未变化,无需更新"
exit 0
fi
cp "$TMP_DIR/yins.top.pem" "$CERT_DIR/pve-ssl.pem"
cp "$TMP_DIR/yins.top.key" "$CERT_DIR/pve-ssl.key"
systemctl restart pveproxy pvedaemon
echo "证书已更新并重启服务"
赋予执行权限
chmod +x /usr/local/bin/update-pve-cert.sh
测试脚本
sudo /usr/local/bin/update-pve-cert.sh
如果成功的话,刷新后在PVE Web界面,主节点,凭证处就能看到新安装的证书,浏览器查看证书,也能看到所指定的域名证书。
4 定时执行脚本
编辑系统计划任务:
sudo crontab -e
末尾添加一行,例如每周一凌晨 3 点执行:
0 3 * * 1 /usr/local/bin/update-pve-cert.sh >> /var/log/pve-cert.log 2>&1
如此一来,我们的PVE就不需要再自己申请证书,直接用现成的就行。脚本会判断证书是否发生了变化,如果没有,就不执行拉取和重启Web服务的步骤。
举一反三,局域网其他需要证书的服务也可以拉取Lucky给的证书,如果是Debian,照上述方法也OK,这样就不用每一台都建一个ACME去申请证书了。
#PVE