Certbot实现 HTTPS 免费证书(Let‘s Encrypt)自动续期

news2024/12/24 11:45:45

Certbot实现 HTTPS 自动续期

以前阿里云支持申请一年的免费https证书,那每年我们手动更新证书并没什么大问题,但现在阿里云的免费证书仅支持3个月,这意味着每三个月都要要申请一下证书显得非常麻烦。

下面我们使用Certbot实现ssl证书的自动更新,这次我在Centos8的Nginx上进行演示如何配置SSL证书。

Certbot的安装

以下安装在CentOS8实操通过,其他系统可以参考:https://certbot.eff.org/instructions

要使用Certbot,首先需要安装:

yum install epel-release -y
yum install certbot -y

如果你安装过程中出现 “Couldn’t open file /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-8” 的错误,是由于缺少 EPEL 存储库的 GPG 密钥导致的。这个密钥用于验证从 EPEL 存储库下载的软件包的完整性和真实性。

需要先导入 EPEL 存储库的 GPG 密钥:

rpm --import https://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-8

然后重新安装上述安装命令即可安装成功。

生成 Let’s Encrypt 免费证书的命令参数

Let’s Encrypt 是免费 HTTPS 证书生成工具之一,由 Internet Security Research Group(ISRG)这个非营利组织提供ISRG的使命是使全球范围内的网站能够安全、自动化地使用HTTPS加密,并提供免费的 SSL/TLS 证书。

虽然 Let’s Encrypt 证书的有效期只有90天,但是可以自动续期。

使用 Certbot 工具生成 Let’s Encrypt 证书的手动验证命令:

certbot certonly --email example@qq.com --agree-tos -d ai.xxxxxx.top --manual --preferred-challenges dns

参数说明:

  • certonly: 用于生成 SSL/TLS 证书的工具插件。
  • --email example@qq.com: Let’s Encrypt 要求提供有效的电子邮件地址
  • --agree-tos:同意 Let’s Encrypt 的服务条款。
  • -d 'test.com':指定您想要为其生成 SSL 证书的域名。你可以通过添加多个 -d 选项来同时为多个域名生成证书。
  • --manual:在命令提示符下手动操作来验证您拥有该域名。
  • --preferred-challenges=dns:使用 DNS 验证方式进行证书颁发,需要将一个特定的 TXT 记录添加到 DNS 进行验证。

生成 Let’s Encrypt 证书的http验证命令:

certbot certonly --email example@qq.com --webroot -w /home/letsencrypt --preferred-challenges http-01 -d example.com

--preferred-challenges http-01:使用HTTP 验证方式生成证书。

--webroot -w /home/letsencrypt:用http做域名验证时,在目录/home/letsencrypt目录下产生对应的验证文件xxxx。

certbot通过访问http://example.com/.well-known/acme-challenge/xxxx便能完成验证。

通过DNS验证生成SSL证书

首先执行以下命令:

certbot certonly --email 604049322@qq.com --agree-tos -d ai.xxx.top --manual --preferred-challenges dns

首先会提示:We'd like to send you email about our work encrypting the web, EFF news, campaigns, and ways to support digital freedom.

我先输入Y回车同意(也可以输入N拒绝他们给你发邮件),然后出现如下提示:

image-20231212115626549

注意提示中的内容,下面我们在阿里云添加对应解析:

image-20231212115727526

阿里云中配置完成后,回到控制台回车确认,等待十秒钟后,提示Successfully received certificate.表示证书已经生成。

证书存储信息如下:

Certificate is saved at: /etc/letsencrypt/live/ai.xxx.top/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/ai.xxx.top/privkey.pem

此时修改Nginx的配置给需要使用https的server指定ssl证书:

ssl_certificate      /etc/letsencrypt/live/ai.xxx.top/fullchain.pem;
ssl_certificate_key  /etc/letsencrypt/live/ai.xxx.top/privkey.pem;

重启Nginx:

service nginx restart

可以使用以下网站测试目标网站的ssl:https://www.ssllabs.com/ssltest/

注意:使用DNS验证可以很方便的手动生成SSL证书,但是每次续期的时候要求填写的TXT记录都有可能不同,这意味着基于DNS验证的自动续期必须动态修改DNS的TXT记录。

虽然certbot 提供了一个 hook,可以在续期的时候让脚本调用 DNS 服务商的 API 接口动态添加 TXT 记录,但操作毕竟是复杂了很多,所以我们考虑使用j基于HTTP验证来自动续期生成SSL证书。

通过http验证生成SSL证书

certbot需要通过访问域名对应的地址完成验证,例如http://www.xxx.cn/.well-known/acme-challenge/abcd,如果访问无法访问,则需要给Nginx配置该路径可以访问,从而完成验证。

执行以下命令修改配置(根据配置文件实际位置修改):

vi /usr/local/nginx/conf/vhost/proj.conf

注意:一般yum安装的Nginx执行vi /etc/nginx/conf.d/proj.conf

添加如下配置:

server {
    listen 80;
    server_name www.xxxxxx.cn;
    location / {
        return 301 https://$server_name$request_uri;
    }
    location ^~ /.well-known/ {
        root /data/pro/ydz/web;
    }
}

然后使用service nginx reload命令重载配置。

然后通过http验证生成证书:

certbot certonly --email 604049322@qq.com --webroot -w /data/pro/ydz/web --preferred-challenges http-01 -d www.xxx.cn

然后可以看到ssl生成成功的提示Successfully received certificate.

然后就可以增加ssl配置:

server {
	listen 443 ssl http2;
	server_name  www.xxxxxx.cn;
	ssl_certificate      /etc/letsencrypt/live/www.xxxxxx.cn/fullchain.pem;
	ssl_certificate_key  /etc/letsencrypt/live/www.xxxxxx.cn/privkey.pem;
	location / {
	    root    /data/pro/ydz/web;
	    index  index.html index.htm;
	    error_page  404	http://www.xxxxxx.cn;
	}
    location ^~  /.well-known/ {
        root  /data/pro/ydz/web;
    }
}

再次重载配置nginx -s reload(两种命令都可以)。

自动更新证书

使用以下命令即可更新证书:

certbot renew

但有效期超过一个月的会自动跳过。

我们将该命令配置为crontab定时任务即可实现自动续签:

首先执行crontab -e,然后添加以下配置:

0 0 * * 1 /usr/bin/certbot renew >> /var/log/certbot-renew.log

crontab从左至右分别是:分钟、小时、日期、月份、星期几,以上配置代表每周一执行一次证书更新。

实例:配置openai反向代理

演示的操作系统:CentOS 7.6

由于这次我使用7.6版本的CentOS 进行演示,Python默认版本为2.7.5,运行会出现很多问题,所以我需要先调整Python环境:

pip uninstall urllib3 -y
pip uninstall requests -y
pip uninstall chardet -y
yum remove python-requests -y
yum remove python-urllib3 -y
pip install --upgrade --force-reinstall 'requests==2.6.0' urllib3
pip install chardet -U

然后安装certbot:

yum install certbot -y

使用openai会自动将http请求重定向到https上,如果我们的Nginx服务器不支持https就无法正常访问,所以必须配置使用https。

假设我们的域名为ai.haobanok.com。一开始没有SSL证书,首先进行基本配置便于http验证:

vi /etc/nginx/conf.d/gpt.conf

配置一下基本配置:

server {
    listen 80;
    server_name ai.haobanok.com;
    location ^~  /.well-known/ {
        root /var/www;
    }
}

注意:root指定的目录必须是nginx用户有权限访问的目录(否则对应请求都会返回403),上面的目录可以通过如下命令创建:

mkdir /var/www
chown -R nginx:nginx /var/www/

执行nginx -s reload重载配置。

可以尝试访问一下http://ai.haobanok.com/.well-known/acme-challenge/xxx,如果返回404说明正常,返回403大概率是Nginx所使用的用户,没有操作指定目录的权限,需要根据实际情况调整。

接下来我们使用certbot生成证书,直接使用http验证可能会缺少接入点。可以先使用dns验证生成接入点,dns验证命令:

certbot certonly --email example@qq.com --agree-tos -d ai.haobanok.com --manual --preferred-challenges dns

输入N拒绝后,直接Ctrl+C结束进程,接入点便注册完毕。

然后就可以通过http验证生成证书:

certbot certonly --email 604049322@qq.com --webroot -w /var/www --preferred-challenges http-01 -d ai.haobanok.com

稍等几秒钟后,证书生成完毕。由于certbot版本差异,提示信息与前面有所差异,这次生成完成的提示信息为:

-  Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/ai.haobanok.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/ai.haobanok.com/privkey.pem

证书生成完成,我们就可以配置openai反代了:

server {
	allow 183.12.0.0/16;
	allow 117.136.0.0/16;
	allow 27.38.6.0/24;
	allow 113.91.0.0/16;
	deny all;
	listen 80;
	listen 443 ssl http2;
	server_name ai.haobanok.com;
	ssl_certificate      /etc/letsencrypt/live/ai.haobanok.com/fullchain.pem;
	ssl_certificate_key  /etc/letsencrypt/live/ai.haobanok.com/privkey.pem;
	location / {
		proxy_pass  https://api.openai.com/;
		proxy_ssl_server_name on;
		proxy_set_header Host api.openai.com;
		proxy_set_header Connection '';
		proxy_http_version 1.1;
		chunked_transfer_encoding off;
		proxy_buffering off;
		proxy_cache off;
	}
	location ^~  /.well-known/ {
		allow all;
		root  /var/www;
	}
}

执行nginx -s reload重载配置。

保留/.well-known/前缀匹配保证未来更新证书的时候可以进行验证。

执行crontab -e添加每周自动检查更新:

0 0 * * 1 /usr/bin/certbot renew >> /var/log/certbot-renew.log

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1314877.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++相关闲碎记录(14)

1、数值算法 &#xff08;1&#xff09;运算后产生结果accumulate() #include "algostuff.hpp"using namespace std;int main() {vector<int> coll;INSERT_ELEMENTS(coll, 1, 9);PRINT_ELEMENTS(coll);cout << "sum: " << accumulate(…

C# WPF上位机开发(crc校验)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 为了验证数据传输的过程中有没有发生翻转&#xff0c;我们在传输报文的同时一般还会添加一个crc校验。对于modbus协议也是一样&#xff0c;它在数据…

帆软FCRP模拟题

制作步骤可见此博主&#xff1a;https://blog.csdn.net/Ipkiss_Yongheng/article/details/125594366 完成文件下载&#xff1a;【免费】帆软FCRP官网模拟题代码资源-CSDN文库

css的元素显示模式(有单行文字垂直居中,侧边栏等案例)

目录 1. 什么是元素的显示模式 2. 元素显示模式的类型 块元素 行内元素 行内块元素 3. 元素显示模式的转换 4.文字垂直居中 5.具体实现案例 1. 什么是元素的显示模式 定义&#xff1a;元素显示模式就是元素&#xff08;标签&#xff09;以什么方式进行显示&#xff0c;…

基于ssm居家养老系统论文

居家养老系统 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了居家养老系统的开发全过程。通过分析高校学生综合素质评价管理方面的不足&#xff0c;创建了一个计算机管理居家养老系统的方案。文章介绍了居家…

springboot升级到3.2导致mybatis-plus启动报错

在springboot升级到3.2时&#xff0c;服务启动报错 java.lang.IllegalArgumentException: Invalid value type for attribute ‘factoryBeanObjectType’: java.lang.String&#xff1a; java.lang.IllegalArgumentException: Invalid value type for attribute factoryBeanOb…

系统安全-WAF入侵防御系统测评指标

WAF&#xff08;Web Application Firewall&#xff09;是一种部署在web应用程序前面的安全系统&#xff0c;其作用是在用户请求到达web服务器之前对用户请求进行扫描和过滤&#xff0c;分析并校验每个用户请求的网络包&#xff0c;确保每个用户请求有效且安全&#xff0c;对无效…

maven工程中读取resources中的资源文件

maven工程的代码布局如下&#xff1a;在resources下面有一个资源文件test.properties&#xff0c;现在的目标要在Java代码中读取该资源文件中的内容。 test.properties资源文件的内容如下&#xff1a; Java代码如下&#xff1a; package com.thb;import java.io.BufferedR…

(c语言)输出一个十进制整数的二进制序列

#include<stdio.h> int main() {int x;scanf("%d",&x);for (int i 31; i >0; i--)//从前向后输出{if (((x >> i) ^ 0) 0) //当移位后全都是0时&#xff0c;进入下一个循环{continue; //需要输出完整二进制数时该判断语句删去}if (…

【SpringBoot】之Mybatis=Plus集成及使用(入门级)

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《SpringBoot开发之Mybatis-Plus系列》。&#x1…

​【EI会议征稿中】#先投稿,先送审#第三届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2024)​

#先投稿&#xff0c;先送审# 第三届网络安全、人工智能与数字经济国际学术会议&#xff08;CSAIDE 2024&#xff09; 2024 3rd International Conference on Cyber Security, Artificial Intelligence and Digital Economy 2024年3月1日-3日 | 中国南京 会议官网&#xff1a…

师兄啊师兄第二季开播:男主成海神?玄机是懂联动的!

《师兄啊师兄》动画第二季在12月14日终于正式开播&#xff0c;首播两集&#xff0c;还是很有诚意的。 这部动画改编自言归正传的小说《我师兄实在太稳健了》&#xff0c;原著的知名度不算很高&#xff0c;但玄机制作的动画让这个IP火出了圈。 动画第一季就凭借高颜值的人物建模…

【unity小技巧】unity最完美的CharacterController 3d角色控制器,实现移动、跳跃、下蹲、奔跑、上下坡,复制粘贴即可

最终效果 文章目录 最终效果前言为什么使用CharacterControllerSimpleMove和Move如何选择&#xff1f;1. SimpleMove2. Move 配置CharacterController参数控制相机移动跳跃下蹲处理下坡抖动问题实现奔跑和不同移速控制完整代码完结 前言 其实一开始我是不打算写的&#xff0c;…

新能源汽车的“一池春水”,或许不再由价格战掀起波澜?

2005年12月15日&#xff0c;丰田普锐斯混合动力车进入中国&#xff0c;拉开了国内新能源汽车发展的序幕。18年后的今天&#xff0c;国产及进口的新能源汽车已经渗透我国超三分之一的乘用车市场&#xff0c;与油车二分天下的愿景渐趋实现。 今年11月&#xff0c;随着购车需求进…

VLAN间的通讯---三层交换

一.三层交换 1.概念 使用三层交换技术实现VLAN间通信 三层交换二层交换 三层转发 2.基于CEF的MLS CEF是一种基于拓补转发的模型 转发信息库&#xff08;FIB&#xff09;临接关系表 转发信息库&#xff08;FIB&#xff09;可以理解为路由表 邻接关系表可以理解为MAC地址表…

从数据应用案例出发,探索2024年及未来的数据科学转型

如今&#xff0c;数据科学已经取得了长足的进步&#xff01;回顾数据科学的发展史&#xff0c;19世纪&#xff0c;人们使用基本统计模型收集、存储和处理数据。后来&#xff0c;当计算机进入万千家庭&#xff0c;数字时代正式到来&#xff0c;并由此产生了大量数据。互联网上数…

java实现局域网内视频投屏播放(二)爬虫

代码链接 视频播放原理 大多视频网站使用的是m3u8&#xff0c;m3u8其实不是一个真正的视频文件&#xff0c;而是一个视频播放列表&#xff08;playlist&#xff09;。它是一种文本文件&#xff0c;里面记录了一系列的视频片段&#xff08;segment&#xff09;的网络地址。这些…

ubuntu pycharm 死机,如何重启

1. 找出pycharm 进程的id 进入命令行&#xff1a; ps -ef 是查看当前运行的进程 值输入 ps -ef 会返回所有当前执行的进程&#xff0c;太多了&#xff0c;过滤一下&#xff0c;找到 pycharm : ps -ef | grep pycharm 2. 使用 kill -s 9 来杀死进程 如图所是&#xff0c;…

Visual Studio编辑器中C4996 ‘scanf‘: This function or variable may be unsafe.问题解决方案

目录 ​编辑 题目&#xff1a;简单的ab 1. 题目描述 2. 输入格式 3. 输出格式 4. 样例输入 5. 样例输出 6. 解题思路 7. 代码示例 8. 报错解决 方案一 方案二 方案三 方案四 总结 题目&#xff1a;简单的ab 1. 题目描述 输入两个整数a和b&#xff0c;…

产品Axure的元组件以及案例

前言 产品&#xff1c;Axure的安装以及组件介绍-CSDN博客经过上文我们可以知道我们Axure是一款适用于网站、移动应用和企业软件的交互式原型设计工具。它可以帮助用户创建高保真的交互式原型&#xff0c;包括线框图、流程图、模型、注释和规格等&#xff0c;以便与客户、开发人…