自动化部署证书 acme.sh 使用教程

简介

acme.sh 是一个开源的 ACME 协议的客户端工具,用于自动化申请、更新和部署 SSL/TLS 证书。通过使用 acme.sh,用户可以轻松地在服务器上设置 HTTPS 加密连接,而无需手动操作。它支持多种 DNS 接口和证书颁发机构,可以与各种 Web 服务器和 DNS 服务集成,提供了方便的命令行工具和丰富的功能选项。目前 acme.sh 支持 5 个正式环境 CA,分别是 Let's Encrypt、Buypass、ZeroSSL、SSL.com 和 Google Public CA,默认使用 ZeroSSL。
链接:https://github.com/acmesh-official/acme.sh

配置安装

使用源码安装

bash 复制代码
git clone --depth 1 https://github.com/acmesh-official/acme.sh.git
cd acme.sh
./acme.sh --install -m username@example.com

请注意替换 username@example.com 为你自己的邮箱,避免无法收到上游证书的邮件通知。
安装完成后重新加载 Bash

bash 复制代码
source ~/.bashrc

开启自动更新

bash 复制代码
acme.sh --upgrade --auto-upgrade

选择默认 CA

目前 acme.sh 支持 5 个正式环境 CA,分别是 Let's Encrypt、Buypass、ZeroSSL、SSL.com 和 Google Public CA,默认使用 ZeroSSL,如果需要更换可以使用如下命令:
切换 Let's Encrypt

bash 复制代码
acme.sh --set-default-ca --server letsencrypt

切换 Buypass

bash 复制代码
acme.sh --set-default-ca --server buypass

切换 ZeroSSL

bash 复制代码
acme.sh --set-default-ca --server zerossl

切换 SSL.com

bash 复制代码
acme.sh --set-default-ca --server ssl.com

切换 Google Public CA

bash 复制代码
acme.sh --set-default-ca --server google

如果已有 ZeroSSL 帐号,可以在后台控制面板拿到 API Key,然后执行如下命令:

bash 复制代码
apt install jq
curl -s -X POST "https://api.zerossl.com/acme/eab-credentials?access_key=你的API_Key" | jq

输出内容如下:

bash 复制代码
{
  "success": true,
  "eab_kid": "kid字符串",
  "eab_hmac_key": "hmac_key字符串",
}

然后手动添加帐号:

bash 复制代码
acme.sh --register-account  --server zerossl \
        --eab-kid kid字符串  \
        --eab-hmac-key hmac_key字符串

Google Public CA 需要按照官方博客申请内测,然后获取 Key。

ps:本篇文章使用Let's Encrypt来做讲解。

使用DNS API部署

准备 DNS API

通过使用域名服务商提供的 API 密钥,让acme.sh自动创建域名验证记录以申请域名证书. acme.sh 支持全球各种域名服务商的 API ,本文将以阿里云为例.更多 DNS API 支持,请查看https://github.com/acmesh-official/acme.sh/wiki/dnsapi
登陆阿里云控制台 - 访问控制 RAM - 身份管理-用户

创建一个新用户:

勾选API调用访问:

复制保存好生成的AccessKey信息

授权该用户,搜索DNS,并将AliyunDNSFullAccess移动至右侧确定

根据官方dnsapi获取阿里云的API格式为:

bash 复制代码
export Ali_Key="LTAI4Fd8J9qs4fxxxxxxxxxx"
export Ali_Secret="Xp3Z7NDOW0CJcPLKoUwqxxxxxxxxxx"

配置 DNS API

acme.sh 程序目录为隐藏目录.acme.sh存放在当前用户家目录下.执行以下命令进入目录,并编辑account.conf,根据上文获取的 API 格式,复制粘贴到文件中保存.

bash 复制代码
cd
cd .acme.sh
vim account.conf

ps:目前 account.conf 仅支持一个 DNS API ,多个域名服务商的域名需单独加 --accountconf 参数: 相关 issues 链接https://github.com/acmesh-official/acme.sh/issues/2055

申请证书

自动 DNS 模式标准命令:

bash 复制代码
acme.sh --issue --server letsencrypt --dns dns_ali -d example.com -d www.example.com

acme.sh:是一个用于管理 SSL 证书、自动续订证书的工具。

--issue:表示要申请证书。

--server letsencrypt:指定使用 Let's Encrypt 作为证书颁发机构。

--dns dns_ali:指定使用 DNS 验证的方式来验证域名所有权,其中 dns_ali 表示阿里云 DNS 的插件,用于自动化 DNS TXT 记录的添加。

-d example.com -d www.example.com:指定要申请证书的域名,这里是 example.comwww.example.com。在申请通配符证书时,需要使用 -d '*.example.com' 这样的格式指定。
使用DNS验证生成证书(包含中间证书)

bash 复制代码
acme.sh --issue --dns dns_ali -d *.test.com --fullchain-file /home/ecs-user/test.pem --key-file /home/ecs-user/test.key

acme.sh:是一个用于管理 SSL 证书、自动续订证书的工具。

--issue:表示要申请证书。

--dns dns_ali:指定使用 DNS 验证的方式来验证域名所有权,其中 dns_ali 表示阿里云 DNS 的插件,用于自动化 DNS TXT 记录的添加。

-d *.test.com:指定要申请证书的域名,这里是 *.test.com,表示匹配所有 test.com 域名下的子域名。

--fullchain-file /home/ecs-user/test.pem:指定存储完整证书链的文件路径,证书链包括证书以及中间证书。

--key-file /home/ecs-user/test.key:指定存储私钥的文件路径。

这行命令的作用是通过阿里云的 DNS 服务来验证域名所有权,并向 Let's Encrypt 申请一个包含 *.test.com 的通配符 SSL 证书,然后将证书链存储到 /home/ecs-user/test.pem 文件中,将私钥存储到 /home/ecs-user/test.key 文件中。

自动部署

acme.sh 还支持自动部署证书到指定目录并重启nginx或apache服务,以确保新证书生效.官方参考如下:

bash 复制代码
acme.sh --installcert -d example.com \
--key-file       /path/to/keyfile/in/nginx/key.pem  \
--fullchain-file /path/to/fullchain/nginx/cert.pem \
--reloadcmd     "service nginx force-reload"

nginx.conf配置如下

验证证书安全等级

链接:https://www.ssllabs.com/

访问上面的链接,点击test you server,然后输入需要验证的域名:

下图是我的验证结果:

使用 HTTP 验证签发证书

首先我们要做一下准备工作,假设你域名是 example.com,解析到你的服务器让其生效后,我们建立一个目录:

bash 复制代码
mkdir -p /var/www/letsencrypt

我们的目的是绑定 http://example.com/.well-known/acme-challenge 到这个目录。

如果用的 Nginx,那么新建一个配置文件:

bash 复制代码
server {
	listen 80;
	listen [::]:80;
	server_name example.com;

	location /.well-known/acme-challenge {
		root /var/www/letsencrypt;
	}

	location / {
		rewrite	^/(.*)$ https://$host/$1 permanent;
	}
}

我们以 Let's Encrypt 为例,直接在终端运行:

bash 复制代码
acme.sh --issue -d example.com -w /var/www/letsencrypt

如果希望签发 ECC 证书,则运行

bash 复制代码
acme.sh --issue -d example.com --keylength ec-256 -w /var/www/letsencrypt

如果需要多个域名,则运行

bash 复制代码
acme.sh --issue -d example.com -d example.org -w /var/www/letsencrypt

自动化签发部署

ps:DNS验证版
使用脚本实现自动化

bash 复制代码
#!/bin/bash
cd
# 备份旧证书
cp /etc/nginx/cert/* /etc/nginx/sslbak
# 使用 acme.sh 生成新证书,此处使用了绝对路径来运行acme脚本,请按照实际情况操作。/home/ecs-user是我当前用户的家目录。
/home/ecs-user/.acme.sh/acme.sh --issue --dns dns_ali -d *.test.com --fullchain-file /home/ecs-user/test.pem --key-file /home/ecs-user/test.key --force

# 将新证书拷贝到 Nginx 证书目录
cp /home/ecs-user/test.pem /etc/nginx/cert/
cp /home/ecs-user/test.key /etc/nginx/cert/

# 重启 Nginx 以应用新证书(请根据实际情况选择适当的重启方式)
systemctl reload nginx

设置定时任务

bash 复制代码
echo "0 0 1 */2 *  /path/to/script.sh" >> /etc/crontab

每两个月运行一次。

相关推荐
舞动CPU6 小时前
linux c/c++最高效的计时方法
linux·运维·服务器
皮锤打乌龟6 小时前
(干货)Jenkins使用kubernetes插件连接k8s的认证方式
运维·kubernetes·jenkins
钰@7 小时前
小程序开发者工具的network选项卡中有某域名的接口请求,但是在charles中抓不到该接口
运维·服务器·小程序
wanhengwangluo7 小时前
云服务器和物理服务器的区别有哪些?
运维·服务器
秦jh_8 小时前
【Linux】多线程(概念,控制)
linux·运维·前端
yaosheng_VALVE8 小时前
稀硫酸介质中 V 型球阀的材质选择与选型要点-耀圣
运维·spring cloud·自动化·intellij-idea·材质·1024程序员节
看山还是山,看水还是。9 小时前
Redis 配置
运维·数据库·redis·安全·缓存·测试覆盖率
扣得君9 小时前
C++20 Coroutine Echo Server
运维·服务器·c++20
keep__go9 小时前
Linux 批量配置互信
linux·运维·服务器·数据库·shell
矛取矛求9 小时前
Linux中给普通账户一次性提权
linux·运维·服务器