docker环境下配置cerbot获取免费ssl证书并自动续期
文章目录
- 实践场景
- 了解certbot
- 查看nginx的映射情况
- 操作目标
- 配置nginx配置的ssl证书
- 设置自动续签
实践场景
本人使用docker部署了一个nginx容器,通过容器卷,实现本地html,ssl,conf和ngiinx容器映射的, 经常需要手动部署免费证书,但是现在的证书免费期3个月太短了。
研究发现: 使用certbot,L可以通过脚本的形式来完成证书的颁发,通过设置定时任务在过期前重新申请和替换,就可以曲线救国的形式来完成ssl证书自动续期,解放双手。
了解certbot
Certbot 是一个免费、开源的软件工具,用于从 Let’s Encrypt 等证书颁发机构获取和自动更新 SSL/TLS 证书。
Certbot 实现颁发证书的原理
生成密钥对和 CSR(证书签名请求):
- Certbot 首先在服务器上生成一个密钥对,包括私钥和公钥。私钥将被严格保密,存放在服务器上,用于对数据进行加密和解密。公钥则包含在 CSR 中。
- CSR 是一个包含服务器信息(如域名、组织名称等)的文件,它是向证书颁发机构申请证书的请求。Certbot 会根据服务器的配置和用户提供的信息生成 CSR。
验证域名所有权:
证书颁发机构需要确保申请证书的人拥有该域名的所有权。Certbot 会通过多种方式来验证域名所有权,常见的方法有: - HTTP 验证:Certbot 在服务器上放置一个特定的文件,证书颁发机构会通过访问该文件来验证服务器是否对该域名有控制权。
- DNS 验证:在域名的 DNS 记录中添加特定的 TXT 记录,证书颁发机构通过查询 DNS 记录来验证所有权。
提交 CSR 并获取证书:
一旦域名所有权验证通过,Certbot 会将 CSR 提交给证书颁发机构,如 Let’s Encrypt。
证书颁发机构会对 CSR 进行审核,如果一切符合要求,就会颁发一个数字证书。这个证书包含了服务器的公钥、域名信息、颁发机构的数字签名等。
安装证书:
Certbot 将获取到的证书安装到服务器上的适当位置,通常是与服务器软件(如 Nginx、Apache 等)相关的配置文件目录中。
服务器软件在启动时会读取证书文件,并使用其中的公钥来建立安全的 HTTPS 连接。
自动更新:
Certbot 可以设置为定期自动更新证书,以确保证书在有效期内始终有效。通常,Let’s Encrypt 颁发的证书有效期为 90 天,Certbot 会在证书即将过期之前自动执行更新流程,无需人工干预。
查看nginx的映射情况
确认已经对外映射了容器卷(生成的证书要放在本地目录,便于映射给nginx容器)
docker inspect nginx

确认开放了80和443端口
操作目标

先不着急执行此命令,需要先去nginx的域名下面配置验证文件:
在nginx.conf下配置

对应关系如下:
宿主机和nginx容器对应文件目录
| 文件名称 | 文件拥有者 |
|---|---|
| /my/nginx/html | 宿主机目录位置 |
| /usr/share/nginx/html | nginx容器 |
宿主机和certbot容器对应文件目录
| 文件名称 | 文件拥有者 |
|---|---|
| /my/nginx/html/certbot | 宿主机目录位置 |
| /data/letsencrypt | cerbot |
执行上面的命令后, 验证文件会放在cerbot 容器的 /data/letsencrypt /.well-known/acme-challenge/,对应着 宿主机的 /my/nginx/html/certbot/.well-known/acme-challenge/ ,也就是对应nginx容器对应的
/usr/share/nginx/html/certbot/.well-known/acme-challenge/
。 通过这对应关系,后面才能执行成功。
# 处理特定后缀的请求location ~/.well-known/acme-challenge/ {root /usr/share/nginx/html/certbot;
}
执行命令:
docker run -it --rm --name certbot \-v /my/nginx/ssl/wiseinsightai/certbot/etc/letsencrypt:/etc/letsencrypt \-v /my/nginx/ssl/wiseinsightai/certbot/var/lib/letsencrpt:/var/lib/letsencrypt \-v /my/nginx/ssl/wiseinsightai/certbot/var/log/letsencrpt:/var/log/letsencrypt \-v /my/nginx/html/certbot:/data/letsencrypt \certbot/certbot certonly \--webroot \--webroot-path=/data/letsencrypt \--agree-tos -d XXX.com
正常情况下,执行成功,会生成证书,在/etc/letsencrypt/live/域名/live下,对应的宿主机目录下:
再根据对nginx容器的容器卷映射,转成nginx的目录:
即: # 对应 /my/nginx/ssl/wiseinsightai/certbot/etc/letsencrypt/live/域名
配置nginx配置的ssl证书
server {listen 80;listen [::]:80;server_name www.XXX.com XXX.com;server_tokens off;# 处理特定后缀的请求location ~/.well-known/acme-challenge/ {root /usr/share/nginx/html/certbot; }# http跳转到httpslocation / {return 301 https://XXX.com$request_uri;}# location / {# proxy_pass http://172.22.251.52:3000;# }}# 处理https请求server {listen 443 ssl;server_name XXX.com www.XXX.com;server_tokens off;# 对应 /my/nginx/ssl/wiseinsightai/certbot/etc/letsencrypt/live/XXX.com目录ssl_certificate /etc/nginx/ssl/wiseinsightai/certbot/etc/letsencrypt/live/XXX.com/fullchain.pem;ssl_certificate_key /etc/nginx/ssl/wiseinsightai/certbot/etc/letsencrypt/live/XXX.com/privkey.pem;ssl_session_timeout 5m;ssl_protocols TLSv1 TLSv1.1 TLSv1.2;ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;ssl_prefer_server_ciphers on;# root /usr/share/nginx/html;# index index.html;location / {// 自己的服务或者静态文件html地址proxy_pass http://172.22.251.52:3000;}}
配置好后,重启nginx容器,ssl证书就正式生效了!!!

设置自动续签
因为证书3个月就到期,我们可以设置一个定时任务,自动生成即可,cerbot的续签命令是renew关键字,
命令如下:
docker run -it --rm --name certbot \-v /my/nginx/ssl/wiseinsightai/certbot/etc/letsencrypt:/etc/letsencrypt \-v /my/nginx/ssl/wiseinsightai/certbot/var/lib/letsencrpt:/var/lib/letsencrypt \-v /my/nginx/ssl/wiseinsightai/certbot/var/log/letsencrpt:/var/log/letsencrypt \-v /my/nginx/html/certbot:/data/letsencrypt \certbot/certbot renew
将此命令写成放在脚本里面。

通过crontab -e设置定时执行该脚本:内容如下:
根据自己的需求设置定时时间,我这里设置12小时一次。
# 自动续签证书
0 */12 * * * /root/renew_cert.sh
注意: 只有到期30天内才能执行成功,否则,脚本会提示没过期,不需要续签,直接跳过

以上便是,使用docker版的cerbot在 已经安装nginx容器的情况下,获取免费ssl证书和设置自动续签的全部内容,
人无完人,如有错误,欢迎提出交流意见或者指正!!!
大功告成!!!
相关文章:
docker环境下配置cerbot获取免费ssl证书并自动续期
文章目录 实践场景了解certbot查看nginx的映射情况操作目标配置nginx配置的ssl证书设置自动续签 实践场景 本人使用docker部署了一个nginx容器,通过容器卷,实现本地html,ssl,conf和ngiinx容器映射的, 经常需要手动部署…...
Studying-多线程学习Part1-线程库的基本使用、线程函数中的数据未定义错误、互斥量解决多线程数据共享问题
来源:多线程编程 线程库的基本使用 两个概念: 进程是运行中的程序线程是进程中的进程 串行运行:一次只能取得一个任务并执行这一个任务 并行运行:可以同时通过多进程/多线程的方式取得多个任务,并以多进程或多线程…...
Flink 03 | 数据流基本操作
Flink数据流结构 DataStream 转换 通常我们需要分析的业务数据可能存在如下问题: 数据中包含一些我们不需要的数据 数据格式不方面分析 因此我们需要对原始数据流进行加工,比如过滤、转换等操作才可以进行数据分析。 “ Flink DataStream 转换主要作…...
在 TS 的 class 中,如何防止外部实例化
在 TypeScript(TS)中,如果你想要防止一个类被外部实例化,你可以采取以下几种策略: 将构造函数设为私有(Private Constructor): 通过将类的构造函数设为私有,你可以阻止外…...
HTML详解
HTML 基础HTML 标题HTML 段落HTML 链接HTML 图片HTML 元素HTML 注释HTML 属性HTML 文本格式化HTML 头部HTML cssHTML 表格HTML 列表HTML 自定义列表HTML 区块HTML 表单HTML 框架HTML 颜色HTML 脚本HTML 事件HTML 实体HTML urlHTML5 新元素 新元素 新元素 新元素 新元素 新元素 …...
记录|Modbus-TCP产品使用记录【德克威尔】
目录 前言一、德克威尔1.1 实验图1.2 DECOWELL IO Tester 软件1.3 读写设置1.4 C#进行Modbus-TCP读写 更新时间 前言 参考文章: 使用的第二款Modbus-TCP产品。 一、德克威尔 1.1 实验图 1.2 DECOWELL IO Tester 软件 这也是自带模块配置软件的。下图就是德克威尔的…...
基于深度学习的视频生成
基于深度学习的视频生成是一项极具前景的技术,旨在通过神经网络模型生成逼真的动态视频内容。随着生成对抗网络(GANs)、自回归模型、变分自编码器(VAEs)等深度学习模型的发展,视频生成技术已经取得了显著进…...
TB6612电机驱动模块(STM32)
目录 一、介绍 二、模块原理 1.原理图 2.电机驱动原理 三、程序设计 main.c文件 Motor.h文件 Motor.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 TB6612FNG 是东芝半导体公司生产的一款直流电机驱动器件,它具有大电流 MOSFET-H 桥结构ÿ…...
webpack信息泄露
先看看webpack中文网给出的解释 webpack 是一个模块打包器。它的主要目标是将 JavaScript 文件打包在一起,打包后的文件用于在浏览器中使用,但它也能够胜任转换、打包或包裹任何资源。 如果未正确配置,会生成一个.map文件,它包含了原始JavaScript代码的映…...
启动服务并登录MySQL9数据库
【图书推荐】《MySQL 9从入门到性能优化(视频教学版)》-CSDN博客 《MySQL 9从入门到性能优化(视频教学版)(数据库技术丛书)》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) Windows平台下安装与配置MyS…...
微服务_3.微服务保护
文章目录 一、微服务雪崩及解决方法1.1、超时处理1.2、仓壁模式1.3、断路器1.4、限流 二、Sentinel2.1、流量控制2.1.1、普通限流2.1.2、热点参数限流 2.2、线程隔离2.3、熔断降级2.3.1、断路器状态机2.3.2、断路器熔断策略2.3.2.1、慢调用2.3.2.2、异常比例,异常数…...
【设计模式】软件设计原则——依赖倒置合成复用
依赖倒置引出 依赖倒置 定义:高层模块不应该依赖低层模块,二者都应该依赖抽象;抽象不应该依赖细节,细节应该依赖抽象。面向接口编程而不是面向实现编程。 通过抽象使用抽象类、接口让各个类or模块之间独立不影响,实现…...
vue中如何实现组件通信
1. 父子组件通信 1. props和emits 我们最常见的组件通信就是父子组件数据通信。父子组件实现数据通信需要使用props和emit两个api。 在父组件中我们通过props将数据绑定给子组件,在子组件中我们可以通过props对象来收集到父组件传递的数据。 在子组件想要修改的pr…...
C/C++:内存管理
文章目录 前言一、内存分区1. 内存划分情况2. 最大内存计算 二、malloc/calloc/realloc 与 free1. malloc2. calloc3. realloc4. free5. 差异对比6. 失败处理 三、内存分配题目1. 题目2. 内存区域划分 四、C内存管理方式1. new 与 delete2. new/delete操作内置类型3. new和dele…...
jmeter学习(4)提取器
同线程组https://blog.csdn.net/vikeyyyy/article/details/80437530 不同线程组 在JMeter中,正则表达式提取的参数可以跨线程组使用。 通过使用Beanshell后置处理器和属性设置函数,可以将提取的参数设置为全局变量,从而在多个线程组之间共享…...
移动端的每日任务,golang后端数据库应该怎么设计
推荐学习文档 golang应用级os框架,欢迎stargolang应用级os框架使用案例,欢迎star案例:基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识,这里有免费的golang学习笔…...
1、Spring Boot 3.x 集成 Eureka Server/Client
一、前言 基于 Spring Boot 3.x 版本开发,因为 Spring Boot 3.x 暂时没有正式发布,所以很少有 Spring Boot 3.x 开发的项目,自己也很想了踩踩坑,看看 Spring Boot 3.x 与 2.x 有什么区别。自己与记录一下在 Spring Boot 3.x 过程…...
Vue根实例、实例总结
在Vue.js框架中,根实例和实例扮演着至关重要的角色。以下是对Vue根实例和实例的总结: Vue根实例 定义与创建: Vue根实例是Vue.js应用的核心。每个Vue应用都是通过用Vue函数创建一个新的Vue实例开始的,这个实例被称为根实例。根实…...
微服务架构:Spring Cloud的服务注册与发现、配置管理、服务网关、熔断器、分布式追踪
微服务架构是一种将应用程序构建为一组小型、自治的服务的方法,每个服务都运行在其独立的进程中,服务间通过轻量级通信机制(通常是HTTP API)进行通信。Spring Cloud是一套基于Spring Boot的微服务解决方案,它提供了一系…...
Spring Boot实现的大学生就业市场解决方案
1系统概述 1.1 研究背景 如今互联网高速发展,网络遍布全球,通过互联网发布的消息能快而方便的传播到世界每个角落,并且互联网上能传播的信息也很广,比如文字、图片、声音、视频等。从而,这种种好处使得互联网成了信息传…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...
实战设计模式之模板方法模式
概述 模板方法模式定义了一个操作中的算法骨架,并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。简单来说,就是在一个方法中定义了要执行的步骤顺序或算法框架,但允许子类…...
高防服务器价格高原因分析
高防服务器的价格较高,主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因: 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器,因此…...

