Acme.sh+ZeroSSL证书部署

 技术  SSL  acme.sh  cloudflare  DNS 󰈭 1748字

之前一直沿用的最老的服务器的ssl证书提供商FreeSSL首页 - FreeSSL.cn一个提供免费HTTPS证书申请的网站, 前阵子发现不知道怎么不太行了, 偶尔会出现证书不被信任的情况, 过一段时间可能会自己恢复… 不过去官网查了下发现自己的账号下居然好像又没有这份证书… 很奇怪, 总之打算换一下SSL证书提供商.

这里记录一下Nginx服务+阿里云域名解析+ACME自动化工具部署+ZeroSSL证书的过程.

准备工作

注册ZeroSSL账户

注册完ZeroSSL账户后, 再生成一份账户凭证用于ACME注册:

创建阿里云子账户

RAM用户简介: RAM用户. 大概意思是权限最小化, 开设一个新的子账户并为其分配操作DNS解析的权力, 随后用该账户进行域名所有权的认证.

创建完成后, 在权限一栏为其分配管理DNS的权限; 并也生成一组id和key.

部署证书

登陆上服务器, 安装acme.sh(acmesh-official/acme.sh: A pure Unix shell script implementing ACME client protocol). 之前装过, 这次就沿用了. 因而没有详细的shell命令指南 我也忘记了

再设置两个环境变量:

1export Ali_Key="..."
2export Ali_Secret="..."

使用acme注册账户, 与zerossl相关联:

1acme.sh  --register-account --server zerossl \
2--eab-kid  .......
3--eab-hmac-key ........

注册! 正常这样就好, 但是之前最开始用的是letsencrypt.. 不过不知道为什么老是报错, 而且一旦错误超过3次就让我等好几个小时候再重试.. 因而选用了先进的zerossl.

1acme.sh --server zerossl --issue --dns dns_ali -d rqdmap.top -d *.rqdmap.top

证书链不完整的问题

发现部署了先进的zerossl后还是会偶尔出现invalid的情况, 看了下说是证书链不完整…

可以通过SSL Server Test (Powered by Qualys SSL Labs)测试.

最终发现问题所在, acme默认其实生成的.cer文件有三个…一个是我域名自身的, 一个是ca的, 还有一个是fullchain的…

 1[root@vultr rqdmap.top_ecc]# tree
 2.
 3├── ca.cer
 4├── fullchain.cer
 5├── rqdmap.top.cer
 6├── rqdmap.top.conf
 7├── rqdmap.top.csr
 8├── rqdmap.top.csr.conf
 9└── rqdmap.top.key
10
111 directory, 7 files

我的nginx服务器配置居然好像也是延续了万恶的老传统, 只配置了自身的cer文件… 但是没有把认证链上层的证书一并放里面, 就会出现这个问题. 修改配置将cer文件变为fullchain.cer即可.

其中.csr文件是Certificate Signing Request, 提供私钥以及csr给ca以生成公钥即cer文件.

另外, 每次都在纳闷为什么我写在bashrc的export指令不会自动执行, 我的bash_profile也配置了啊… 今天仔细一看发现我的bash_profile居然叫.bashprofile… 麻了 里面第一行的注释还在说自己是.bash_profile云云…

而关于登陆shell加载配置的顺序, 则要再次引用万能的Bash - ArchWiki了.

cron自动任务

acme工具装模作样地自动给我配置了个cron定时任务..

结果系统其实没有根本启用cronie… 因而需要用systemctl把cronie打开.

 1[root@vultr ~]# crontab -l
 244 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
 3
 4[root@vultr ~]# systemctl status cronie
 5● cronie.service - Periodic Command Scheduler
 6     Loaded: loaded (/usr/lib/systemd/system/cronie.service; enabled; preset: disabled)
 7     Active: active (running) since Fri 2023-03-10 14:55:10 CST; 14min ago
 8   Main PID: 1376828 (crond)
 9      Tasks: 2 (limit: 1132)
10     Memory: 1.5M
11        CPU: 29ms
12     CGroup: /system.slice/cronie.service
13             ├─1376828 /usr/bin/crond -n
14             └─1377178 /usr/sbin/anacron -s
15...

集成Docker部署

本来所设想的是在整个docker-compose中自动化地完成证书的签发与部署工作; 不过貌似出现了些问题, 因而目前采用半自动的方式, 首次部署时需手动配置, 后续即可自动不断续签生成新的证书文件, 不过并不会自动重启nginx服务, 因而还需要手动restart一次. 只要博客更新的勤快就不会有问题

 1services:
 2  nginx:
 3    image: nginx:alpine
 4    ports:
 5      - "80:80"
 6      - "443:443"
 7    volumes:
 8      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
 9      - ./nginx/ssl.conf:/etc/nginx/ssl.conf
10      - ./acme.sh/rqdmap.top_ecc/:/etc/nginx/ssl/rqdmap.top_ecc
11      - ./nginx/log/:/var/log/nginx/
12      - ./blog:/srv/http/blog/
13      - /var/run/docker.sock:/var/run/docker.sock
14    depends_on:
15      - acme.sh
16    restart: always
17    networks:
18      - internal
19
20  acme.sh:
21    image: neilpang/acme.sh
22    volumes:
23      - ./acme.sh:/acme.sh
24    command: daemon
25    restart: always
26    networks:
27      - internal
  • acme.sh作为守护进程提供服务, 如需注册/签发还需使用下面的脚本:

     1#!/bin/bash
     2
     3# 第一次使用时关联zerossl账号
     4# docker-compose exec acme.sh --register-account  --server zerossl \
     5#         --eab-kid  xxxxxxxxxxxxxxxx \
     6#         --eab-hmac-key xxxxxxxxxxxx
     7
     8
     9# 签发证书
    10docker-compose exec \
    11    -e CF_Token="xxxxxx" \
    12    -e CF_Account_ID="xxxxxx" \
    13    -e CF_Zone_ID="xxxxxx" \
    14    acme.sh --issue --dns dns_cf -d rqdmap.top -d *.rqdmap.top $@
  • 一旦第一次成功后, 后续就会定期执行, 在即将过期时续签, 生成证书文件在指定挂载的目录下./acme.sh

嗨! 这里是 rqdmap 的个人博客, 我正关注 GNU/Linux 桌面系统, Linux 内核, 后端开发, Python, Rust 以及一切有趣的计算机技术! 希望我的内容能对你有所帮助~
如果你遇到了任何问题, 包括但不限于: 博客内容说明不清楚或错误; 样式版面混乱等问题, 请通过邮箱 rqdmap@gmail.com 联系我!
修改记录:
  • 2023-09-06 10:00:35ssl证书docker部署(cloudflare)
  • 2023-05-29 23:05:14大幅重构了python脚本的目录结构,实现了若干操作博客内容、sqlite的助手函数;修改原本的文本数 据库(ok)为sqlite数据库,通过嵌入front-matter的page_id将源文件与网页文件相关联
  • 2023-05-08 21:44:36博客架构修改升级
  • 2023-03-10 15:12:09Nginx+ZeroSSL证书部署
Acme.sh+ZeroSSL证书部署