Rust acme-redirect 客户端申请 Let's Encrypt 证书步骤
目的
获得免费的 SSL 证书并且能自动续期.
思路
- 程序(指acme-redirect)会占用 80 端口为申请证书的域名做验证处理,也就是一套的验证、申请、续期等。
- 关闭
Nginx
或其它代理软件,是为了避免 80 端口占用。 80
端口被占用的话,acme-redirect 无法开启后台常驻,也就无法 验证、申请等。- 后续
Nginx
之类的软件,只维护 443 端口即可,切记不要加 80 端口,不然会有端口占用的报错。
Let’s Encrypt 文档
建议先建立心智地图,能有效理解 acme-redirect 获取证书实现思路.
- 证书颁发示意图 Let's Encrypt 的运作方式
- 验证逻辑 验证方式
开始前,确保域名解析已经指向待申请证书的服务器,常见加两条:
@ -> 服务器ip
www -> 服务器ip
这样的话 https://域名.XX
和 https://www.域名.XX
都能正确访问
实际操作
第一步 安装 Rust acme-redirect 客户端
采用直接使用 rust 编译方式安装软件,可避免不同 Linux 发行版下 可能遇到的 奇怪问题.
项目地址:
kpcyrd/acme-redirect
代码拉下来
// 拉代码方法不止这一种, 选择自己习惯的方式即可
git clone git@github.com:kpcyrd/acme-redirect.git
编译成可执行程序
// 在 acme-redirect 目录
cargo build --release
安装到本机
// 当前还是在 acme-redirect目录
install -Dm 755 -t /usr/bin \
target/release/acme-redirect
install -Dm 644 contrib/confs/acme-redirect.conf -t /etc
install -Dm 644 contrib/confs/certs.d/example.com.conf /etc/acme-redirect.d/example.com.conf.sample
install -Dm 644 -t /etc/systemd/system \
contrib/systemd/acme-redirect-renew.service \
contrib/systemd/acme-redirect-renew.timer \
contrib/systemd/acme-redirect.service
install -Dm 644 contrib/systemd/acme-redirect.sysusers /etc/sysusers.d/acme-redirect.conf
install -Dm 644 contrib/systemd/acme-redirect.tmpfiles /etc/tmpfiles.d/acme-redirect.conf
sudo systemd-sysusers
sudo systemd-tmpfiles --create
至此就安装完了,以上所有的命令汇总如下:
git clone https://github.com/kpcyrd/acme-redirect.git
cd acme-redirect/
cargo build --release
install -Dm 755 -t /usr/bin \
target/release/acme-redirect
install -Dm 644 contrib/confs/acme-redirect.conf -t /etc
install -Dm 644 contrib/confs/certs.d/example.com.conf /etc/acme-redirect.d/example.com.conf.sample
install -Dm 644 -t /etc/systemd/system \
contrib/systemd/acme-redirect-renew.service \
contrib/systemd/acme-redirect-renew.timer \
contrib/systemd/acme-redirect.service
install -Dm 644 contrib/systemd/acme-redirect.sysusers /etc/sysusers.d/acme-redirect.conf
install -Dm 644 contrib/systemd/acme-redirect.tmpfiles /etc/tmpfiles.d/acme-redirect.conf
sudo systemd-sysusers
sudo systemd-tmpfiles --create
第二步 把 Nginx 服务关闭
// 默认Nginx 是开启了 80端口 监听, 和上面安装的 acme-redirect 客户端 端口冲突
// 因为 Let's Encrypt 只接受目标为“http:”或“https:”且端口为 80 或 443 的重定向
// 所以 acme-redirect 客户端使用了 80 端口
// 当然,您的 Nginx 要是未占用80端口,可以不用关闭 Nginx 服务
sudo nginx -s stop
第三步 创建配置文件
// /etc/acme-redirect.d/ 就是对应的目录,
// 要 copy 的就是 example.com.conf.sample 这个文件
// 比如我们 cp example.com.conf.sample example.com.conf
// 然后 查看
# cat /etc/acme-redirect.d/example.com.conf
[cert]
name = "example.com"
dns_names = [
"example.com",
"www.example.com",
]
exec = [
"systemctl reload nginx",
]
上面的配置方式, 是项目 README 的方式, 最后的更新时间停留在 2022 年 是有问题的
现在不支持范域名,这样修改:
[cert]
name = 'example.com'
dns_names = [
"example.com",
]
exec = [
# 我是自己控制 Nginx,所以去掉了这个钩子的脚本
]
至此,所有的准备工作搞定,可以开始申请证书了:
第四步 启动客户端常驻
systemctl enable --now acme-redirect
保险起见,我们检查下:
systemctl status acme-redirect
acme-redirect.service - acme-redirect: http redirector with acme support
Loaded: loaded (/etc/systemd/system/acme-redirect.service; enabled; preset>
Active: active (running) since Sun 2024-04-07 20:11:54 CST; 16s ago
Main PID: 1433875 (acme-redirect)
Tasks: 4 (limit: 4354)
Memory: 4.2M
CPU: 17ms
CGroup: /system.slice/acme-redirect.service
└─1433875 /usr/bin/acme-redirect daemon --chroot --user acme-redir>
要是遇到 Active: failed,如下
acme-redirect.service - acme-redirect: http redirector with acme support
Loaded: loaded (/etc/systemd/system/acme-redirect.service; enabled; preset>
Active: failed (Result: exit-code) since Sun 2024-04-07 20:07:30 CST; 2min>
Duration: 8ms
Main PID: 1431699 (code=exited, status=1/FAILURE)
CPU: 8ms
检查是否其他程序占用了 80 端口
Active: active 的情况下,继续下一步: 检查配置
acme-redirect check
验证成功的话: 申请证书
acme-redirect renew
申请成功的话: 开启自动续订
systemctl enable --now acme-redirect-renew.timer
这一步,可能会让你输入Linux 用户密码,比如当时截图:
续订成功,证书会在这个目录:
/var/lib/acme-redirect/live/example.com/fullchain
/var/lib/acme-redirect/live/example.com/privkey
至此,证书生成就完成了! 具体部署要看使用的什么代理转发工具,
项目提供了三个例子,大家自取:
nginx
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
ssl_certificate /var/lib/acme-redirect/live/example.com/fullchain;
ssl_certificate_key /var/lib/acme-redirect/live/example.com/privkey;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m; # about 40000 sessions
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
add_header Strict-Transport-Security "max-age=63072000" always;
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /var/lib/acme-redirect/live/example.com/chain;
resolver 127.0.0.1;
# ...
}
apache
<VirtualHost *:443>
SSLEngine on
SSLCertificateFile /var/lib/acme-redirect/live/example.com/fullchain
SSLCertificateKeyFile /var/lib/acme-redirect/live/example.com/privkey
Protocols h2 http/1.1
Header always set Strict-Transport-Security "max-age=63072000"
</VirtualHost>
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
SSLHonorCipherOrder off
SSLSessionTickets off
SSLUseStapling On
SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"
lighttpd
server.modules += ("mod_openssl")
$SERVER["socket"] == "0.0.0.0:443" {
ssl.engine = "enable"
ssl.privkey= "/var/lib/acme-redirect/live/example.com/privkey"
ssl.pemfile= "/var/lib/acme-redirect/live/example.com/fullchain"
ssl.openssl.ssl-conf-cmd = ("MinProtocol" => "TLSv1.2")
#ssl.ca-file= "/var/lib/acme-redirect/live/example.com/chain" # (needed in $SERVER["socket"] before lighttpd 1.4.56 if ssl.pemfile in $HTTP["host"])
}
才疏学浅,能力有限,一切只为能够达到预期结果, “有些概念可能理解的不对”, 即使如此,希望能给您提供帮助,同时您也能纠错.
本作品采用《CC 协议》,转载必须注明作者和本文链接