惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

GbyAI
GbyAI
T
Tenable Blog
Webroot Blog
Webroot Blog
L
Lohrmann on Cybersecurity
S
Securelist
S
Schneier on Security
NISL@THU
NISL@THU
Know Your Adversary
Know Your Adversary
C
Cybersecurity and Infrastructure Security Agency CISA
T
The Exploit Database - CXSecurity.com
L
LINUX DO - 热门话题
C
CXSECURITY Database RSS Feed - CXSecurity.com
O
OpenAI News
I
Intezer
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
TaoSecurity Blog
TaoSecurity Blog
S
Secure Thoughts
Application and Cybersecurity Blog
Application and Cybersecurity Blog
P
Privacy International News Feed
H
Hacker News: Front Page
N
Netflix TechBlog - Medium
M
MIT News - Artificial intelligence
博客园 - Franky
PCI Perspectives
PCI Perspectives
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Microsoft Azure Blog
Microsoft Azure Blog
MongoDB | Blog
MongoDB | Blog
L
LangChain Blog
P
Proofpoint News Feed
S
Security Affairs
WordPress大学
WordPress大学
The Last Watchdog
The Last Watchdog
S
SegmentFault 最新的问题
小众软件
小众软件
F
Full Disclosure
博客园 - 叶小钗
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
T
The Blog of Author Tim Ferriss
Simon Willison's Weblog
Simon Willison's Weblog
P
Palo Alto Networks Blog
Security Latest
Security Latest
P
Proofpoint News Feed
月光博客
月光博客
T
Tailwind CSS Blog
Scott Helme
Scott Helme
Hacker News - Newest:
Hacker News - Newest: "LLM"
Google Online Security Blog
Google Online Security Blog
T
Threat Research - Cisco Blogs
Help Net Security
Help Net Security
Project Zero
Project Zero

Liu Zijian's Blog | 一个技术博客

使用Filebeat采集Nginx日志到ES Python的协程 Python中的异常 Python中的类和对象 Python的函数 Python的数据结构,推导式、迭代器和生成器 Spring AI集成多模态模型 LangChain4j多模态 LangChain Tools工具使用 Python中的模块和包 Python全局环境和虚拟环境(venv) LangChain Prompt提示词工程 LangChain4j Tools工具使用 基于Dify搭建AI智能体应用 LangChain4j RAG检索增强生成 Spring AI实现MCP Server Spring AI集成MCP Client LangChain4j Prompt提示词工程 Spring AI使用知识库增强对话功能 Spring AI实现一个智能客服 Spring AI实现一个简单的对话机器人 实现MinIO数据的每日备份 自己实现一个DNS服务 简单理解AI智能体 大模型和大模型应用 LangChain开篇 LangChain4j开篇 一个解析Excel2007的POI工具类 DataPermissionInterceptor源码解读 TenantLineInnerInterceptor源码解读 BaseMultiTableInnerInterceptor源码解读 Spring AI开篇 SQL解析工具JSQLParser 芋道源码解读之多租户 芋道源码解读之数据权限 芋道源码解读开篇 Java实现将数据导出为Word文档 OA系统的天数该怎样计算 安装MySQL8 安装MySQL5.7 RockyLinux9环境下编译MySQL8 MySQL字符集及底层原理 Java实现LDAP登录 Docker Compose IPv4和IPv6 使用虚拟机安装一个K8s集群 使用GraalVM原生编译打包SpringBoot工程 Nginx防止目录穿越 Java线程的状态 Nginx防盗链设置 使用python将excel表格转换为SQL INSERT Redis的公共操作命令 Redis数据结构之Bitfleid Redis数据结构之Bitmap Redis数据结构之GEO Redis数据结构之Hash Redis数据结构之HyperLogLog Redis数据结构之List Redis数据结构之Set Redis数据结构之Stream Redis数据结构之String Redis数据结构之ZSet 使用python压缩图片 利用Python实现Hexo站点的持续集成 Nginx设置HTTPS监听 firewalld防火墙工具的使用 Linux信号(signal)机制 MySQL5.7x 主从复制 用IP自签发一个HTTPS证书 基于Hexo实现一个静态的个人博客 RockyLinux9环境下编译MySQL5.7 Docker离线安装 MySQL数据定义语言 Docker与联合文件系统 Docker的网络 Docker的镜像操作 MySQL存储过程 MyBatis-Plus开篇 MySQL变量 MySQL视图 MySQL事务 MySQL插入修改和删除 MySQL查询 MySQL系统命令 Docker的容器操作 Docker的安装和配置 Docker容器数据卷 浅谈OAuth2.0授权原理 JVM开篇 浅谈Linux(Unix)的I/O模型 一个通用的CloseableHttpClient工厂类 JUC可重入锁ReentrantLock JUC读写锁ReadWriteLock Java的单例 Java泛型 Java8的新特性 最近最少使用算法(LRU) MySQL函数 SpringBoot配置和启动 volatile作用分析
使用Certbot自动续签HTTPS证书
Liu Zijian · 2026-05-17 · via Liu Zijian's Blog | 一个技术博客

1.关于ACME

使用https加密是网站安全的必要条件,也是当前网站的标配,很多浏览器都已经默认发起https的请求,如网站不支持还会提示访问不安全。

但是https证书签发需要收费,对于一些小型组织和个人站长来讲也是一笔不小的费用,不过某些CA机构推出了公益性的免费证书计划,让小网站也实现免费的https加密,比如Let’s Encrypt(https://letsencrypt.org/zh-cn/getting-started/)就是目前全球规模最大、最具影响力的公益属性CA之一。但是因为小站更容易被攻击或管理不善导致发生私钥泄露进而使网站存在风险,各个公益性组织免费签发的证书寿命越来越短,从1年到半年再到3个月,2025年有的组织又压缩到一个半月,用频繁强制换新的方法来避免私钥一旦泄露网站会长期存在风险的问题,但这也对一些小网站的运维产生了不便,因为频繁手动更换证书非常麻烦。

现在可以通过ACME协议解决这个问题,实现自动续期证书,ACME是一套通信协议,规定了你的服务器(ACME客户端)和证书颁发机构(CA)之间,如何自动化地申请、验证、签发和续期证书。ACME流程大致是这样:ACME客户端先向CA机构申请证书,CA机构返回一个测试记录,要求ACME客户端将记录写入域名对应DNS记录或网站某个路径下证明其是域名的主人,ACME客户端完成后告诉CA机构已经完成验证,CA机构的服务器会去访问DNS记录或网站路径验证是否有测试记录,如有,则签发证书返回给ACME客户端。

事实上一些公益组织也不支持站长在其官网下单提交请求再下载证书,而是必须通过ACME客户端签发,Let’s Encrypt就是这样的。

2.使用Certbot申请证书

2.1 流程

Certbot(https://certbot.eff.org/pages/about),就是一个遵循了ACME协议的工具,而且默认对接的就是Let’s Encrypt,可以用它实现自动签发和续期免费证书,这里使用Certbot配合Cloudflare DNS演示基于DNS记录的域名持有者验证,大致流程是:

  1. Certbot先向Let’s Encrypt申请证书,Let’s Encrypt返回一个测试令牌,要求将测试令牌写入域名对应TXT DNS记录证明其是域名的主人。

  2. Certbot将Let’s Encrypt返回的令牌通过调用Cloudflare API,写入到对应域名的TXT DNS记录,完成后告诉Let’s Encrypt已经添加了测试记录。

  3. Let’s Encrypt会去访问该域名的DNS记录验证是否有对应的测试令牌,如有,则签发证书返回给Certbot。

除了Cloudflare外,Certbot也支持很多其他知名DNS服务商,详见:https://eff-certbot.readthedocs.io/en/stable/using.html#dns-plugins

Certbot设置好后,整个过程可以全流程自动完成。

2.2 具体操作

以Certbot配合Cloudflare为例

1.安装certbot和certbot的cloudflare插件,以rocky linux为例

yum install -y certbot python3-certbot-dns-cloudflare

2.要申请一个Cloudflare API KEY,在https://dash.cloudflare.com/profile/api-tokens,使用“编辑区域DNS”模板,并设置对应域名的DNS编辑权限,然后签发一个API KEY

mkdir -p /etc/letsencrypt/secrets/sudo vim /etc/letsencrypt/secrets/cloudflare.ini,将API KEY配置在对应配置文件中,然后设置配置文件权限

dns_cloudflare_api_token = **************
chmod 600 /etc/letsencrypt/secrets/cloudflare.ini

然后执行certbot certonly命令首次签发证书

  • --email 直接指定邮箱,不会弹出询问
  • --agree-tos 自动同意服务条款
  • --no-eff-email 不分享邮箱给 EFF
  • --non-interactive 全程不询问任何问题
  • -d liuzijian.com -d *.liuzijian.com 为liuzijian.com/*.liuzijian.com签发
certbot certonly \
  --dns-cloudflare \
  --dns-cloudflare-credentials /etc/letsencrypt/secrets/cloudflare.ini \
  -d liuzijian.com \
  -d *.liuzijian.com \
  --email me@liuzijian.com \
  --agree-tos \
  --no-eff-email \
  --non-interactive

成功后会返回日志以及证书私钥位置等信息

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for liuzijian.com and *.liuzijian.com
Waiting 10 seconds for DNS changes to propagate

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/liuzijian.com/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/liuzijian.com/privkey.pem
This certificate expires on 2026-08-15.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

证书由certonly申请后,以后都可以使用certbot renew命令续签证书,执行后会先检查,有效期不足30天才会真的续签

certbot renew

--dry-run参数可以演练签发,CA机构验证DNS通过,只会告诉certbot通过验证,不会真的签发证书

certbot renew --dry-run

还可以:

  • --cert-name liuzijian.com 只续签某个域名的
  • --force-renewal参数可实现不到30天也要强制续签,续签数量有限制,短时间内不能超过一定数额

可通过定时任务不断调用certbot renew实现每天或每周检查,快过期了则续签并刷新nginx,最终实现我们想要的效果

  • --quiet 只输出错误信息
  • --post-hook "systemctl reload nginx" 成功后触发
certbot renew --quiet --post-hook "systemctl reload nginx"

当然,生成的证书和私钥需要你自己指定到nginx 😜