超级简单acme证书申请,不用dns配置,自动续期,个人网站首选
前置组件安装
acme 需要用到 socat 这一前置组件,在安装 acme 前,请确认 socat 已安装。
Ubuntu/Debian:
apt-get install socat -y
CentOS/Redhat
yum install socat -y
安装条件:
curl https://get.acme.sh | sh
alias acme.sh=~/.acme.sh/acme.sh
准备:
(1)将域名的解析指向服务器,并且服务器开启80端口的http服务
(2)准备acme需要目录
/usr/local/nginx/ssl/
1 指定初始化
方式一:通过指定dns
acme.sh --issue --server letsencrypt --dns dns_dp -d huisiban.com www.huisiban.com --webroot /usr/local/nginx/html
方式二:通过自定webroot,(推荐)
acme.sh --issue --server letsencrypt -d huisiban.com -d www.huisiban.com --webroot /usr/local/nginx/html
2 安装
执行下面的命令会生成证书文件相关的key和pem,改为你自己的路径和文件名
acme.sh --install-cert -d huisiban.com -d www.huisiban.com --key-file /usr/local/nginx/certs/www.huisiban.com.key --fullchain-file /usr/local/nginx/certs/www.huisiban.com.pem
重要:acme.sh默认开启证书自动更新,acme官方默认60天左右,保证支持crontab
检查系统是否支持crontab ,通过crontab可以查看当前的证书定时任务,下面是我服务器上的
[root@VM-16-2-opencloudos ~]# crontab -l
51 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/nul
3 自动更新
这条命令acme自身自动更新
acme.sh --upgrade --auto-upgrade
4 证书申请完成后,就可以配置https 443 服务了
比如我的网站汇思班
server {
listen 80;
server_name huisiban.com www.huisiban.com;
rewrite ^(.*)$ https://www.huisiban.com$1 permanent;
}
server {
listen 443 ssl;
server_name huisiban.com www.huisiban.com;
ssl_certificate /usr/local/nginx/certs/www.huisiban.com.pem;
ssl_certificate_key /usr/local/nginx/certs/www.huisiban.com.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
client_max_body_size 20m;
client_body_buffer_size 128k;
gzip on;
gzip_buffers 32 4K;
gzip_comp_level 6;
gzip_min_length 100;
gzip_types application/javascript text/css text/xml application/font-woff;
gzip_disable "MSIE [1-6]\.";
if ( $host = 'huisiban.com') {
rewrite ^/(.*)$ https://www.huisiban.com/$1 permanent;
}
location ^~ /.well-known/acme-challenge/ {
default_type "text/plain";
root /usr/local/nginx/html;
}
location ~ ^/upload/(.*)\.(png|jpg|jpeg|gif)$ {
root /opt/img;
expires 5d;
set $img_width -;
set $img_height -;
# 获取参数size的值
if ($arg_size ~* "^(\d+)x(\d+)$") {
set $img_width $1;
set $img_height $2;
}
# 裁剪图片并且调整大小
image_filter resize $img_width $img_height;
image_filter_jpeg_quality 25;
image_filter_buffer 10M;
}
location ~ ^/upload/(.*)\.(ico|webp)$ {
root /opt/img;
}
location /fastcms.html {
alias /usr/local/nginx/html;
# 此处的 @router 实际上是引用下面的转发,否则在 Vue 路由刷新时可能会抛出 404
try_files $uri $uri/ @router;
# 请求指向的首页
index index.html index.htm;
}
location /fastcms {
alias /usr/local/nginx/html;
}
location /fastcms/api {
proxy_pass http://127.0.0.1:8085;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location / {
proxy_pass http://127.0.0.1:8085;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# 由于路由的资源不一定是真实的路径,无法找到具体文件
# 所以需要将请求重写到 index.html 中,然后交给真正的 Vue 路由处理请求资源
location @router {
rewrite ^.*$ /index.html last;
}
}
安装/补全定时任务
# 1. 安装/补全定时任务
acme.sh --install-cronjob
# 2. 马上跑一次检查(可选)
acme.sh --cron
看证书信息
acme.sh --list
看下次续期时间
openssl x509 -in /root/.acme.sh/zfox.cc_ecc/zfox.cc.cer -noout -dates
设置证书CA
#acme.sh 内置了 7 家 CA、十几条接口,随时一条命令就能切换。
#查看当前能用的“官方别名”
acme.sh --list-ca
ZeroSSL
LetsEncrypt
LetsEncrypt_V2
BuyPass
SSL.com
Google
GooglePublic
#LetsEncrypt (默认)
acme.sh --set-default-ca --server letsencrypt
常用 CA 一览
| 别名 / 示例命令 | 备注 |
|---|---|
| LetsEncrypt (默认) | acme.sh --set-default-ca --server letsencrypt |
| ZeroSSL | acme.sh --set-default-ca --server zerossl (安装后首次自动切到 zerossl) |
| BuyPass (挪威 CA,90 天,根证书 BP Root R1) | acme.sh --set-default-ca --server buypass |
| SSL.com (商业 CA,30 天免费,需先注册账号) | acme.sh --set-default-ca --server ssl.com |
| Google Public CA (90 天,根证书 GTS R4) | acme.sh --set-default-ca --server google 或 googlepublic |
| Let’sEncrypt Staging (测试用) | acme.sh --server letsencrypt_test (仅单次生效,不建议设为默认) |
设置和取消代理
#取消代理
unset http_proxy https_proxy
#设置代理
export http_proxy="http://127.0.0.1:7890"
export https_proxy="http://127.0.0.1:7890"
acme.sh 的 dns_cf 插件支持 两种登陆方式,任选其一即可:
方案 A:Global API Key(传统,最简单)
-
打开 https://dash.cloudflare.com/profile/api-tokens
右下角找到 “Global API Key” → View → 输入密码 → 复制那串 key。 -
本机导出变量(临时用)或写进账户配置(永久用)
export CF_Key="刚才复制的key" export CF_Email="你的cloudflare登录邮箱" # 直接申请 acme.sh --issue -d zfox.cc --dns dns_cf dns_cf 是 acme.sh 内置的 Cloudflare DNS 验证插件的简称: dns_ 表示“用 DNS-01 方式验证域名所有权” cf 代表 Cloudflare 整条命令的含义就是:“通过 Cloudflare 的 DNS API 自动添加 TXT 记录,完成 Let’s Encrypt 的 DNS-01 挑战,从而签发证书”。如果想永久生效:
acme.sh --set-dns-prop dns_cf \ --accountconf ~/.acme.sh/account.conf \ --dns-prop-key "CF_Key" \ --dns-prop-value "刚才的key" \ --dns-prop-key "CF_Email" \ --dns-prop-value "邮箱"
方案 B:Token(权限最小化,推荐)
-
仍在 https://dash.cloudflare.com/profile/api-tokens
点击 Create Token → Use template Edit zone DNS →
Zone Resources 选 Include – Specific zone – zfox.cc →
继续到底,生成 Token 字符串。 -
使用 Token(不需要邮箱)
export CF_Token="刚才生成的token" # 如果 zone 不在根目录,再指定 CF_Zone_ID(可选) # export CF_Zone_ID="可在右侧摘要栏看到" acme.sh --issue -d zfox.cc --dns dns_cf
同样可写进 account.conf 以后自动续期:
acme.sh --set-dns-prop dns_cf \ --accountconf ~/.acme.sh/account.conf \ --dns-prop-key "CF_Token" \ --dns-prop-value "token字符串"
阿里域名
“域名在阿里云申请” 本身不影响 DNS-01 验证,
关键看 现在这条域名的 NS(NameServer)是谁在托管:
- NS 已是 Cloudflare → 直接用
dns_cf就行,跟哪家注册商无关。 - NS 仍是阿里云(万网) → 要用 阿里云 DNS 插件 (
dns_ali),而 不是dns_cf。
怎么确认
dig NS zfox.cc +short
- 返回
*.alidns.com→ 阿里托管 - 返回
*.ns.cloudflare.com→ CF 托管
NS 还在阿里云时的做法
① 创建 RAM 子密钥(最小权限)
登录阿里云控制台 → RAM → 用户 → 创建用户 → OpenAPI 调用访问 → 保存 AccessKey ID 和 AccessKey Secret。
授权策略:AliyunDNSFullAccess(或自定义仅含 DescribeDomains / AddDomainRecord / DeleteDomainRecord)。
② 本机导出变量
export Ali_Key="LTAIxxxxxxxxxx"
export Ali_Secret="xxxxxxxxxxxxxxxxxxxxxxxxxxxx"
或者直接手工编辑 ~/.acme.sh/account.conf 追加:
Ali_Key='LTAI5xxxxxxxxxx'
Ali_Secret='xxxxxxxxxxxxxxxxxxxxxxxxxxxx'
③ 签发
acme.sh --issue -d zfox.cc --dns dns_ali
④ 续期
变量写进 ~/.acme.sh/account.conf 后,--cron 会自动续期并添/删 TXT,无需人工干预。
安全小贴士
- 最小权限:在 RAM 控制台给该用户只授权
AliyunDNSFullAccess(甚至自定义策略仅含DescribeDomains、AddDomainRecord、DeleteDomainRecord)。 - 不要泄露 AccessKey;如果担心,可改用 RAM 角色 + STS 临时令牌(acme.sh 同样支持
Ali_Token变量)。 - 一旦证书拿到,记得 安装/重载 服务:
总结
- 域名注册商 ≠ DNS 托管商;
- 看 NS 记录决定用哪个插件:
- Cloudflare →
dns_cf - 阿里云 →
dns_ali - 腾讯云 →
dns_dp - 华为云 →
dns_hw - …
acme.sh 支持 60 多种 DNS 插件,列表见
- Cloudflare →
acme.sh --list-dns
选对应插件即可。
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
微信
支付宝