系统运维

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

浅时光博客 · 2月18日 · 2024年 3.2k 次已读

一、ACME介绍


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

特点

  1. 兼容性:兼容 Unix 和类 Unix 系统,包括 Linux、FreeBSD、macOS 等。
  2. 无依赖:仅依赖于基本的 shell 环境和网络工具,无需安装额外的软件。
  3. 支持多种模式:支持 HTTP-01、DNS-01 和 TLS-ALPN-01 验证模式,能够在多种环境下工作。
  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文章来源(Source):https://www.dqzboy.com 的环境中获取和管理 SSL/TLS 证书。
  • 在需要自动化证书管理的服务器和网站上。
  • 在需要特定 DNS 验证或多域名/通配符证书的复杂部署中。

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

二、ACME安装


国外服务器

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

# 安装 ACME 脚本
curl https://get.acme.sh | sh

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

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

# 由于默认CA为ZeroSSL,必须先注册帐户才能颁发新证书,这里更换为Letsencrypt
acme.sh --set-default-ca --server letsencrypt

国内服务器

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

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

# 由于默认CA为ZeroSSL,必须先注册帐户才能颁发新证书,这里更换为Letsencrypt
acme.sh --set-default-ca --server letsencrypt

二、生成证书


1、获取DNS厂商API

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

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

2、颁发证书

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

export DP_Id="<id>"
export DP_Key="<key>"

acme.sh --issue --dns dns_dp -d "*.example.com" -d "example.com"
  • 上面命令参数介绍:
    • –issue:此选项指示acme.sh 发行(或获取)新的 SSL 证书。
    • –dns dns_dp这个选项指定了使用 DNS API 的方式来验证域名的所有权。dns_dp 表示使用 DNSPod 的 DNS API。使用 DNS API 可以自动化验证过程,特别是对于那些不方便修改 DNS 记录的场景。
    • -d:参数后跟的是要为其获取 SSL 证书的域名。第一个-d example.com指明为example.com域名获取证书。第二个-d *.example.com指明为example.com的所有子域(通过通配符*指定)获取证书。这被称为通配符证书,可以保护无限数量的子域。第一个 -d 后面跟的域名,它会被设置为证书的主要域名(主题备用名称,也称为SAN),通过浏览器在查看证书时显示的证书查看者就是此域名
  • 颁发成功后,证书文件将默认保存在 ~/.acme.sh/你的域名/ 目录中

3、安装证书

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

注意:上面使用了-d参数给几个域名生成了证书,这里安装时同样需要使用-d指定安装证书的域名

acme.sh --install-cert -d "*.example.com" -d "example.com" \
--cert-file /etc/nginx/cert.pem \
--key-file /etc/nginx/key.pem \
--fullchain-file /etc/nginx/fullchain.pem \
--reloadcmd "systemctl force-reload nginx"
  • 上面的命令参数介绍
    • – -install-cert此选项告诉 acme.sh 安装获取的 SSL 证书。
    • -d:这些参数指定了证书对应的域名。在这个例子中,它指定了通配符域名 *.example.com 和根域名 example.com
    • –cert-file:指定证书文件的安装路径。在这里,证书将被安装到 /etc/nginx/cert.pem
    • –key-file:指定私钥文件的安装路径。在这里,私钥将被安装到 /etc/nginx/key.pem
    • –fullchain-file:指定完整证书链文件的安装路径。在这里,完整证书链将被安装到 /etc/nginx/fullchain.pem。完整证书链通常包括您的域名证书和中间证书。
    • –reloadcmd:定义在安装证书后执行的命令,用于重新加载或重启服务(无需完全重启)以应用新证书。如果你是el6或以下版本,使用service nginx force-reload

4、更新配置

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

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

server {
    listen 443 ssl;
    server_name example.com www.example.com;

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

    # 其他配置项...
}

5、重载配置

文章来源(Source):浅时光博客置完成之后,我们可以通过下面的指令重新加载配置,使其配置生效

nginx -t
nginx -s reload

6、检查证书

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

三、定时更新


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. EricQ2024-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

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