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"
/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 用于同步文件
文件夹
- 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
然后现在手动在 root 用户下启用守护进程来检查配置文件是否有效
1
| rsync --daemon --config=/etc/rsync/rsyncd.conf
|
然后检查端口是否开放,如果一切顺利应该能看到监听记录
强制停止监听
编写服务配置 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
|
唯一的问题是,有的服务器我不希望同步所有证书,需要对脚本再次修改