首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【保姆级教程】利用acme.sh获取免费的泛域名SSL证书,让你的域名不再有红色感叹号

【保姆级教程】利用acme.sh获取免费的泛域名SSL证书,让你的域名不再有红色感叹号

原创
作者头像
全栈开发日记
修改2025-09-09 15:33:31
修改2025-09-09 15:33:31
13900
代码可运行
举报
文章被收录于专栏:全栈开发日记全栈开发日记
运行总次数:0
代码可运行

1. 前言

1.1. acme.sh是什么?

acme.sh是一个利用ZeroSSL Let's Encrypt等受信任证书颁发机构(CA)自动化提供免费 SSL/TLS 证书的工具,可以用来部署 HTTPS,比certbot还要好用。

1.2. 泛域名SSL整数是什么?

单域名SSL证书只能对指定的域名部署HTTPS,比如你对域名example.com部署了单域名SSL证书,test.example.com还得再申请一个新的单域名SSL证书来部署HTTPS。

泛域名证书可以对*.example.com的所有子域名提供部署HTTPS,只需要一个SSL证书就可覆盖所有example.com下的子域名,如:test.example.comabc.example.com等。

1.3. 环境介绍

正常来说可以在任何主流操作系统中使用,以下教程示例是在Linux环境中进行。

2. 下载acme.sh

① 命令方式下载:

最方便的方式是使用以下命令安装

代码语言:javascript
代码运行次数:0
运行
复制
curl https://get.acme.sh | sh

但该方式使用的源是Github,没有科学上网可能会导致无法下载,可以通过访问国内的Gitee下载。

② 国内源Gitee手动下载:

Gitee地址:https://gitee.com/neilpang/acme.sh

使用Git克隆仓库文件到本地,或直接下载zip到本地后上传到你的服务器,反正最终的效果就是你要把这个仓库里的每一个文件都要弄到你的服务器中去。

3. 安装cron和socat

这两个应用是acme.sh依赖的,如果没有的话安装acme.sh时会警告。

代码语言:javascript
代码运行次数:0
运行
复制
apt update && apt install cron -y && apt install socat -y

4. 安装acme.sh

进入下载下来的acme.sh文件夹根目录执行以下命令:

代码语言:javascript
代码运行次数:0
运行
复制
./acme.sh --install

5. 重新加载环境变量

重新加载环境变量(或重新登录),不重新加载的话无法使用acme.sh命令。

下面的命令只需要执行其一即可,根据自己的情况:

代码语言:javascript
代码运行次数:0
运行
复制
source ~/.bashrc  # 适用于 bash
source ~/.zshrc   # 适用于 zsh

6. 注册ZeroSSL或切换默认CA为Let's Encrypt

acme.sh3.0版本之后默认的CA是ZeroSSL,首次使用需要进行注册。

代码语言:javascript
代码运行次数:0
运行
复制
acme.sh --register-account -m 这里写你的邮箱

② 或者也可以切换默认CA为Let's Encrypt。

代码语言:javascript
代码运行次数:0
运行
复制
acme.sh --set-default-ca --server letsencrypt

7. 设置DNS API配置到环境变量

根据不同的DNS服务商有不同的环境变量配置要求,acme.sh 目前支持超过一百家的 DNS API,访问以下链接可以查看你的域名托管服务商的相关配置:

https://github.com/acmesh-official/acme.sh/wiki/dnsapi2

这里以腾讯云和华为云举两个例子:

腾讯云,需要依次执行以下命令

代码语言:javascript
代码运行次数:0
运行
复制
export Tencent_SecretId="<Your SecretId>"
export Tencent_SecretKey="<Your SecretKey>"

登录腾讯云控制台,进入访问管理页面,进入访问密钥菜单栏下的API密钥管理可新建密钥,将对应的SecretIdSecretKey替换到上面命令中。

8. 生成SSL证书

这里以example.com为例生成SSL证书,这里生成的是泛域名证书,但必须同时有example.com*.example.com。并且example.com必须在前,否则你会发现即使签发成功了也没有任何文件输出。

代码语言:javascript
代码运行次数:0
运行
复制
./acme.sh --issue --dns dns_huaweicloud -d example.com -d *.example.com

9. 手动配置证书

生成SSL证书后在/root/.acme.sh/你的域名_ecc/目录下可以看到证书等文件。

将其中的证书、私钥复制到你Nginx配置证书的目录下,下面是复制命令示例:

代码语言:javascript
代码运行次数:0
运行
复制
cp fullchain.cer /docker/nginx/work/crt/
cp 域名.key /docker/nginx/work/crt/

Nginx中配置证书:

代码语言:javascript
代码运行次数:0
运行
复制
http {
  # ... 这里省略...
  server {
    listen 443 ssl;
    server_name  域名;
    # ... 这里省略...

    # SSL证书配置
    ssl_certificate /work/crt/fullchain.cer;
    ssl_certificate_key /work/crt/域名.key;

    # ... 这里省略...
  }
  # ... 这里省略...
}

10. 自动化部署证书

执行以下命令自动化部署证书:

代码语言:javascript
代码运行次数:0
运行
复制
acme.sh --install-cert -d "example.com" --ecc \
  --cert-file /docker/nginx/work/crt/cert.pem \
  --key-file /docker/nginx/work/crt/key.pem \
  --fullchain-file /docker/nginx/work/crt/fullchain.pem \
  --reloadcmd "docker restart nginx"

参数解释:

/docker/nginx/work/crt/cert.pem是部署后的域名证书地址。

/docker/nginx/work/crt/key.pem是部署后的私钥地址。

/docker/nginx/work/crt/fullchain.pem是部署后的域名证书及中间证书地址。

cert.pemfullchain.pem的区别是如果你的域名证书是某个中间CA签发的,而这个中间CA又是受信任的根 CA 签发或信任的,fullchain.pem把这些拼接起来,让客户端可以一步搞定信任验证。

执行后如果提示:It seems that tworice.cn is an IDN( Internationalized Domain Names), please install 'idn' command first.

执行以下命令安装idn即可:

代码语言:javascript
代码运行次数:0
运行
复制
apt install -y idn

11. 自动化续期证书

11.1. 自动创建定时任务

通过acme.sh --install-cert命令执行了自动化部署后,acme.sh会通过之前安装的cron自动创建一个定时任务。

使用如下命令查看是否成功创建了定时任务:

代码语言:javascript
代码运行次数:0
运行
复制
 crontab -l

正常结果显示应该是如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
28 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

解释:

该定时任务会在每天凌晨的0时28分执行/root/.acme.sh/acme.sh --cron --home /root/.acme.sh这个命令。

11.2. 验证定时执行的命令

查看/root/.acme.sh/域名_ecc文件夹下的域名.conf文件,文件中可以看到Le_RealKeyPath和Le_RealFullChainPath等配置项,表示自动化续期证书时要把证书部署在哪个位置。

对应的就是在执行以下命令时,对应的keyfullchain文件:

代码语言:javascript
代码运行次数:0
运行
复制
acme.sh --install-cert -d example.com --ecc \
  --key-file /docker/nginx/work/crt/example.com.key \
  --fullchain-file /docker/nginx/work/crt/fullchain.cer \
  --reloadcmd "docker restart nginx"

在前文中时的证书部署命令是将keyfullchain相关文件都部署为pem文件,这里是keycer文件,这个无所谓,效果是一样的。

acme.sh会记忆最后一次执行证书部署命令时的参数信息。

11.3. 修改定时执行的时间

免费证书是90天有效期,我们保证两个月更新一次证书即可,不需要每天一次这么频繁的判断证书是否有效。

把定时任务修改成每周二的凌晨三点检查一次即可。

① 修改定时任务:

代码语言:javascript
代码运行次数:0
运行
复制
crontab -e

② 选择编辑软件:

执行上面命令后会让你选择编辑软件,选择你常用的即可,我这里选择的是vim:

代码语言:javascript
代码运行次数:0
运行
复制
Select an editor.  To change later, run 'select-editor'.
  1. /bin/nano        <---- easiest
  2. /usr/bin/vim.basic
  3. /usr/bin/vim.tiny
  4. /bin/ed

Choose 1-4 [1]: 2

③ 修改定时任务为:

代码语言:javascript
代码运行次数:0
运行
复制
0 3 1 * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

vim的基础用法,进入文件后输入i进入编辑状态,编辑完之后按Esc退出编辑状态,:进入命令状态,在命令状态输入wq保存修改。其他操作可以自行百度一下,这里不多描述了。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 前言
    • 1.1. acme.sh是什么?
    • 1.2. 泛域名SSL整数是什么?
    • 1.3. 环境介绍
  • 2. 下载acme.sh
  • 3. 安装cron和socat
  • 4. 安装acme.sh
  • 5. 重新加载环境变量
  • 6. 注册ZeroSSL或切换默认CA为Let's Encrypt
  • 7. 设置DNS API配置到环境变量
  • 8. 生成SSL证书
  • 9. 手动配置证书
  • 10. 自动化部署证书
  • 11. 自动化续期证书
    • 11.1. 自动创建定时任务
    • 11.2. 验证定时执行的命令
    • 11.3. 修改定时执行的时间
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档