Acme&rsync 维护SSL证书

Acme

参考文档

https://mucen.cn/blog/acme/

https://bjjdkp.github.io/post/use-acme-getting-wildcard-certificate/

自定义安装

参考资料 https://github.com/acmesh-official/acme.sh/wiki/How-to-install

先下载安装包

1
git clone --depth 1 https://github.com/acmesh-official/acme.sh.git

进入目录 acme.sh 然后执行安装指令

1
2
3
4
5
6
acme.sh --install \
--home ~/acme/home \
--config-home ~/acme/config \
--cert-home ~/acme/cert \
--accountemail "example@mail.com" \
--useragent "Special"
  • 最重要的是前三个配置目录,更多配置项和配置项解释见官方文档

然后编辑一个证书安装脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
# 检查是否传入了域名参数
if [ -z "$1" ]; then
echo "请传入域名作为第一个参数!"
exit 1
fi
# 获取传入的域名
domain=$1
# 创建共享文件夹
share_dir="/home/rsyncer/share/$domain"
mkdir -p "$share_dir"
# 安装证书,建议写全acme.sh程序的地址
/home/ubuntu/acme/home/acme.sh \
--install-cert -d "$domain" \
--cert-file "$share_dir/cert.pem" \
--key-file "$share_dir/key.pem" \
--fullchain-file "$share_dir/fullchain.pem" \
chown -R ubuntu:rsyncer "$share_dir"
chmod 755 "$share_dir"

实际上你还可以借助 --reloadcmd 在签发后就执行这个部署命令达成一个闭环,不过可能需要额外传递域名,因此还需要重写编辑脚本

同时可以创建一个指令别名来简化签发,这里以 tencent DNSPOD 2.0 API,签发RSA证书为例

1
alias acme_dnspod='acme --issue --dns dns_tencent --keylength 2048 '

申请泛域名

需要注意,申请泛域名时需要兼顾主域名,否则主域名无法被认证

例如申请了 *.example.srv 但是你的证书无法认证 example.srv

申请格式为

1
acme.sh --issue --dns tencent_dns -d example.srv -d *.exanple.srv

这样签发的证书就可以兼顾主域名

rsync 文件同步

使用rsync同步Acme证书文件

思路:

ubuntu用户申请证书,创建一个小权限用户 rsyncer 用于同步文件

1
adduser rsyncer

文件夹

  • home/rsyncer/share 同步文件夹
  • home/ubuntu/acme/cert 证书签发文件夹
  • home/ubuntu/acme/home/ acme的安装文件夹

设置

这里将 rsync 启用为系统服务,应该是可以在 rsyncer 用户启动这个服务,但是我没跑通

先创建配置文件

  • /etc/rsync/rsyncd.conf 配置文件所在地,默认为 /etc/rsyncd.conf
  • /etc/rsync/rsyncd.secrets 密码认证文件所在地,没有默认值

编辑 rsyncd.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
log file= /var/log/rsyncd.log
pidfile = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock

use chroot = yes
list = yes
hosts allow = 127.0.0.1/8 192.168.1.1/24
hosts deny = *
timeout = 60
max connections = 20
[cert]
path = /home/rsyncer/share
uid = rsyncer
gid = rsyncer
port = 873
read only = yes
secrets file = /etc/rsync/rsyncd.secrets
auth users = rsyncer
  • 前三个配置填上即可,一般都会存储在这些地方,大部分配置都是默认的,挑几个重点

  • list 是否列出可同步单元,默认会列出,可以执行下方的代码看到列出了一个cert

    1
    2
    rsync rsync://127.0.0.1
    >> cert
  • [cert] 同步单元,可以设置多个不同的文件同步地址,不同的文件地址可以应用不同的配置

现在编辑秘钥文件 nano rsyncd.secrets

1
rsyncer:examplePassword

然后现在手动在 root 用户下启用守护进程来检查配置文件是否有效

1
rsync --daemon --config=/etc/rsync/rsyncd.conf

然后检查端口是否开放,如果一切顺利应该能看到监听记录

1
ss -anl | grep 873

强制停止监听

1
pkill rsync

编写服务配置 nano /etc/systemd/system/rsync.sercice

1
2
3
4
5
6
7
8
9
10
[Unit]
Description=rsync service

[Service]
ExecStart=rsync --daemon --no-detach --config=/etc/rsync/rsyncd.conf
Restart=on-failure

[Install]
WantedBy=default.target

然后启动配置

1
2
3
systemctl daemon-reload
systemctl start rsync.service
systemctl status rsync.service

如果没有问题进入最后测试环节,这里用本机的ubuntu用户进行测试

创建密码文件,rsync只能使用明文密码本进行身份验证

1
2
3
4
cd ~/tmp
echo "examplePassword" > ~/tmp/pass.key
rsync rsync://127.0.0.1
>> cert

进行测试同步

1
rsync -avz --password-file=./password.file rsyncer@127.0.0.1::cert ./cert

同步 cert 模块到本地的 ./cert 文件夹

如果你希望提高安全性,可以使用SSH秘钥进行同步,首先你得先给rsyncer保存公钥,然后ubuntu这里保存好私钥,使用以下指令进行同步

1
rsync -avz -e "ssh -i rsyncer.key" rsyncer@127.0.0.1:/home/rsyncer/share/ ./cert

唯一的问题是,有的服务器我不希望同步所有证书,需要对脚本再次修改


Acme&rsync 维护SSL证书
https://blog.sukiloli.com/2025/02/17/acme-ssl/
作者
QLozin
发布于
2025年2月17日
许可协议