我的设备,虚拟机A安装的ubuntu22,已部署宝宝塔面板 + Apache,虚拟机B安装的OpenWrt(iStoreOS),两台设备内网IP各自独立,没有上级网关,动态域名管理在虚拟机B,域名证书及Let's Encrypt 续签都在虚拟机A。
步骤 1:配置虚拟机 A → B SSH 免密登录(自动同步基础)
在虚拟机 A(宝塔) 执行:
# 生成密钥(一路回车,不要设置密码)
ssh-keygen
# 把密钥发送到 OpenWrt(虚拟机B)
# 替换为你的B的IP、SSH端口、root密码
ssh-copy-id -p B的SSH端口 root@B的内网IP
执行后输入 B 的 root 密码,以后 A 连 B 无需密码。
测试是否成功:
ssh root@B的IP -p B端口
直接登录不弹密码 = 成功。
步骤 2:找到宝塔证书真实路径
宝塔 Apache 证书默认路径:
/www/server/panel/vhost/cert/你的域名/
里面有两个关键文件:fullchain.pem → 证书公钥privkey.pem → 证书私钥
你可以在宝塔后台: → 网站 → 设置 → 配置文件,确认一下。
步骤 3:自动同步脚本(A 机器上创建)
在虚拟机 A 创建同步脚本:
mkdir -p /root/ssl_sync
vi /root/ssl_sync/sync_to_openwrt.sh
粘贴以下脚本(直接替换你的信息即可):
#!/bin/bash
###########################################################
# 配置区域(只改这里)
###########################################################
DOMAIN="你的域名" # 例如 abc.com
OPENWRT_IP="192.168.5.2" # 虚拟机B内网IP
OPENWRT_PORT=22 # B的SSH端口
OPENWRT_CERT_DIR="/etc/ssl" # OpenWrt存放证书目录(推荐不改)
# 宝塔证书源目录
SOURCE_CERT="/www/server/panel/vhost/cert/$DOMAIN/fullchain.pem"
SOURCE_KEY="/www/server/panel/vhost/cert/$DOMAIN/privkey.pem"
###########################################################
# 同步证书到 OpenWrt
scp -P $OPENWRT_PORT $SOURCE_CERT root@$OPENWRT_IP:$OPENWRT_CERT_DIR/${DOMAIN}.pem
scp -P $OPENWRT_PORT $SOURCE_KEY root@$OPENWRT_IP:$OPENWRT_CERT_DIR/${DOMAIN}.key
# 在OpenWrt上重启SSL服务
ssh root@$OPENWRT_IP -p $OPENWRT_PORT "/etc/init.d/uhttpd restart"
echo "【同步完成】证书已同步到 OpenWrt 并重启SSL服务"
给脚本授权
chmod +x /root/ssl_sync/sync_to_openwrt.sh
手动测试运行
/root/ssl_sync/sync_to_openwrt.sh
看到 同步完成 就成功了。
步骤 4:配置 OpenWrt 使用证书
登录 OpenWrt 并修改 uhttpd 配置文件
ssh root@B的IP -p 22
vi /etc/config/uhttpd
将配置文件中的
option cert '/etc/ssl/uhttpd.crt'
option key '/etc/ssl/uhttpd.key'
修改成
option cert '/etc/ssl/你的域名.pem' # 证书文件
option key '/etc/ssl/你的域名.key' # 私钥文件
步骤 5:配置自动续签同步(宝塔证书更新后自动同步)
在宝塔面板后台:计划任务 → 续签Let's Encrypt证书 → 编辑,在尾部追加同步脚本
/www/server/panel/pyenv/bin/python3 -u /www/server/panel/class/acme_v2.py --renew_v2=1
# 同步istoreos证书
/root/ssl_sync/sync_to_openwrt.sh
以后宝塔自动续签证书 → 自动同步到 OpenWrt → 自动重启 OpenWrt SSL
评论 (0)