Rust acme-redirect 客户端申请 Let's Encrypt 证书步骤

目的

获得免费的 SSL 证书并且能自动续期.

思路

  • 程序(指acme-redirect)会占用 80 端口为申请证书的域名做验证处理,也就是一套的验证、申请、续期等。
  • 关闭 Nginx 或其它代理软件,是为了避免 80 端口占用。
  • 80 端口被占用的话,acme-redirect 无法开启后台常驻,也就无法 验证、申请等。
  • 后续 Nginx 之类的软件,只维护 443 端口即可,切记不要加 80 端口,不然会有端口占用的报错。

Let’s Encrypt 文档

建议先建立心智地图,能有效理解 acme-redirect 获取证书实现思路.

  1. 证书颁发示意图 Let's Encrypt 的运作方式
  2. 验证逻辑 验证方式

开始前,确保域名解析已经指向待申请证书的服务器,常见加两条:

@ -> 服务器ip
www -> 服务器ip

这样的话 https://域名.XXhttps://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 用户密码,比如当时截图:

Rust  acme-redirect 客服端申请Let's Encrypt 证书

续订成功,证书会在这个目录:

/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 协议》,转载必须注明作者和本文链接
实干兴邦、力争上游
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
41
粉丝
13
喜欢
77
收藏
68
排名:286
访问:3.3 万
私信
所有博文
社区赞助商