Loading... # acme.sh 跨 DNS 服务商多域名证书申请指南 # 一、概述 ## 1. 问题背景 在实际使用场景中,用户可能拥有多个分散在不同 DNS 服务商的域名。例如: - a.com 及其子域名的 DNS 解析托管在阿里云 - b.com 及其子域名的 DNS 解析托管在腾讯云 DNSPod 用户希望生成一张 SSL 证书,同时覆盖 a.com、*.a.com、b.com、*.b.com 这些域名。 ## 2. 核心结论 **重要提示**:acme.sh 官方不支持在单个证书中混合使用多个 DNS 服务商的 API。这是 acme.sh 的设计限制,而非配置问题。 # 二、技术原理 ## 1. acme.sh 的工作原理 acme.sh 使用 ACME 协议申请证书,支持 DNS-01 验证方式。在 DNS-01 验证中,acme.sh 需要在每个域名的 DNS 解析中添加一条 TXT 记录,证明申请者对该域名的控制权。 ## 2. 多 DNS API 的技术限制 当申请一个包含多个域名的证书时,acme.sh 会为所有域名使用相同的 DNS API 插件。这是因为: - acme.sh 的证书申请命令只接受一个 --dns 参数 - 每个域名的 DNS 验证必须通过该指定的 DNS API 完成 - 如果域名不在该 DNS 服务商处,API 调用将失败 ```mermaid graph TD A[acme.sh 申请证书] --> B{指定 DNS API} B -->|阿里云 API| C[验证 a.com] B -->|阿里云 API| D[验证 b.com 失败] C --> E[证书申请失败] D --> E ```   # 三、解决方案 ## 方案一:分别为每个域名生成独立证书(推荐) ### 1. 方案说明 为每个 DNS 服务商处的域名分别生成证书,这是最简单、最可靠的方式。 ### 2. 阿里云域名证书申请 #### A. 获取阿里云 API 密钥 1. 登录阿里云控制台 2. 进入访问控制(RAM)-> 用户 3. 创建新用户或使用现有用户 4. 为用户添加 DNS 管理权限 5. 创建 AccessKey,记录 AccessKey ID 和 AccessKey Secret #### B. 配置环境变量 ```bash export Ali_Key="your_aliyun_access_key_id" export Ali_Secret="your_aliyun_access_key_secret" ``` #### C. 申请证书 ```bash acme.sh --issue --dns dns_ali \ -d a.com \ -d *.a.com ``` ### 3. 腾讯云域名证书申请 #### A. 获取腾讯云 API 密钥 1. 登录腾讯云控制台 2. 进入访问管理 -> API 密钥管理 3. 创建密钥,记录 SecretId 和 SecretKey #### B. 配置环境变量 ```bash export DP_Id="your_tencent_secret_id" export DP_Key="your_tencent_secret_key" ``` #### C. 申请证书 ```bash acme.sh --issue --dns dns_dp \ -d b.com \ -d *.b.com ``` ### 4. 优点与缺点 优点: - 配置简单,不易出错 - 证书续期互不影响 - 灵活性高,可独立管理 - 符合最佳实践 缺点: - 需要管理多个证书文件 - Web 服务器需要配置多个证书 ## 方案二:统一 DNS 服务商 ### 1. 方案说明 将所有域名的 DNS 解析迁移到同一个服务商,然后使用单个证书覆盖所有域名。 ### 2. 实施步骤 #### A. 选择目标 DNS 服务商 根据需求选择阿里云或腾讯云作为统一 DNS 服务商。 #### B. 迁移 DNS 解析 1. 在目标 DNS 服务商添加域名 2. 复制所有 DNS 记录到新服务商 3. 修改域名 NS 记录,指向新的 DNS 服务器 4. 等待 DNS 生效(通常需要 24-48 小时) #### C. 申请统一证书 ```bash # 假设全部迁移到阿里云 export Ali_Key="your_aliyun_access_key_id" export Ali_Secret="your_aliyun_access_key_secret" acme.sh --issue --dns dns_ali \ -d a.com \ -d *.a.com \ -d b.com \ -d *.b.com ``` ### 3. 优点与缺点 优点: - 单一证书管理简单 - 减少证书续期任务 缺点: - 需要迁移 DNS 服务 - 迁移过程可能影响服务 - 失去多云冗余优势 ## 方案三:DNS 别名模式(不推荐) ### 1. 方案说明 acme.sh 支持 DNS 别名模式,但配置复杂,不建议普通用户使用。 ### 2. 技术原理 DNS 别名模式允许通过 CNAME 记录,将一个域名的 ACME 挑战记录指向另一个域名。这样: - a.com 的 ACME 挑战通过阿里云 DNS 验证 - b.com 的 ACME 挑战通过 CNAME 指向 a.com,间接通过阿里云验证 ### 3. 配置复杂度 - 需要手动配置 CNAME 记录 - 需要理解 ACME 协议细节 - 故障排查困难 # 四、最佳实践 ## 1. 证书管理建议 ### A. 使用独立证书 推荐为每个 DNS 服务商处的域名使用独立证书,这是官方推荐的方式。 ### B. 自动续期配置 acme.sh 默认配置自动续期,无需额外操作: ```bash # 查看已安装的证书 acme.sh --list # 查看证书续期cron任务 crontab -l | grep acme.sh ``` ### C. 证书部署 申请成功后,acme.sh 会自动保存证书,可以通过以下命令部署: ```bash acme.sh --install-cert -d a.com \ --cert-file /path/to/cert.pem \ --key-file /path/to/key.pem \ --fullchain-file /path/to/fullchain.pem \ --reloadcmd "service nginx reload" ``` ## 2. 安全建议 ### A. API 密钥权限最小化 为 acme.sh 创建专用的 API 密钥,仅授予 DNS 管理权限,避免使用主账号密钥。 ### B. 定期轮换密钥 建议每 3-6 个月更换一次 API 密钥。 ### C. 监控证书有效期 虽然 acme.sh 会自动续期,但仍建议配置监控告警,确保证书正常续期。 ## 3. 故障排查 ### A. 常见问题 **问题 1**:DNS API 验证失败 ```bash # 检查 API 密钥是否正确 echo $Ali_Key echo $Ali_Secret # 手动测试 DNS API curl "https://alidns.aliyuncs.com/" ``` **问题 2**:证书申请超时 - 检查网络连接 - 确认 DNS 服务商 API 可用 - 增加等待时间参数:--dnssleep 300 **问题 3**:域名验证失败 - 确认域名已在对应 DNS 服务商处 - 检查 API 密钥是否有该域名的管理权限 ### B. 日志查看 ```bash # 查看 acme.sh 日志 acme.sh --issue --dns dns_ali -d a.com -d *.a.com --debug ``` # 五、实际案例 ## 案例:Web 服务器多证书配置 ### 1. Nginx 配置示例 当使用多个证书时,需要在 Nginx 中为每个域名配置对应的证书: ```nginx # a.com 使用阿里云申请的证书 server { listen 443 ssl; server_name a.com *.a.com; ssl_certificate /path/to/a.com.fullchain.pem; ssl_certificate_key /path/to/a.com.key.pem; # 其他配置... } # b.com 使用腾讯云申请的证书 server { listen 443 ssl; server_name b.com *.b.com; ssl_certificate /path/to/b.com.fullchain.pem; ssl_certificate_key /path/to/b.com.key.pem; # 其他配置... } ``` ### 2. Apache 配置示例 ```apache <VirtualHost *:443> ServerName a.com ServerAlias *.a.com SSLEngine on SSLCertificateFile /path/to/a.com.cert.pem SSLCertificateKeyFile /path/to/a.com.key.pem SSLCertificateChainFile /path/to/a.com.chain.pem </VirtualHost> <VirtualHost *:443> ServerName b.com ServerAlias *.b.com SSLEngine on SSLCertificateFile /path/to/b.com.cert.pem SSLCertificateKeyFile /path/to/b.com.key.pem SSLCertificateChainFile /path/to/b.com.chain.pem </VirtualHost> ``` # 六、总结 ## 1. 核心要点 - acme.sh 不支持在单个证书中混合使用多个 DNS API - 推荐为每个 DNS 服务商处的域名分别生成证书 - 证书自动续期功能由 acme.sh 内置处理 - 多证书配置在 Web 服务器中简单易行 ## 2. 推荐方案 **最佳实践**:使用方案一,分别为每个 DNS 服务商申请独立证书。这种方式: - 配置简单,维护容易 - 符合 acme.sh 的设计理念 - 证书续期互不影响 - 灵活性最高 ## 3. 参考资料 *** ## 参考资料 1. [acme.sh 官方 GitHub 仓库](https://github.com/acmesh-official/acme.sh) 2. [如何同时使用 CloudFlare 和 DNSPod 的两个域名?Issue #2791](https://github.com/acmesh-official/acme.sh/issues/2791) 3. [acme.sh 支持多个 DNS 服务商讨论 - Let's Encrypt 社区](https://community.letsencrypt.org/t/acme-sh-with-multiple-dns-providers-for-same-cert/184057) 4. [acme.sh 自动解析并申请证书 - DNSPod 官方文档](https://docs.dnspod.cn/dns/acme-sh/) 5. [使用 acme.sh 为在腾讯云(DNSPod)解析的域名自动申请证书 - 腾讯云](https://cloud.tencent.com/developer/article/2335528) 6. [使用 acme.sh 与阿里云 DNS 自动签发免费数字证书 - Kubecc Blog](https://kubecc.com/acme-update-certificates/) 7. [acme.sh 多域名最佳实践教程](https://www.ioiox.com/archives/87.html) 最后修改:2026 年 01 月 29 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏