跳到主要内容

使用acme.sh自动申请证书

使用 acme.sh 为在腾讯云 DNSPod 解析的域名自动申请证书(API3.0/腾讯云 DNSPod API 密钥版本)

安装 acme.sh

curl https://get.acme.sh | sh -s email=my@example.com

配置 acme.sh

acme.sh 是一个支持 ACME 协议的流行客户端,可以实现 SSL 证书的自动申请和续期。由于 DNSPod API 后续将不再维护,旧版 API 存在接口不稳定、权限无法细分控制、国内站和国际站接口不统一等问题,因此笔者基于 dns_dp 脚本,适配了腾讯云 API3.0 版本(dns_tencent)。升级后的脚本将同时支持 DNSPod 国内站和国际站(暂仅支持国内站,国际站部分接口官方团队正在排期适配,预计 2024Q2 完成),不再需要针对国内站和国际站单独适配,同时支持使用子账号 API 密钥申请证书,权限可细分控制,接口更加稳定,使用更加方便、安全。

全新安装

适用于未安装 acme.sh 的用户,使用以下命令安装 acme.sh 客户端:

curl https://get.acme.sh | sh -s email=my@example.com

或者

wget -O - https://get.acme.sh | sh -s email=my@example.com

请将 my@example.com 替换为您的邮箱地址。

旧版升级

适用于已安装 acme.sh 的用户,请运行以下命令升级 acme.sh 客户端:

acme.sh --upgrade

获取腾讯云 SecretId 和 SecretKey

方式一:使用主账号 API 密钥
  1. 登录腾讯云控制台,进入访问管理页面。
  2. 点击左侧菜单栏的访问密钥,进入 API 密钥管理页面。
  3. 点击新建密钥,创建 API 密钥,并记录保存 SecretId 和 SecretKey。
方式二:使用子账号 API 密钥
步骤一:新建权限策略
  1. 登录腾讯云控制台,进入访问管理页面。
  2. 点击左侧菜单栏的策略,进入策略管理页面,并点击新建自定义策略。
  3. 选择按策略语法创建-空白模板,填写基本信息,并将策略语法修改为以下内容,并点击完成创建。
{
"statement": [
{
"action": [
"dnspod:DescribeRecordFilterList",
"dnspod:DescribeRecordList",
"dnspod:CreateRecord",
"dnspod:DeleteRecord"
],
"effect": "allow",
"resource": [
"*"
]
}
],
"version": "2.0"
}

如需更精细的权限控制,可根据实际需求修改策略语法,详情请参考 CAM-DNS 解析 DNSPod

步骤二:新建子账号并关联权限策略

申请证书

将获取到的 SecretId 和 SecretKey 导入环境变量中,以便 acme.sh 调用。

export Tencent_SecretId="<Your SecretId>"
export Tencent_SecretKey="<Your SecretKey>"

例如:

export Tencent_SecretId="AKIDxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
export Tencent_SecretKey="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

使用 acme.sh 申请证书,例如:

acme.sh --issue --dns dns_tencent -d example.com -d *.example.com

例如:

acme.sh --issue --dns dns_tencent -d acme.dnstest.cc -d *.acme.dnstest.cc

运行后,acme.sh 将自动为您的域名申请证书,并将证书文件保存在 ~/.acme.sh/example.com/ 目录下,并且会自动为您的域名配置证书自动续期任务,无需手动续期。

安装证书

acme.sh 不建议直接使用 ~/.acme.sh/ 目录下的证书文件,而是通过 acme.sh 提供的命令将证书安装到指定位置,以确保证书的正确使用和续期。以下以 Nginx 为例:

acme.sh --install-cert -d example.com \
--key-file /path/to/keyfile/in/nginx/key.pem \
--fullchain-file /path/to/fullchain/nginx/cert.pem \
--reloadcmd "service nginx force-reload"

请将 example.com 替换为您的域名,/path/to/keyfile/in/nginx/key.pem/path/to/fullchain/nginx/cert.pem 替换为证书实际路径,service nginx force-reload 替换为您使用的 Web 服务重载命令。

流程图: