系统运维

使用Acme.sh自动生成和续订Lets Encrypt免费SSL证书

浅时光博客 · 2月18日 · 2024年 1.1w 次已读
AI 文章摘要 时光AI(本站开发)

一、ACME介绍


acme.sh 是一个使用 ACME 协议的 shell 脚本,主要用于自动获取、续订和安装 SSL/TLS 证书。它是一个轻量级的工具,与 Let's Encrypt 证书颁发机构(CA)以及其他支持 ACME 协议的 CA 兼容。下面是对 acme.sh 的主要特点和功能的介绍:

特点

  1. 兼容性:兼容 Unix 和类 Unix 系统,包括 Linux、FreeBSD、mac原文链接:https://dqzboy.comOS 等。
  2. 无依赖:仅依赖于基本的 shell 环境和网络工具,无需安装额外的软件。
  3. 支持多种模式:支持 HTTP-01、DNS-01 和 TLS-ALPN-01 验证模式,文章来源(Source):https://dqzboy.com能够在多种环境下工作。
  4. 集成 DNS API:与许多常见的 DNS 服务提供商的 API 集成,允许自动化 DNS 验证过程。
  5. 自动化:可以自动续订证书,并且有选项自动安装证书到指定服务,如 Nginx、Apache。

功能

  1. 证书获取:可以获取单域名、多域名(SAN)和通配符证书。
  2. 证书续订:自动续订证书,确保证书始终有效。
  3. 证书安装:支持自动将证书安装到 web 服务器或其他服务。
  4. DNS API 集成:自动通过 DNS-01 验证,特别有用于无法进行 HTTP 验证的场景,如通配符证书的获取。
  5. 支持 ECC RSA 证书:可以获取基于 ECC(椭圆曲线加密)和 RSA 的证书。
  6. 自定义钩子:支持在获取、续订和安装证书的过程中执行自定义脚本。

使用场景

  • 在不支持 Let's Encrypt 客户端或 Certbot 的环境中获取和管理 SSL/TLS 证书。
  • 在需要自动化证书管理的服务器和网站上。
  • 在需要特定 DNS 验证或多域名/通配符证书的复杂部署中。

项目地址:https://github.com/acmesh-official/acme.sh

二、ACME安装


国外服务器

说明:默认脚本走的是github地址,所以国内的服务器选择下面的命令进行安装

# 安装 ACME 脚本(邮箱使用真实有效的邮箱)
curl https://get.acme.sh | sh -s email=my@example.com

# 设置acme.sh别名,方便后续使用
alias acme.sh=~/.acme.sh/acme.sh

# 设置 ACME 脚本自动更新
acme.sh --upgrade --auto-upgrade

# 由于默认CA服务器是ZeroSSL,有时可能会导致获取证书的时候一直出现:Pending,这里更换为Letsencrypt
acme.sh --set-default-ca --server letsencrypt

# 关闭关闭自动更新(可选):
acme.sh --upgrade --auto-upgrade  0

国内服务器

# 克隆acme仓库,然后再进行安装
git clone https://gitee.com/neilpang/acme.sh.git
cd acme.sh
./acme.sh --install -m my@example.com

# 设置acme.sh别名,方便后续使用
alias acme.sh=~/.acme.sh/acme.sh

# 这里更换为Letsencrypt
acme.sh --set-default-ca --server letsencrypt

二、生成证书


1、获取DNS厂商API

这里我们需要获取你域名托管的DNS厂商的API授权信息,然后通过acme脚本去调用生成证书,比如我这里的使用的是DNSPod,获取DNSPod的API的ID和密钥信息

提示:每个平台的获取DNS权限的操作都不一样,阿里云平台是需要针对用户给予对应资源进行授权

2、颁发证书

使用 acme.sh 为您的域名颁发通用域名证书。请将 example.com 替换为您的实际域名:

注意:生成泛域名证书,必须同时有example.com*.example.com。并且example.com必须在前,否则你会发现即使签发成功了也没有任何文件输出

# DNSPod(DP_Id 和 DP_Key 将保存在 ~/.acme.sh/account.conf 中,并在需要时自动获取,无需手动再设置。)
export DP_Id="<DNSPod ID>"
export DP_Key="<DNSPod Token>"

acme.sh --issue --dns dns_dp -d example.com -d '*.example.com'

# Cloudflare
export CF_Key="your_cf_key" //此处替换成你自己的Key
export CF_Email="your_cf_email" //此处填写你给Cloudflare绑定的邮箱账号
 
acme.sh --issue --dns dns_cf -d example.com -d '*.example.com'

上面命令参数介绍:

参数作用说明
–issue签发证书告诉 acme.sh 要申请/签发新的 SSL 证书
–dnsDNS 验证方式使用 DNS API 验证域名所有权(适合通配符证书)
dns_dpDNSPod 提供商指定使用腾讯云 DNSPod 的 DNS API(dns_dp = DNSPod)
-d指定域名要申请证书的域名,可多次使用 -d 添加多个域名
  • 颁发成功后,证书文件将默认保存在 ~/.acme.sh/你的域名/ 目录中

3、安装证书

安装证书到 Nginx。假设 Nginx 的 SSL 证书路径为 /etc/nginx/ (确保这里的目录存在),请执行以下命令:

acme.sh --install-cert -d example.com \
--key-file       /path/to/keyfile/in/nginx/key.pem  \
--fullchain-file /path/to/fullchain/nginx/cert.pem \
--reloadcmd     "systemctl reload nginx"

上面的命令参数介绍

参数作用说明
–install-cert安装证书告诉 acme.sh 将已签发的证书复制/安装到指定位置(不是重新申请)
-d example.com指定主域名选择要安装的证书(对应之前 --issue 时申请的域名)
–key-file私钥安装路径将证书私钥(.key)复制到此路径,Nginx 的 ssl_certificate_key 指向这里
–fullchain-file证书链安装路径将完整证书链(.pem)复制到此路径,Nginx 的 ssl_certificate 指向这里
–reloadcmd重载命令证书安装成功后自动执行的命令,用于重载 Web 服务使新证书生效

4、更新配置

更新 Nginx 配置以使用新的 SSL 证书;这里我的nginx默认配置路径为:/etc/nginx/conf.d/default.conf

~]# vim /etc/nginx/conf.d/default.conf
# 注意修改下面的域名为你的实际域名
server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /etc/nginx/fullchain.pem;
    ssl_certificate_key /etc/nginx/key.pem;

    # 其他配置项...
}

5、重载配置

配置完成之后,我们可以通过下面的指令重新加载配置,使其配置生效

nginx -t
nginx -s reload

6、检查证书

直接查询服务器当前返回的证书信息,绕过浏览器缓存,看到”真实”的证书状态。

echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates

可以通过浏览器访问域名,并查看证书的相关信息

通过第三方SSL证书检测机构检测

三、定时更新


acme.sh会自动在服务器的crontab中加一条acme定时任务,从而实现续订证书,并在成功续订后重新加载 Nginx 服务

该定时任务会每日定时检查 1 次,如果证书更新时间已到,则会自动更新并安装证书。 可以通过acme.sh – -list命令查看证书的下次更新时间(见 Renew 列)。


本文作者:浅时光博客
原文链接:https://www.dqzboy.com/16437.html
版权声明:知识共享署名-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)协议进行许可,转载时请以>超链接形式标明文章原始出处和作者信息
免责声明:本站内容仅供个人学习与研究,严禁用于商业或非法目的。请在下载后24小时内删除相应内容。继续浏览或下载即表明您接受上述条件,任何后果由用户自行承担。

5 条回应

必须 注册 为本站用户, 登录 后才可以发表评论!

  1. EricQ山西·长治2024-5-18 · 21:36

    感谢博主的技术分享

  2. MK广东·深圳2024-2-29 · 17:27

    acme.sh –issue –dns dns_dp -d “mks.mkboy.top” -d mkboy.top 生成证书,用这个命令,报错429

    • MK广东·深圳2024-2-29 · 20:01

      知道原因,是阿里云上api授权问题导致的

  3. MK广东·深圳2024-2-29 · 16:34

    这个密钥,阿里云上面叫什么名字,找半天没看到

    • 浅时光博客2024-2-29 · 17:23

      阿里云在用户管理哪里给对应资源授权,手头没阿里云,自己查下阿里云的文档