我有申请域名,对于我们普通人来说申请收费的数字证书觉得很贵,一个正规的数字证书商用的要几千一年,这种开支完全没必要,一般的免费的数字证书也只能使用三个月,每三个月申请一次很麻烦,有时可能还会忘了申请和更新,但现在的域名很多都必须要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。
操作:
- 登录 DNSPod 控制台
- 右上角头像 → 密钥管理 → 创建密钥
- 记下两个东西:
- ID(就是
DP_Id) - Token(就是
DP_Key)
⚠️ Token 只显示一次,关掉页面就看不见了,赶紧复制保存。
我用的域名是腾讯申请,因此使用腾讯后台申请,这里有一个我们要注意的就是dnspod控制台不容易找到,我是直接输入网址直接进入的,因此不容易忘记我们最好保存这个网址:https://console.dnspod.cn/account/token/token
还有就是这个DNSPod Token这个不好找,我们要点击右角上角头像,才会出现一个API密钥,才会出现界面,同时默认的是腾讯云API密钥这个不是我们要的,然还要点击右边那个DNSPod Token才找到,有时真怀疑他是故意不想让你找到。

第 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。所以你只管执行就行。
第 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 能找到的地方,设好自动更新 |
| 7 | Nginx 配置启用 HTTPS |
| 8 | 确认自动续期在跑,以后不用管 |
以后加新域名怎么办? 重复第 5、6 步就行,API 凭证不用再设。
通配符证书怎么办? 第 5 步改成 -d *.example.com -d example.com 即可,其他一样。
最见问题:
1、怎么查看当前是否有下载证书
========================================
~/.acme.sh/acme.sh --list
2、怎么手动下载
========================================
~/.acme.sh/acme.sh --cron