# certbot操作指南



**一个免费SSL证书获取工具**



PS：如果是单机的话，不要使用docker来运行nginx，否则会为certbot的操作会增加复杂度。



## 前言

1. certbot是一个SSL证书（Let‘s Encrpt）申请工具，免费的SSL证书，每90天需要自己续期（可自动化），支持泛域名证书的申请
2. 如果要申请泛证书（例：*.zhixinghe1.top），需要使用DNS的验证方式，这个国内域名商的验证方式比较麻烦，需要自己手动操作或者找插件
3. 如果不熟悉操作，先加上--dry-run参数在测试环境中实操一下，再正式申请，否则失败次数过多，会有一段时间禁止申请
5. 如果同时操作申请多个域名（精准域名），也是只会生成一个SSL证书
5. 使用nginx插件的话，能够自动配置nginx，注：--dry-run在该情况下无法使用
6. 使用nginx插件的话，nginx必须能狗正常操作，certbot才能正常执行



## 常用命令

```shell
# 查看主机中的证书信息
certbot certificates

# 证书申请，--dry-run 即是测试环境，-a manual 交互式申请
certbot certonly -a manual --dry-run

# 证书申请，使用nginx插件，--dry-run在该情况下无法使用
certbot --nginx

# 从证书颁发机构撤回SSL证书，交互模式中选择同步删除本地机器中的证书，如果错过了，需要使用delete指令删除
# 证书名称指的是certbot certificates中的Certificate Name
cerbot revoke --cert-name 证书名称

# 从本地机器中删除证书，但是不会从证书颁发机构撤回SSL证书
# 没有任何参数，会进入交互模式
certbot delete

# 证书续期（可以把本机所有的都续期一次）
certbot renew --dry-run
```





## 申请步骤

1. 安装certbot

2. 执行证书申请命令，见常用指令。

3. 按交互界面往下操作

4. 如果是申请的精准域名，则按提示操作即可

5. 如果申请的是泛域名，需要进自己的域名供应商里的域名解析里，按格式把certbot提供的字符串加入到解析中

   ![](certbot%E6%8C%87%E5%8D%97.assets/certbot%E8%AF%81%E4%B9%A6%E7%94%B3%E8%AF%B7%E8%A6%81%E6%B1%82%E6%B7%BB%E5%8A%A0DNS%E8%AE%B0%E5%BD%95%E8%A7%A3%E6%9E%90-1733461524143.png)

   ![](certbot%E6%8C%87%E5%8D%97.assets/%E5%9F%9F%E5%90%8D%E4%BE%9B%E5%BA%94%E5%95%86DNS%E8%A7%A3%E6%9E%90.png)

6. 在nginx需要创建一个指定访问路径的文件，并放入certbot工具提供的字符串，供certbot验证

   ![](certbot%E6%8C%87%E5%8D%97.assets/certbot%E8%AF%81%E4%B9%A6%E7%94%B3%E8%AF%B7%E8%A6%81%E6%B1%82%E6%B7%BB%E5%8A%A0%E6%96%87%E4%BB%B6%E8%AE%B0%E5%BD%95.png)

   在nginx中通过配置一个文件路径，并把内容放到文件中即可

   ![](certbot%E6%8C%87%E5%8D%97.assets/certbot%E8%AF%81%E4%B9%A6%E7%94%B3%E8%AF%B7%E8%A6%81%E6%B1%82%E6%B7%BB%E5%8A%A0%E6%96%87%E4%BB%B6%E8%AE%B0%E5%BD%95-02.png)

   ![](certbot%E6%8C%87%E5%8D%97.assets/certbot%E8%AF%81%E4%B9%A6%E7%94%B3%E8%AF%B7%E8%A6%81%E6%B1%82%E6%B7%BB%E5%8A%A0%E6%96%87%E4%BB%B6%E8%AE%B0%E5%BD%95-03.png)

7. 证书申请成功后，nginx的SSL证书配置，如果是泛域名的SSL证书，可以在http块中直接使用SSL全局指令直接配置，否则需要自己一个个配置

   ```shell
   http {
   	ssl_certificate /path/to/your/fullchain.pem;
   	ssl_certificate_key /path/to/your/privkey.pem;
   }
   ```




## nginx插件的使用

1. 如果nginx的配置**conf.d文件夹**中没有default.conf的话，那么执行中可能没有输入待申请域名的选项。
2. 如果nginx的配置**conf.d文件夹**中有相关域名的配置的话，那么执行中可能没有输入待申请域名的选项，取而代之的是直接询问那个nginx中已配置域名需要启用SSL。

![](certbot%E6%8C%87%E5%8D%97.assets/certbot%E7%9A%84nginx%E6%8F%92%E4%BB%B6%E4%BD%BF%E7%94%A8.png)



### 自动续期

通过添加定时任务来自动对证书进行续期，每天0点、12点执行一次续期任务，并把信息输出到指定目录

```shell
# 编辑定时任务
crontab -e

# 查看定时任务
crontab -l

# 把要执行任务的写入crontab中
0 0,12 * * * /usr/bin/certbot renew --renew-hook "/usr/sbin/nginx -s reload" >> /home/zkpk/certbot-renew.log 2>&1
```



说明：renew只能，只有快要过期的证书才会进行续期，如果加了参数 --force-renew则不考虑时间直接强制续期



## 参考

* [Let's Encrypt 手动模式：泛域名 SSL 证书的免费解决方案](https://juejin.cn/post/6942896425738960926)
* [nginx配置静态文件 通过url访问](https://www.cnblogs.com/OneSeting/p/15525402.html)
* [docker部署certbot与nginx来获取ssl证书添加https及自动更新](https://www.cnblogs.com/vishun/p/15746849.html)
* [Nginx 通过 certbot 为网站自动配置 SSL 证书并续期](https://www.cnblogs.com/wzlinux/p/11188419.html)

