1.http与https
- 简单的说:
- https = http+ssl(安全访问)
- https 比较安全
2.Let's Encrypt
- 想要 https 就是购买证书
- 在 Let's Encrypt可以免费申请证书
- 官网
3.Certbot
- Let's Encrypt 官网提供的服务端的API 但是 作为使用者 还是别去研究API
- 官网有很多语言的客户端的 (java,go)
- 官网要推荐的客户端 cerbot
4.开启 Certbot 之旅
- 好像有多种模式 ,多种插件 (多条岔路容易错误)
- 无插件 certbot 完成对SSL证书的 申请和续约
4.1 准备环境
- 系统 debian (debian:buster-slim)
- 需要能连接互联网
- 会用apt命令
4.2 安装certbot
- 更新 apt 源索引
createTime: 2021-07-29T10:15:04+08:00
updateTime: 2021-07-29T10:15:04+08:00 - 安装 certbot
- apt install certbot
4.3 使用certbot
-
安装申请证书
-
1certbot certonly --agree-tos --server https://acme-v02.api.letsencrypt.org/directory \ 2 -m xx@qq.com -d xxx.top --manual --preferred-challenges dns \
-
createTime: 2021-07-29T10:15:04+08:00
updateTime: 2021-07-29T10:15:04+08:00
--manual-public-ip-logging-ok
--dry-run
```
-
解释
- certonly 只是申请证书
- --agree-tos 表示同意后面选项
- --server api请求到的地址
- -m 后面加邮箱
- -d 后面加域名 也可以是泛域名 *.xx.top -d 可以加多个
- --manual 通过交互式方式,或 Shell 脚本手动获取证书
- --preferred-challenges 通过什么方式 验证域名是你的
- --manual-auth-hook 验证过程中会调用后面方法 (看后面解释)
- -n 已非交互式 就是不需要选择的方式 (直接全部同意)
- --manual-public-ip-logging-ok 同意你的iP被记录
- --dry-run 就是测试是否通过 如果不加 失败几次就不能测试了 或者通过几次 也不能测试了
- 具体限制地址 dry-run 限制策略
createTime: 2021-07-29T10:15:04+08:00
updateTime: 2021-07-29T10:15:04+08:00
1+ ```
2 CERTBOT_DOMAIN:正在验证的域
3 CERTBOT_VALIDATION:验证字符串
4 CERTBOT_TOKEN:HTTP-01 挑战的资源名称部分(仅适用于 HTTP-01)
5 CERTBOT_REMAINING_CHALLENGES:当前挑战之后剩余的挑战数
6 CERTBOT_ALL_DOMAINS:用逗号分隔的当前证书所面临的所有域的列表
7 ```
8
9+ 最主要还是 CERTBOT_VALIDATION
10
11 + shell可以通过echo ${CERTBOT_VALIDATION} 脚本获取
12 + go可以通过 var accessKeyID = os.Getenv("CERTBOT_VALIDATION") 获取
13
14+ 通过这个脚本 完成一下操作
15
16+ | 主机记录 | 记录类型 | 解析线路 | 记录值 | TTL | 状态 |
17 |------|-------- | -------| ----| ----| ----|
18 | _acme-challenge | TXT | 默认 | CERTBOT_VALIDATION | 10分钟 | 正常 |
19
20+ 通过域名服务商 提供的API 完成 添加或者更新 DNS的解析
21
22+ 完成以后 最好让脚本程序 睡眠10秒 (更改没那么快)
-
这样就完成了全自动申请证书了
-
续期证书
-
因为证书申请下来 有效期为90天 90天后就需要吧
-
续签命令
-
-
createTime: 2021-07-29T10:15:04+08:00
updateTime: 2021-07-29T10:15:04+08:00
```
1+ 目前这个命令还没测试 通过 (证书没有过期)
2
3+ 可以用定时任务进行 上述命令
4.4 收尾操作
- 产生证书目录 /etc/letsencrypt/live
- 可以和nginx 等其它配置结合
5.额外需要封装
5.1封装docker化
dockerFile
-
1FROM registory.dongshanxia.top:35000/docker/debian:2.6 2ENV CERRBOT_DIR=/etc/letsencrypt/ 3ENV CERRBOT_CONFIG=$CERRBOT_DIR/live 4ENV SLEEPTIME=600 ## renew的查询的间隔时间 5## certbot 6RUN top_install_packages certbot ## 安装certbot 7shell 8COPY TopALiDns /root/TopALiDns ## 更新ali dns的脚本 9shell 10shell
-
最主要是基于debian
start_certbot.sh
-
1#!/bin/bash 2set -xv 3#mysql初始化 4INIT_GET_CERBORT(){ 5 Config_Count=`ls ${CERRBOT_CONFIG} |wc -l` 6 if [[ "${Config_Count}" -ge 1 ]] 7 then 8 echo "证书已经安装不需要再次申请" 9 else 10 echo "证书没有 需要重新申请" 11 certbot certonly --agree-tos --server https://acme-v02.api.letsencrypt.org/directory \ 12 -m 邮箱@qq.com -d 域名 --manual --preferred-challenges dns \
createTime: 2021-07-29T10:15:04+08:00
updateTime: 2021-07-29T10:15:04+08:00
fi
}
sleep_stop(){
process=ps -ef | grep start_sleep.sh | grep -v grep |awk '{print $2}'
kill -15 $process
kill -18 $process
exit
}
#RENEW_DAEMON守护脚本
RENEW_DAEMON(){
echo 'RENEW_DAEMON'
while :
do
trap 'sleep_stop' SIGTERM
trap 'sleep_stop' SIGINT
1 echo 'RENEW_DAEMON'
createTime: 2021-07-29T10:15:04+08:00
updateTime: 2021-07-29T10:15:04+08:00
chmod +x /root/start_sleep.sh
/root/start_sleep.sh ${SLEEPTIME} &
wait $!
done
}
echo '开始INIT_CERBOT'
INIT_GET_CERBORT
RENEW_DAEMON
1
2+ 脚本功能解释
3
4+ ```mermaid
5graph TD
6 A[Start] --> B{是否有申请好的证书};
7 B -->|Yes| C[进入renew证书];
8 D --> F[申请证书]
9 F --> C;
10 B ---->|No| D[进入申请证书];
11 C -->G[进入循环续签证书];
12 G -->|循环 sleep| G;
docker-compose.yml
-
1# 在工作目录下创建 docker-compose.yml 文件,编辑以下内容 2version: "3" 3services: 4 nexus: 5 image: registory.dongshanxia.top:35000/docker/certbot:1.0 6 container_name: certbot 7 hostname: 10.168.2.70 8 restart: always 9 privileged: true 10 working_dir: /root 11 environment: 12 - profile="" 13 volumes: 14 - /etc/nginx/cert:/etc/letsencrypt/live 15 logging: 16 driver: "json-file" 17 options: 18 max-size: "10m" 19 max-file: "5"