← 返回首页

在linux上配置自动下载免费数字证经历

服务器运维 亲身经历 公开
内容简要
通过acme.sh脚本和DNSPod自动申请、续期Let's Encrypt免费SSL证书,实现网站或微信小程序的HTTPS访问。
坑点
忽略DNSPod API密钥的获取和配置,导致无法自动添加DNS记录验证域名所有权。
注意事项
  • 安装acme.sh脚本并设置默认CA为Let's Encrypt。
  • 获取DNSPod的API密钥(DP_Id和DP_Key)。
  • 将DP_Id和DP_Key设置为环境变量,并确保acme.sh能够访问。
  • 使用acme.sh申请证书,确保正确添加所有需要验证的域名。
  • 将证书复制到Nginx可用的位置,并配置Nginx使用新证书。
  • 确认自动续期已配置,确保证书到期前自动续期。

我有申请域名,对于我们普通人来说申请收费的数字证书觉得很贵,一个正规的数字证书商用的要几千一年,这种开支完全没必要,一般的免费的数字证书也只能使用三个月,每三个月申请一次很麻烦,有时可能还会忘了申请和更新,但现在的域名很多都必须要https访问,像微信小程序都要求必须要https,因此要想做网站或者微信小程序申请证书是必然的。

有没有免费的证书可以长期有效呢,或者三个月的也行有没办法自动申请然后更新呢

后来终于找到了一个方法,虽然证书也只有三个月,但是他是自动的。

基本原理就是从网上下载一个acme.sh脚本,然后再执行这个脚本,然后把acme设置到环境变量中,这样脚本可以找到和执行了,然后我们设置默认的证书机构Let's Encrypt,设置好证书机构后我们就要取得我们自己域名的API 密钥,主要目的就是通过这个api我们能证明域名我有权限管理和控制,你就是证明这个域名是不是自己的,acme.sh发起一个api调用在DNS中写一个txt文本来证书这个api是可以操作这个域名的,如果操作成功也代表这个域名你有权限控制然后就会Let's Encrypt官方下载这个域的证书,放到指定acme相应的目录下,最后一步就是设置acme把证书复制到指定的目录中给其它的软件使用,同时可以重新加载配置使证书生效,整个过程就算完成了。

用 acme.sh + DNSPod 给服务器自动搞定 HTTPS 证书

第 1 步:安装 acme.sh

是什么:acme.sh 是一个纯 Shell 脚本工具,专门用来跟 Let's Encrypt 通信,自动申请、续期免费 SSL 证书。比 Certbot 轻量,不依赖 Python。

执行:

curl https://get.acme.sh | sh -s email=你的邮箱@163.com
把 你的邮箱@163.com 换成你真实邮箱。Let's Encrypt 会用这个邮箱发证书到期提醒(虽然现在默认不发了,但填了保险)这段命令就是下载并安装 acme.sh(一个用 Shell 写的 Let's Encrypt 证书自动续签工具),同时用你的 163 邮箱完成注册。 安装完成后,你就可以用 acme.sh 命令来申请和自动续签 HTTPS 证书了。 安全提示: 这种 curl | sh 的一键安装方式虽然方便,但本质上是下载并执行远程代码。建议在执行前先用 curl https://get.acme.sh 查看脚本内容,确认无误后再执行。

装完之后让命令立刻生效:

source ~/.bashrc

验证装好了没:

~/.acme.sh/acme.sh --version

看到版本号就说明安装成功。

⚠️ 为什么用 ~/.acme.sh/acme.sh 而不是直接 acme.sh?因为安装脚本默认不往 PATH 里写全局命令,用完整路径最稳,不会找不到。

第 2 步:告诉 acme.sh 用 Let's Encrypt

是什么:acme.sh 默认用的 CA 是 ZeroSSL。我们要换成 Let's Encrypt,因为免费、兼容性好、社区资料多。

~/.acme.sh/acme.sh --set-default-ca --server letsencrypt
这步只做一次,以后所有操作都默认走 Let's Encrypt。

第 3 步:去 DNSPod 拿 API 密钥(关键!)

为什么要这步:Let's Encrypt 签发证书前必须确认"这个域名是你的"。验证方式有几种,我们选的是 DNS 验证——让服务器自动在你的 DNS 里加一条临时 TXT 记录来证明所有权。要做到"自动",就需要把 DNSPod 的 API 权限交给 acme.sh。

操作:

  1. 登录 DNSPod 控制台
  2. 右上角头像 → 密钥管理​ → 创建密钥
  3. 记下两个东西:
  • ID(就是 DP_Id)
  • Token(就是 DP_Key)
⚠️ Token 只显示一次,关掉页面就看不见了,赶紧复制保存。

我用的域名是腾讯申请,因此使用腾讯后台申请,这里有一个我们要注意的就是dnspod控制台不容易找到,我是直接输入网址直接进入的,因此不容易忘记我们最好保存这个网址:https://console.dnspod.cn/account/token/token

还有就是这个DNSPod Token这个不好找,我们要点击右角上角头像,才会出现一个API密钥,才会出现界面,同时默认的是腾讯云API密钥这个不是我们要的,然还要点击右边那个DNSPod Token才找到,有时真怀疑他是故意不想让你找到。

image.png

第 4 步:把密钥告诉 acme.sh

是什么:把上一步拿到的 ID 和 Token 导出为环境变量,acme.sh 拿到后才能调用 DNSPod API 自动加 DNS 记录。

export DP_Id="你刚才拿到的ID"
export DP_Key="你刚才拿到的Token"
这两行只在当前终端会话有效。但 acme.sh 会自动把它们保存到 ~/.acme.sh/account.conf,以后续期不用再 export。所以你只管执行就行。

image.png

第 5 步:申请证书

是什么:正式向 Let's Encrypt 发起申请。acme.sh 会调用 DNSPod API 自动添加验证记录 → Let's Encrypt 检查 → 签发证书 → 自动清理验证记录。

~/.acme.sh/acme.sh --issue --dns dns_dp -d example.com -d www.example.com
把 example.com 换成你自己的域名。想加几个子域名就多写几个 -d,这里有一点注意的是我们有两个-d,在我们看来两个域名不是同一个域名吗,为何要两个,其实在DNS中算两个不同的域名,www只是子域名,我们可以到域名中看看我们的A记录。

执行过程中你会看到:

  • 添加 TXT 记录 → 等待生效 → 验证通过 → 证书签发完成

证书文件在哪?

~/.acme.sh/example.com/
├── example.com.key      # 私钥
├── fullchain.cer        # 完整证书链
└── ...
⚠️ 不要直接在 Nginx 里引用这个目录的证书!​ 因为 acme.sh 更新后文件名/路径可能变,而且权限可能不对。下一步解决。

第 6 步:把证书"安装"到 Nginx 能用的地方

为什么要单独这一步:acme.sh 自己目录里的证书是"原始文件",我们要把它复制到一个固定位置,这样 Nginx 配置不用改,而且续期后自动更新。

先建个目录放证书:

mkdir -p /www/server/nginx/ssl2

执行安装命令:

~/.acme.sh/acme.sh --install-cert -d example.com --key-file /www/server/nginx/ssl2/example.com.key --fullchain-file /www/server/nginx/ssl2/example.com.crt  --reloadcmd "/www/server/nginx/sbin/nginx -s reload"

这条命令做了什么(很重要):

参数作用
--key-file把私钥复制到你指定的位置
--fullchain-file把完整证书链复制到你指定的位置
--reloadcmd证书更新后自动执行这条命令重载 Nginx,不加这个 Nginx 不会用新证书​
⚠️ --reloadcmd 里的 nginx 路径按你实际安装位置改。不确定在哪就 which nginx 或 ps aux | grep nginx 看看。 acme.sh 会把 --reloadcmd 的信息记录在 ~/.acme.sh/ 目录下的域名配置文件中(例如 ~/.acme.sh/example.com/example.com.conf),然后在每次 crontab 执行续期检查时,读取这些配置并自动执行 reload 命令。 ## 验证方法 你可以用以下命令确认配置是否生效: bash 编辑 CODE9 输出中会包含类似: 文本 编辑 CODE10 这说明续期后的重载命令已经正确记录了。

第 7 步:配置 Nginx 使用证书

编辑你的 Nginx 站点配置(找到对应的 server 块):

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

    ssl_certificate     /www/server/nginx/ssl2/example.com.crt;
    ssl_certificate_key /www/server/nginx/ssl2/example.com.key;

    ssl_protocols TLSv1.2 TLSv1.3;

    # 其他配置...
}

检查配置有没有写错:

nginx -t

重载 Nginx 生效:

/www/server/nginx/sbin/nginx -s reload
现在访问 https://example.com,浏览器地址栏应该出现🔒了。

第 8 步:确认自动续期已就位

是什么:Let's Encrypt 证书只有 90 天有效期。acme.sh 安装时会自动往 crontab 里加一条定时任务,每天检查,证书快到期时自动续。

确认:

crontab -l | grep acme

看到类似下面这行就说明续期已自动配置好:

18 3 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
你什么都不用管了。证书到期前 30 天会自动续、自动拷贝到 Nginx 目录、自动 reload。

总结:你到底做了什么?

步骤一句话
1装了个自动管证书的工具
2告诉它用 Let's Encrypt
3-4给工具 DNSPod 的钥匙,让它自动证明域名是你的
5申请证书
6把证书放到 Nginx 能找到的地方,设好自动更新
7Nginx 配置启用 HTTPS
8确认自动续期在跑,以后不用管

以后加新域名怎么办?​ 重复第 5、6 步就行,API 凭证不用再设。

通配符证书怎么办?​ 第 5 步改成 -d *.example.com -d example.com 即可,其他一样。

最见问题:

1、怎么查看当前是否有下载证书

========================================

~/.acme.sh/acme.sh --list

2、怎么手动下载

========================================

~/.acme.sh/acme.sh --cron

本文内容仅代表作者个人观点、经历或转述,不代表任何官方立场,仅供参考,不构成任何专业建议。据此操作产生的风险由读者自行承担。
发布于 2026-10-16 10:16:30 ID: 21