前置组件安装

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(传统,最简单)

  1. 打开 https://dash.cloudflare.com/profile/api-tokens
    右下角找到 “Global API Key”View → 输入密码 → 复制那串 key。

  2. 本机导出变量(临时用)或写进账户配置(永久用)

    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(权限最小化,推荐)

  1. 仍在 https://dash.cloudflare.com/profile/api-tokens
    点击 Create TokenUse template Edit zone DNS
    Zone ResourcesInclude – Specific zone – zfox.cc
    继续到底,生成 Token 字符串。

  2. 使用 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)是谁在托管

  1. NS 已是 Cloudflare → 直接用 dns_cf 就行,跟哪家注册商无关。
  2. NS 仍是阿里云(万网) → 要用 阿里云 DNS 插件 (dns_ali),而 不是 dns_cf

怎么确认

dig NS zfox.cc +short
  • 返回 *.alidns.com → 阿里托管
  • 返回 *.ns.cloudflare.com → CF 托管

NS 还在阿里云时的做法

① 创建 RAM 子密钥(最小权限)
登录阿里云控制台 → RAM → 用户 → 创建用户 → OpenAPI 调用访问 → 保存 AccessKey IDAccessKey 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(甚至自定义策略仅含 DescribeDomainsAddDomainRecordDeleteDomainRecord)。
  • 不要泄露 AccessKey;如果担心,可改用 RAM 角色 + STS 临时令牌(acme.sh 同样支持 Ali_Token 变量)。
  • 一旦证书拿到,记得 安装/重载 服务:

总结

  • 域名注册商 ≠ DNS 托管商;
  • NS 记录决定用哪个插件:
    • Cloudflare → dns_cf
    • 阿里云 → dns_ali
    • 腾讯云 → dns_dp
    • 华为云 → dns_hw

    • acme.sh 支持 60 多种 DNS 插件,列表见
acme.sh --list-dns

选对应插件即可。