通过acme可以轻松获取https证书,证书有效期是3个月,但是可以通过自动化脚本,到期之前自动续期。
acme.sh 安装
在线安装
curl https://get.acme.sh | sh -s [email protected]
cd ./.acme.sh
git安装
git clone https://github.com/acmesh-official/acme.sh.git
cd ./acme.sh
./acme.sh --install -m [email protected]
如果是国内环境且没有科学上网,可能会安装失败;可以使用以下替代脚本安装:
git clone https://gitee.com/neilpang/acme.sh.git
cd acme.sh
./acme.sh --install -m [email protected]
注册ACME客户端
./acme.sh --register-account -m [email protected]
默认的CA服务器使用 ZeroSSL
,地址是:https://acme.zerossl.com/v2/DV90
,你也可以根据自己的喜好或者国内的网络环境切换不同的CA服务器地址:
letsencrypt
# 简写
./acme.sh --register-account -m [email protected] --server letsencrypt
# 不用别名
./acme.sh --register-account -m [email protected] --server https://acme-v02.api.letsencrypt.org/directory
buypass
# 简写
./acme.sh --register-account -m [email protected] --server buypass
# 不用别名
./acme.sh --register-account -m [email protected] --server https://api.buypass.com/acme/directory
sslcom
# 简写
./acme.sh --register-account -m [email protected] --server sslcom
# 不用别名
./acme.sh --register-account -m [email protected] --server https://acme.ssl.com/sslcom-dv-rsa
# 或者
./acme.sh --register-account -m [email protected] --server https://acme.ssl.com/sslcom-dv-ecc
# 简写
./acme.sh --register-account -m [email protected] --server google
# 不用别名
./acme.sh --register-account -m [email protected] --server https://acme.certcloud.cn/acme/directory
certcloud
./acme.sh --register-account -m [email protected] --server https://dv.acme-v02.api.pki.goog/directory
控制台返回一下结果表示注册客户端成功:
[Tue Dec 5 17:06:49 2023] Registering account: https://********
[Tue Dec 5 17:06:52 2023] Already registered
[Tue Dec 5 17:06:53 2023] ACCOUNT_THUMBPRINT='yph****47lL3********'
申请证书
申请证书的时候可以使用手动DNS验证可以根据域名运营商提供的密钥自动进行DNS验证,为了方便,这里就跳过手动验证,直接使用DNS自动验证。
自动dns验证的原理是ACME客户端(acme.sh等)在收到服务端返回的验证值后通过dnsapi自动设置对应域名的记录值,在CA验证完成后acme客户端自动删除,acme.sh在访问dnsapi时需要对应的授权密钥。
腾讯云
配置访问访问密钥:
export Tencent_SecretId="<id>"
export Tencent_SecretKey="<key>"
有两种方式获取腾讯云的SecretId 和 SecretKey,下面进行说明:
方式一:使用主账号API密钥
您可以直接跳转腾讯云API密钥管理处创建密钥,也可在腾讯云官网搜索框搜索访问管理,选择API密钥管理并点击新建密钥,如下图所示:
上述方式的密钥权限较大,请谨慎使用
方式二:使用子账号密钥
仍然通过上述方式进入访问管理
,策略
->新建自定义策略
选择按策略语法创建
->空白模板
,填写基本信息,并将策略语法修改为以下内容,并点击完成
创建
{
"statement": [
{
"action": [
"dnspod:DescribeRecordFilterList",
"dnspod:DescribeRecordList",
"dnspod:CreateRecord",
"dnspod:DeleteRecord"
],
"effect": "allow",
"resource": [
"*"
]
}
],
"version": "2.0"
}
接着选择左侧用户
->用户列表
,并点击新建用户
选择快速创建
,填写用户信息,并选择编程访问
创建用户成功界面能获取到默认创建的SecretId 和 SecretKey,或者从用户列表
进入用户详情,点击新建密钥
获取到SecretId 和 SecretKey后你还需要为新创建的子账户进行授权
,将刚刚创建的策略关联到子账户
在获取SecretId 和 SecretKey时,应当清楚密钥的权限范围
申请证书脚本:
./acme.sh --issue --dns dns_tencent -d example.com -d *.example.com -d a.com --server https://acme.certcloud.cn/acme/directory
dnspod
腾讯云已经收购dnspod,如果你已登录腾讯云平台,跳转到dnspod是免登录的。腾讯云平台购买的域名能在dnspod官网 中查询到,因此你也可以使用dnspod的密钥进行授权自动验证域名所有权。 如果您的域名在dnspod解析,使用类似的命令如下:
acme.sh --issue --dns dns_dp -d example.com -d *.example.com -d a.com --server https://acme.certcloud.cn/acme/directory
需要配置环境变量,,下面配置环境变量的命令仅在当前窗口有效,请根据自己的服务器配置永久生效的环境变量
export DP_Id="<id>"
export DP_Key="<key>"
登录dnspod官网后点击头像的API密钥
,你可以查看在到腾讯云创建的密钥,详细流程参考上一模块,我们接着创建DNSPod Token
选择 DNSPod Token
,就到了 dnspod 的 token 生成页面,点击创建密钥,获取到 ID 和 token并设置到对应的环境变量DP_Id
和DP_Key
阿里云
如果您的域名在阿里云DNS解析,使用类似的命令如下:
./acme.sh --issue --dns dns_ali -d example.com -d *.example.com -d a.com --server https://acme.certcloud.cn/acme/directory
需要配置环境变量,,下面配置环境变量的命令仅在当前窗口有效,请根据自己的服务器配置永久生效的环境变量
export Ali_Key="<key>"
export Ali_Secret="<secret>"
获取阿里云的key和secret过程为:
-
登录RAM控制台。
-
在左侧导航栏,选择身份管理 > 用户,创建用户会自动生成一对key和secret。
-
在用户页面,单击目标RAM用户名称。
-
在用户AccessKey区域,单击创建AccessKey。
-
根据界面提示完成安全验证。
-
在创建AccessKey对话框,查看AccessKey ID和AccessKey Secret。您可以单击下载CSV文件,下载AccessKey信息。或单击复制,复制AccessKey信息。
-
单击确定。
创建过程如下图所示:
在用户下创建密钥后还需要给用户进行AliyunDNSFullAccess
授权,如下图所示:
上述过程使用了系统策略AliyunDNSFullAccess,你可以自定义策略,控制授权的粒度。
Amazon Route53
您的域名在AWS Route53解析,可以使用类似如下命令:
acme.sh --issue --dns dns_aws -d example.com -d *.example.com -d a.com --server https://acme.certcloud.cn/acme/directory
如果出现AWS Route53 rate exceeded
错误,可以在 api 请求之间添加睡眠时间,避免AWS的限速问题:
export AWS_DNS_SLOWRATE=1
需要配置环境变量,下面配置环境变量的命令仅在当前窗口有效,请根据自己的服务器配置永久生效的环境变量:
export AWS_ACCESS_KEY_ID="<key id>"
export AWS_SECRET_ACCESS_KEY="<secret>"
下面用国内AWS获取id和secret进行说明,国外AWS也是类似操作。过程如下:
- 点击跳转国内AWS IAM控制台,或搜索服务
IAM
进入 - 在左侧导航栏,选择访问管理 > 用户
- 创建用户并点击用户名进入或直接点击用户名进入
- 选择安全凭证 > 访问密钥
- 创建访问密钥
创建过程参考下列图例:
此时密钥还不能正常使用,还需要给密钥所在用户授权。在左侧导航栏选择访问管理 > 策略,点击创建策略
,如下图所示:
策略编辑器选择JSON,策略内容为:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"route53:GetHostedZone",
"route53:ListHostedZones",
"route53:ListHostedZonesByName",
"route53:GetHostedZoneCount",
"route53:ChangeResourceRecordSets",
"route53:ListResourceRecordSets"
],
"Resource": "*"
}
]
}
如下图所示:
接着下一步输出策略名称和策略描述,最后点击创建策略
。
创建策略成功后我们继续给用户添加权限,在左侧导航栏选择访问管理 > 用户,选择刚刚创建密钥的用户进入详情界面,点击添加权限,再选择直接附加策略,勾选我们刚刚创建的策略即可。
用户详情界面的策略列表显示我们刚刚新增的策略即配置成功。
将证书拷贝到指定位置
./acme.sh --install-cert -d "your domain" \
--cert-file your-cert-path/cert.pem \
--key-file your-cert-path/key.pem \
--fullchain-file your-cert-path/fullchain.pem \
--reloadcmd "/usr/sbin/nginx -s reload"
我这里使用的nginx,所以证书拷贝到nginx引用到目录之后,执行nginx重新加载配置到指令
/usr/sbin/nginx -s reload
,如果你使用的是其它代理服务器,则执行相应的重载指令。
在执行过上面的安装证书只令之后,acme会添加一个定时任务,如果潘查询到当前证书的有效期小于30天则会重新申请证书,然后执行上面的install命令,从而保证证书不会过期。
手动更新证书
如果要手动更新证书的话,需要执行以下命令:
./acme.sh --renew -d "your domain" \
--yes-I-know-dns-manual-mode-enough-go-ahead-please --force
www.example.com 和 example.com 的支持
申请证书
./acme.sh --issue \
--dns dns_dp -d "www.abc.com" \
--dns dns_dp -d "abc.com"
安装证书
./acme.sh --install-cert -d "example.com" -d "www.example.com" \
--cert-file your-cert-path/cert.pem \
--key-file your-cert-path/key.pem \
--fullchain-file your-cert-path/fullchain.pem \
--reloadcmd "/usr/sbin/nginx -s reload"
查看证书
$ acme.sh --list
Main_Domain KeyLength SAN_Domains CA Created Renew
abcbcdwq.dasdsa.online "2048" no https://acme.cmc.test/acme/directory
bcbc.dasdsa.online "2048" no https://acme.cmc.test/acme/directory 2023-12-14T11:57:59Z 2024-02-11T11:57:59Z
qqq.ldlb.site "2048" no https://acme.cmc.test/acme/directory 2023-12-15T02:15:01Z 2024-02-12T02:15:01Z
证书续期
自动续期
acme.sh的定时任务会在证书需要续期时自动完成证书续期、证书下载、将证书拷贝到指定位置、执行 reloadcmd
参数中的命令,可以通过 crontab -e
查看执行自动执行计划。
手动续期
acme.sh --renew -d example.com
评论区