znlgis 博客

GIS开发与技术分享 — GDAL · GeoServer · PostGIS · QGIS · OpenLayers · Cesium · FreeCAD · NPOI

第05章 - 国内云服务商集成使用

本章详细介绍 acme.sh 与中国各大主流云服务商的集成使用,包括阿里云、腾讯云、华为云、百度云、京东云等,覆盖从 DNS API 配置到证书申请、安装、自动续期的完整流程。


5.1 阿里云(Alibaba Cloud)

阿里云是中国最大的云计算服务商,其 DNS 服务(阿里云 DNS / 万网)拥有广泛的用户群。

5.1.1 创建 RAM 子用户和 API Key

强烈建议使用 RAM 子用户的 AccessKey,而非主账号的 AccessKey,以降低安全风险。

  1. 登录阿里云 RAM 控制台
  2. 点击”创建用户”,选择”访问方式”为”OpenAPI 调用访问”
  3. 创建完成后,立即保存 AccessKey ID 和 AccessKey Secret(Secret 只显示一次)
  4. 为该用户授权:在用户详情页,点击”添加权限”,搜索并选择 AliyunDNSFullAccess

更安全的做法(最小权限)

在 RAM 控制台 → 权限策略管理 → 创建权限策略,内容如下:

{
  "Version": "1",
  "Statement": [
    {
      "Action": [
        "alidns:DescribeDomains",
        "alidns:DescribeDomainRecords",
        "alidns:AddDomainRecord",
        "alidns:DeleteDomainRecord",
        "alidns:UpdateDomainRecord"
      ],
      "Resource": "*",
      "Effect": "Allow"
    }
  ]
}

5.1.2 申请证书

# 配置 API 凭据(首次使用)
export Ali_Key="your_access_key_id"
export Ali_Secret="your_access_key_secret"

# 申请单域名证书
acme.sh --issue --dns dns_ali -d example.com

# 申请通配符证书(推荐)
acme.sh --issue --dns dns_ali -d example.com -d *.example.com

# 申请多域名通配符证书
acme.sh --issue --dns dns_ali \
  -d example.com \
  -d *.example.com \
  -d *.api.example.com

# 指定使用 Let's Encrypt(如果 ZeroSSL 访问有问题)
acme.sh --issue --dns dns_ali --server letsencrypt \
  -d example.com -d *.example.com

# 申请 ECC 证书(推荐,性能更好)
acme.sh --issue --dns dns_ali \
  -d example.com -d *.example.com \
  --keylength ec-256

5.1.3 安装证书到阿里云 ECS 的 Nginx

# 创建证书存放目录
mkdir -p /etc/nginx/ssl/example.com

# 安装证书
acme.sh --install-cert -d example.com \
  --key-file       /etc/nginx/ssl/example.com/privkey.pem \
  --fullchain-file /etc/nginx/ssl/example.com/fullchain.pem \
  --reloadcmd      "systemctl reload nginx"

Nginx 配置示例(/etc/nginx/conf.d/example.com.conf):

# HTTP 重定向到 HTTPS
server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}

# HTTPS 站点
server {
    listen 443 ssl http2;
    server_name example.com www.example.com;

    ssl_certificate     /etc/nginx/ssl/example.com/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/example.com/privkey.pem;

    # 推荐 SSL 配置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;
    ssl_session_tickets off;

    # HSTS(可选,开启后不可轻易回退到 HTTP)
    add_header Strict-Transport-Security "max-age=63072000" always;

    root /var/www/html;
    index index.html index.php;
}

5.1.4 将证书推送到阿里云 CDN / SLB

如果使用了阿里云 CDN(内容分发网络)或 SLB(负载均衡),可以通过阿里云 API 将证书上传到对应服务。

方式一:使用 acme.sh 的 deploy hook(qiniu)

对于七牛 CDN,acme.sh 提供了内置的 deploy hook:

export QINIU_AK="your_access_key"
export QINIU_SK="your_secret_key"
export QINIU_CDN_DOMAIN="your.cdn.domain.com"

acme.sh --deploy -d your.cdn.domain.com --deploy-hook qiniu

方式二:使用 Shell 脚本上传到阿里云 CDN

# 安装阿里云 CLI
# pip install aliyun-python-sdk-cdn

# 通过 --reloadcmd 触发上传脚本
acme.sh --install-cert -d example.com \
  --fullchain-file /tmp/fullchain.pem \
  --key-file /tmp/privkey.pem \
  --reloadcmd "/path/to/upload_cert_to_aliyun_cdn.sh"

5.2 腾讯云(Tencent Cloud / 云服务器 CVM)

5.2.1 获取 API 密钥

  1. 登录腾讯云控制台
  2. 进入”访问管理” → “访问密钥” → “API 密钥管理”
  3. 创建密钥,保存 SecretId 和 SecretKey

使用子账号(推荐)

  1. 在 CAM(访问管理)中创建子用户
  2. 授予 QcloudDNSPodFullAccess 权限(仅 DNS 操作)
  3. 使用子用户的密钥

5.2.2 腾讯云 DNS API 两种方式

方式一:腾讯云新版 API(推荐)

export Tencent_SecretId="your_secret_id"
export Tencent_SecretKey="your_secret_key"

# 申请证书
acme.sh --issue --dns dns_tencent \
  -d example.com -d *.example.com

# 申请 ECC 证书
acme.sh --issue --dns dns_tencent \
  -d example.com -d *.example.com \
  --keylength ec-256

方式二:DNSPod 独立账户 API(适合使用独立 DNSPod 账户的用户)

export DP_Id="your_dnspod_id"
export DP_Key="your_dnspod_token"

acme.sh --issue --dns dns_dp \
  -d example.com -d *.example.com

5.2.3 安装证书到腾讯云 CVM 的 Nginx

# 创建证书目录
mkdir -p /etc/nginx/ssl/example.com

# 安装证书
acme.sh --install-cert -d example.com \
  --key-file       /etc/nginx/ssl/example.com/privkey.pem \
  --fullchain-file /etc/nginx/ssl/example.com/fullchain.pem \
  --reloadcmd      "nginx -s reload"

5.2.4 将证书同步到腾讯云 SSL 证书管理

腾讯云的 SSL 证书管理、CDN、CLB(负载均衡)可以使用同一套证书。通过 acme.sh 的 --reloadcmd 触发自动上传脚本:

#!/bin/bash
# upload_to_tencent.sh

# 需要提前安装 tccli:pip install tccli
DOMAIN="example.com"
CERT_FILE="/etc/nginx/ssl/example.com/fullchain.pem"
KEY_FILE="/etc/nginx/ssl/example.com/privkey.pem"

# 上传证书
tccli ssl UploadCertificate \
  --CertificatePublicKey "$(cat $CERT_FILE)" \
  --CertificatePrivateKey "$(cat $KEY_FILE)" \
  --CertificateType SVR \
  --Alias "acme.sh-$DOMAIN-$(date +%Y%m%d)"

5.3 华为云(Huawei Cloud)

5.3.1 获取 IAM 凭据

  1. 登录华为云控制台
  2. 进入”统一身份认证服务 (IAM)”
  3. 创建 IAM 用户,设置密码
  4. 为该用户授予 DNS FullAccess 权限
  5. 获取”账号名”(DomainName,在右上角账号信息中可见)

5.3.2 申请证书

export HUAWEICLOUD_Username="your_iam_username"
export HUAWEICLOUD_Password="your_iam_password"
export HUAWEICLOUD_DomainName="your_account_domain_name"

# 申请通配符证书
acme.sh --issue --dns dns_huaweicloud \
  -d example.com -d *.example.com

# 如果 DNS 传播较慢,增加等待时间
acme.sh --issue --dns dns_huaweicloud \
  -d example.com -d *.example.com \
  --dnssleep 120

5.3.3 安装证书到华为云 ECS

# 安装到 Nginx
acme.sh --install-cert -d example.com \
  --key-file       /etc/nginx/ssl/privkey.pem \
  --fullchain-file /etc/nginx/ssl/fullchain.pem \
  --reloadcmd      "systemctl reload nginx"

5.4 百度云(Baidu Cloud)

5.4.1 获取 API 凭据

  1. 登录百度云控制台
  2. 进入”安全认证” → “Access Key”
  3. 创建 AccessKey,保存 Access Key ID 和 Secret Access Key

5.4.2 申请证书

export BAIDU_Cloud_ID="your_access_key_id"
export BAIDU_Cloud_Key="your_secret_access_key"

acme.sh --issue --dns dns_baidu \
  -d example.com -d *.example.com

5.5 京东云(JD Cloud)

5.5.1 获取 API 凭据

  1. 登录京东云控制台
  2. 进入”账号管理” → “AccessKey 管理”
  3. 创建 AccessKey

5.5.2 申请证书

export JD_ACCESS_KEY_ID="your_access_key_id"
export JD_ACCESS_KEY_SECRET="your_access_key_secret"

# 默认区域为 cn-north-1(北京),可按需修改
export JD_REGION="cn-north-1"

acme.sh --issue --dns dns_jd \
  -d example.com -d *.example.com

5.6 移动云(China Mobile Cloud)/ 联通云 / 电信天翼云

这些国内电信运营商提供的云服务目前 acme.sh 可能尚无专用 DNS API 插件。建议采用以下方案:

方案一:HTTP-01 验证 如果服务器有公网 IP 且 80 端口可达:

acme.sh --issue -d example.com --standalone

方案二:DNS 别名模式 将域名的 ACME 验证 CNAME 到有 API 支持的 DNS 服务商(如 Cloudflare):

# 在原 DNS 控制台添加 CNAME:
# _acme-challenge.example.com → _acme-challenge.example.cloudflare-managed.com

# 通过 Cloudflare API 验证
export CF_Token="your_cf_token"
acme.sh --issue --dns dns_cf \
  -d example.com -d *.example.com \
  --challenge-alias example.cloudflare-managed.com

方案三:手动 DNS 模式(不可自动续期)

acme.sh --issue -d example.com --dns
# 按提示手动添加 TXT 记录后执行 --renew

5.7 宝塔面板(BT Panel)完整流程

宝塔面板是国内非常流行的服务器管理工具,以下是完整的配置流程。

5.7.1 安装 acme.sh

# 登录服务器,切换到 root 用户
sudo su

# 安装 acme.sh
curl https://get.acme.sh | sh -s email=your@email.com
source ~/.bashrc

# 建议切换默认 CA 为 Let's Encrypt(在国内更稳定)
acme.sh --set-default-ca --server letsencrypt

5.7.2 申请证书(以阿里云 DNS 为例)

export Ali_Key="your_access_key_id"
export Ali_Secret="your_access_key_secret"

acme.sh --issue --dns dns_ali \
  -d your-domain.com -d *.your-domain.com

5.7.3 安装证书到宝塔 Nginx

宝塔面板的证书目录结构:

# 创建证书目录(宝塔 Nginx 站点证书通常放在这里)
mkdir -p /www/server/panel/vhost/cert/your-domain.com/

# 安装证书
acme.sh --install-cert -d your-domain.com \
  --key-file       /www/server/panel/vhost/cert/your-domain.com/privkey.pem \
  --fullchain-file /www/server/panel/vhost/cert/your-domain.com/fullchain.pem \
  --reloadcmd      "nginx -s reload"

然后在宝塔面板中:

  1. 进入”网站” → 找到对应域名 → “设置”
  2. 点击 “SSL” 选项卡
  3. 选择”其他证书”或”自定义证书”
  4. 填入证书文件路径,或手动粘贴证书内容

5.7.4 让宝塔识别 acme.sh 申请的证书

如果希望宝塔面板也能显示证书信息,可以按以下方式配置 Nginx 站点的 SSL:

进入宝塔面板 → 网站设置 → SSL → 修改 Nginx 配置文件,添加:

ssl_certificate /www/server/panel/vhost/cert/your-domain.com/fullchain.pem;
ssl_certificate_key /www/server/panel/vhost/cert/your-domain.com/privkey.pem;

5.8 LNMP 一键包完整流程

# 1. 安装 acme.sh
curl https://get.acme.sh | sh -s email=your@email.com
source ~/.bashrc

# 2. 申请证书(使用阿里云 DNS 为例)
export Ali_Key="your_access_key_id"
export Ali_Secret="your_access_key_secret"
acme.sh --issue --dns dns_ali -d example.com -d *.example.com

# 3. 安装证书到 LNMP 的 Nginx
mkdir -p /usr/local/nginx/conf/ssl/example.com/
acme.sh --install-cert -d example.com \
  --key-file       /usr/local/nginx/conf/ssl/example.com/privkey.pem \
  --fullchain-file /usr/local/nginx/conf/ssl/example.com/fullchain.pem \
  --reloadcmd      "/etc/init.d/nginx reload"

# 4. 编辑 LNMP Nginx 配置(通常在 /usr/local/nginx/conf/vhost/example.com.conf)

5.9 主机控制面板环境(cPanel / DirectAdmin / Plesk)

在共享主机或虚拟主机环境下,通常无法直接安装 acme.sh,但可以通过控制面板的 API 进行部署。

5.9.1 cPanel 部署

acme.sh 提供了专门针对 cPanel 的 deploy hook:

# 安装证书到 cPanel
export DEPLOY_CPANEL_USER="cpanel_username"

acme.sh --deploy -d example.com --deploy-hook cpanel_uapi

# 旧版 cPanel(v55 以下)
export DEPLOY_CPANEL_USER="cpanel_username"
export DEPLOY_CPANEL_PASSWORD="cpanel_password"
acme.sh --deploy -d example.com --deploy-hook cpanel

5.10 国内 CDN 服务商证书更新

5.10.1 七牛云 CDN

acme.sh 内置了七牛云 CDN 的 deploy hook:

# 首次配置
export QINIU_AK="your_access_key"
export QINIU_SK="your_secret_key"
export QINIU_CDN_DOMAIN="static.example.com"

# 申请证书并部署到七牛 CDN
acme.sh --issue --dns dns_ali -d static.example.com
acme.sh --deploy -d static.example.com --deploy-hook qiniu

5.10.2 又拍云、白山云、网宿等

目前 acme.sh 暂无这些 CDN 服务商的内置 deploy hook,但可以通过 --reloadcmd 调用自定义脚本,利用各 CDN 的 API 上传证书。


5.11 小结

本章详细介绍了 acme.sh 与国内主流云服务商的集成:

  • 阿里云:使用 RAM 子用户的 AccessKey + dns_ali,推荐最小权限策略
  • 腾讯云:推荐使用新版 dns_tencent,也支持旧版 dns_dp
  • 华为云:使用 IAM 账户 + dns_huaweicloud
  • 百度云:使用 AccessKey + dns_baidu
  • 京东云:使用 AccessKey + dns_jd
  • 宝塔/LNMP:按对应目录结构安装证书,配置 Nginx 使用新路径

下一章介绍 acme.sh 与国际主流云服务商的集成。