之前一直沿用的最老的服务器的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
作为守护进程提供服务, 如需注册/签发还需使用下面的脚本:- 目前的DNS解析修改为cloudflare, 那么之前的API接口也将发生改变, 参考文档: dnsapi · acmesh-official/acme.sh Wiki
bash1#!/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