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"