自动更新SSL证书

逸兴
逸兴
逸兴
57
文章
25
评论
2025-02-1218:02:16自动更新SSL证书已关闭评论 7410字阅读24分42秒

现在免费的SSL证书只有三个月有效期,有一个博客和图床都用的ssl证书到期需要重新签发,挺麻烦的。原本想着写个脚本通过阿里云的 OpenAPI 进行证书的签发和部署,但是偶然发现了 ACME 这个项目,研究了下,这个项目用起来挺简单的,不自己写了,就用这个吧。

第一章 项目简介

ACME的全称是Automatic Certificate Management Environment(自动化证书管理环境)。它是一个协议,用于自动化数字证书的申请、验证和续期过程,尤其是针对SSL/TLS证书。ACME协议的出现,使得SSL/TLS证书的管理变得更加简便,特别是在免费的证书颁发机构(如Let’s Encrypt)的支持下,简化了证书的自动化流程。

接下来介绍的项目ACME 是一个用 Shell 脚本编写的客户端工具,用于与 ACME 服务器(如 Let’s Encrypt 或其他支持 ACME 协议的证书颁发机构)交互,自动化地申请、管理和续期 SSL/TLS 证书。相较于 Let’s Encrypt 等CA机构的原生工具,acme.sh 实现了更过的功能,并且简化了证书申请、部署流程。

acme.sh支持的CA机构:

现在的免费证书有效期是90天acme.sh自动创建 cronjob, 每天 0:00 点自动检测所有的证书,如果快过期了,需要更新,则会自动更新证书。

众所周知,为确保证书请求者拥有对特定域名的管理权,防止恶意用户获取他人域名的证书。CA机构生成ssl证书时需要进行域名验证,验证方式通常为 HTTP验证DNS验证

  1. HTTP验证

请求者(即证书申请者)需要在自己的网站根目录下的 .well-known/acme-challenge/ 路径下放置一个由 ACME 服务器生成的 验证文件。这个文件通常包含一些特定的内容(如一个随机生成的字符串),用于证明你对该域名的控制权。

然后,ACME 服务器 会尝试通过 HTTP 访问该路径,类似于访问 http://yourdomain.com/.well-known/acme-challenge/。如果它能够成功地访问到该文件,并且文件内容与预期一致,证明你对该域名有控制权,验证通过。一旦验证通过,ACME 服务器 就会签发证书给请求者。

  1. DNS验证

在DNS验证方法中,请求者需要在自己域名的 DNS 配置中添加一个特定的 TXT 记录。这个 TXT 记录的内容通常是由 ACME 服务器生成的一个唯一的令牌(token)。而 ACME 服务器 会通过查询 DNS 来验证该记录是否存在以及记录的值与是否预期一致,如果一致则为该域名签发SSL/TLS证书。

acme.sh 支持 HTTPDNS 两种验证方式。

下面介绍的是阿里云DNS的验证方式,如果你的域名解析是在其它厂商,则使用其它厂商的,支持的厂商 https://github.com/acmesh-official/acme.sh/wiki/dnsapi

因为有图床域名直接解析到了OSS,所以只能使用DNS验证,如果你的域名都是解析到了服务器,那么直接使用HTTP验证即可,DNS验证相对麻烦些。

1.2 项目部署

项目部署很简单,直接安装即可。

curl https://get.acme.sh | sh -s email=my@example.com
或者
wget -O -  https://get.acme.sh | sh -s email=my@example.com

普通用户和 root 用户都可以安装使用。

安装过程自动进行了以下几步:

  1. 把 acme.sh 安装到你的 home 目录下:

~/.acme.sh/

并创建 一个 shell 的 alias,例如 .bashrc,方便你的使用: alias acme.sh=~/.acme.sh/acme.sh

  1. 自动为你创建 cronjob, 每天的这个时候点自动检测所有的证书,如果快过期了,需要更新,则会自动更新证书。

比如:

image-20250211175104942

  • "/root/.acme.sh"/acme.sh:这是执行 acme.sh 脚本的路径。
  • --cron:这个选项表示在 cron 定时任务中运行 acme.sh,通常用于自动续期。
  • --home "/root/.acme.sh":指定 acme.sh 的安装路径或工作目录,确保它在正确的目录下运行。

然后,重新加载环境变量或者重新登录即可直接使用acme.sh

执行 
. "~/.acme.sh/acme.sh.env"
或者重新登录

第二章 配置DNS验证权限

acme.sh 会使用RAM用户 连接到云厂商DNS API,自动创建 txt记录,验证完成后会在删除该 txt记录,因此需要创建的 RAM用户 需要具有DNS云解析的管理权限。

https://ram.console.aliyun.com/users/create

image-20250211160920811

创建用户后保存好 AccessKey IDAccessKey Secret,然后添加云解析权限

添加权限时搜索DNS,找到 AliyunDNSFullAccess 添加即可。

image-20250211171415448

第三章 进行DNS验证并申请证书

首先将创建账户时保存的 AccessKeyAccessKey Secret 导出为全局变量,

[root@VM-24-15-centos .acme.sh]# export Ali_Key=""
[root@VM-24-15-centos .acme.sh]# export Ali_Secret=""

或者将上面的变量直接写入 /root/.acme.sh/account.conf 配置文件中(acme.sh运行时会加载这里面的变量)。

接下来DNS验证,如下 使用 --dns dns_ali 指定阿里云DNS API,acme.sh 会自动查询设置的 Ali_Key、Ali_Secret

-d 后面跟上要申请证书的域名。

然后,acme.sh 会连接 ACME服务器,验证DNS,如果成功则会签发 SSL证书。

acme.sh --issue --dns dns_ali -d www.hugbg.com

  • --issue:表示请求签发证书。
  • --dns dns_ali:表示使用 DNS 验证方法,dns_ali 是用于阿里云的 DNS API 插件,用于自动添加 TXT 记录进行验证。
  • -d www.hugbg.com:指定要为 www.hugbg.com 域名签发证书。
[root@VM-24-15-centos .acme.sh]# ./acme.sh --issue --dns dns_ali -d www.hugbg.com
[Tue Feb 11 15:39:35 CST 2025] Using CA: https://acme.zerossl.com/v2/DV90
[Tue Feb 11 15:39:35 CST 2025] Account key creation OK.
[Tue Feb 11 15:39:35 CST 2025] No EAB credentials found for ZeroSSL, let's obtain them
[Tue Feb 11 15:39:37 CST 2025] Registering account: https://acme.zerossl.com/v2/DV90
[Tue Feb 11 15:39:40 CST 2025] Registered
[Tue Feb 11 15:39:40 CST 2025] ACCOUNT_THUMBPRINT='1IOCo-LGV8Cf0UGVfCP-dGcfgYvaZgtYrqKhWRAtk3I'
[Tue Feb 11 15:39:40 CST 2025] Creating domain key
[Tue Feb 11 15:39:40 CST 2025] The domain key is here: /root/.acme.sh/www.hugbg.com_ecc/www.hugbg.com.key
[Tue Feb 11 15:39:40 CST 2025] Single domain='www.hugbg.com'
[Tue Feb 11 15:39:44 CST 2025] Getting webroot for domain='www.hugbg.com'
[Tue Feb 11 15:39:44 CST 2025] Adding TXT value: vRBmdVFiRS5o2muVunuwr95lSAoix0qTm6pQUxN2nBI for domain: _acme-challenge.www.hugbg.com
[Tue Feb 11 15:39:46 CST 2025] The TXT record has been successfully added.
[Tue Feb 11 15:39:46 CST 2025] Let's check each DNS record now. Sleeping for 20 seconds first.
[Tue Feb 11 15:40:07 CST 2025] You can use '--dnssleep' to disable public dns checks.
[Tue Feb 11 15:40:07 CST 2025] See: https://github.com/acmesh-official/acme.sh/wiki/dnscheck
[Tue Feb 11 15:40:07 CST 2025] Checking www.hugbg.com for _acme-challenge.www.hugbg.com
[Tue Feb 11 15:40:08 CST 2025] Please refer to https://curl.haxx.se/libcurl/c/libcurl-errors.html for error code: 35
[Tue Feb 11 15:40:17 CST 2025] Please refer to https://curl.haxx.se/libcurl/c/libcurl-errors.html for error code: 7
[Tue Feb 11 15:40:18 CST 2025] Success for domain www.hugbg.com '_acme-challenge.www.hugbg.com'.
[Tue Feb 11 15:40:18 CST 2025] All checks succeeded
[Tue Feb 11 15:40:18 CST 2025] Verifying: www.hugbg.com
[Tue Feb 11 15:40:20 CST 2025] Processing. The CA is processing your order, please wait. (1/30)
[Tue Feb 11 15:40:24 CST 2025] Success
[Tue Feb 11 15:40:24 CST 2025] Removing DNS records.
[Tue Feb 11 15:40:24 CST 2025] Removing txt: vRBmdVFiRS5o2muVunuwr95lSAoix0qTm6pQUxN2nBI for domain: _acme-challenge.www.hugbg.com
[Tue Feb 11 15:40:26 CST 2025] Successfully removed
[Tue Feb 11 15:40:26 CST 2025] Verification finished, beginning signing.
[Tue Feb 11 15:40:26 CST 2025] Let's finalize the order.
[Tue Feb 11 15:40:26 CST 2025] Le_OrderFinalize='https://acme.zerossl.com/v2/DV90/order/68zqU4eZEA2bzImiwA1JWg/finalize'
[Tue Feb 11 15:40:28 CST 2025] Order status is 'processing', let's sleep and retry.
[Tue Feb 11 15:40:28 CST 2025] Sleeping for 15 seconds then retrying
[Tue Feb 11 15:40:44 CST 2025] Polling order status: https://acme.zerossl.com/v2/DV90/order/68zqU4eZEA2bzImiwA1JWg
[Tue Feb 11 15:40:46 CST 2025] Downloading cert.
[Tue Feb 11 15:40:46 CST 2025] Le_LinkCert='https://acme.zerossl.com/v2/DV90/cert/qVpZUFffb815HFpNSdF7Yg'
[Tue Feb 11 15:40:47 CST 2025] Cert success.
-----BEGIN CERTIFICATE-----
MIID/jCCA4OgAwIBAgIRAM0wwzuS+J4JVeinmMavdOwwCgYIKoZIzj0EAwMwSzEL
。。。。。。。。。。。
-----END CERTIFICATE-----
[Tue Feb 11 15:40:47 CST 2025] Your cert is in: /root/.acme.sh/www.hugbg.com_ecc/www.hugbg.com.cer
[Tue Feb 11 15:40:47 CST 2025] Your cert key is in: /root/.acme.sh/www.hugbg.com_ecc/www.hugbg.com.key
[Tue Feb 11 15:40:47 CST 2025] The intermediate CA cert is in: /root/.acme.sh/www.hugbg.com_ecc/ca.cer
[Tue Feb 11 15:40:47 CST 2025] And the full-chain cert is in: /root/.acme.sh/www.hugbg.com_ecc/fullchain.cer
[root@VM-24-15-centos .acme.sh]# 

签发成功后,会自动保存 密钥信息,供下次自动使用。

image-20250211160708555

添加的txt记录也都自动删除了

image-20250211191521528

注意:

acme.sh 脚本默认 CA 服务器是 ZeroSSL,有时可能会导致获取证书的时候一直出现:Pending,The CA is processing your order,please just wait.

只需要把 CA 服务器改成 Let's Encrypt 即可,虽然更改以后还是有概率出现 pending,但基本 2-3 次即可成功

acme.sh --set-default-ca --server letsencrypt

更高级的用法请参考: https://github.com/acmesh-official/acme.sh/wiki/How-to-issue-a-cert

第四章 部署已签发的证书

证书生成好以后,我们需要把证书复制给对应的 Apache、Nginx 或其他服务器去使用。

必须使用 --install-cert 命令来把证书复制到目标文件,请勿直接使用 ~/.acme.sh/ 目录下的证书文件,这里面的文件都是内部使用,而且目录结构将来可能会变化。

4.1 部署到nginx

acme.sh --install-cert -d www.hugbg.com --key-file /data/hugbg/nginx/conf/conf.d/cert/www.hugbg.com.key --fullchain-file /data/hugbg/nginx/conf/conf.d/cert/www.hugbg.com.pem --reloadcmd "docker restart nginx"

  • --install-cert:表示安装证书。
  • -d www.hugbg.com:指定要安装证书的域名。
  • --key-file:指定私钥文件的路径,私钥是用于加密和解密通信的关键文件。
  • --fullchain-file:指定证书链文件的路径,包含了你的域名证书以及中间证书。
  • --reloadcmd:重新加载的命令,证书安装后会执行这个命令。
[root@VM-24-15-centos .acme.sh]# acme.sh --install-cert -d www.hugbg.com --key-file /data/hugbg/nginx/conf/conf.d/cert/www.hugbg.com.key    --fullchain-file  /data/hugbg/nginx/conf/conf.d/cert/www.hugbg.com.pem --reloadcmd  "docker restart nginx"
[Tue Feb 11 15:58:19 CST 2025] The domain 'www.hugbg.com' seems to already have an ECC cert, let's use it.
[Tue Feb 11 15:58:19 CST 2025] Installing key to: /data/hugbg/nginx/conf/conf.d/cert/www.hugbg.com.key
[Tue Feb 11 15:58:19 CST 2025] Installing full chain to: /data/hugbg/nginx/conf/conf.d/cert/www.hugbg.com.pem
[Tue Feb 11 15:58:19 CST 2025] Running reload cmd: docker restart nginx
nginx
[Tue Feb 11 15:58:20 CST 2025] Reload successful
[root@VM-24-15-centos .acme.sh]# 

image-20250211160432502

4.2 自动续签

到这一步就已经全部完成了,下面不需要其它配置,自动续签已经默认配置好了,还记得安装时候的那个计划任务吗?

image-20250211175104942

这个就是自动续签用的。

它会每天检查一遍acme.sh 申请的证书是否到期,到期前30天就会进行自动续签。

方便的地方在于,前面以前保存了DNS API,所以它会自动根据的API进行DNS验证,不需要手动执行了,以及后面的证书签发和部署的配置,它都已经保存了下来,都是自动进行的了。

我们可以手动执行下这个命令,看一下结果:

image-20250211175954357

可以看到每个证书的更新时间,它用的是 UTC+0**时区,+8h 即可东八区时间(CST)**。




https://www.hugbg.com/archives/3860.html
逸兴
  • 本文由 发表于 2025-02-1218:02:16
  • 除非特殊声明,本站文章均为原创,转载请务必保留本文链接
推导式、生成式与生成器 基础语法

推导式、生成式与生成器

推导式 概述 Python中的推导式是一种快速、简洁的数据结构创建方式,不需要手动创建数据结构中的每一个元素,类似于给出一个规律,python会根据这个规律自动填充数据结构。支持有列表推导式、字典推导...
CVE-2024-38077 Windows RDL漏洞检测修复方法(末尾) 默认分类

CVE-2024-38077 Windows RDL漏洞检测修复方法(末尾)

一、漏洞详情 Windows Server是由微软开发的操作系统系列,专为服务器环境设计,用于管理网络、数据存储和应用程序的运行。它为企业和组织提供了稳定、可靠的服务器平台,支持各种规模的网络基础设施...
Django DRF禁用URL末尾斜杆(:) 点点滴滴

Django DRF禁用URL末尾斜杆(:)

一、关于URL末尾斜杆 比如http://127.0.0.1:8000/api/v1/register 和 http://127.0.0.1:8000/api/v1/register/, 这两个是同一...
Mac pip安装mysqlclient报错 默认分类

Mac pip安装mysqlclient报错

问题详情 环境: Mac OS14.4, Python3.10, Django 5.0 mac 上使用docker运行了一个mysql容器, 然后终端中安装了brew install mysql-cl...