1、安装acme.sh
shh进入openwrt,一行命令安装acme.sh。注意把邮箱更换成自己的。
curl https://get.acme.sh | sh -s email=my@example.com
2、 使用Cloudflare DNS api配置证书
通常有两种方式,第一种是全局API密钥,它具有最大权限,可以执行任意操作,但如果泄漏的话风险就非常大,官方一般不建议使用。第二种是用户可自定义权限的API令牌,它可以按需给权限,将使用权限限定在指定的范围内,安全性较好,建议使用,即使泄漏也不影响全局。
一、获取令牌token具体方法如下:
1、登录Cloudflare,打开“用户 API 令牌”页面 https://dash.cloudflare.com/profile/api-tokens,点击创建令牌;
2、选择“编辑区域 DNS”,点击“使用模板”;
3、在详细选项里,“权限”一栏中,依次选择“区域”——“DNS”——“编辑”,指定这个令牌只对编辑DNS生效;
4、在“区域资源”一栏中,依次选择“包括”——“所有区域”,指定对所有域名有编辑权限;
5、如果客户端的IP是固定的,可以在“客户端 IP 地址筛选”一栏中,指定客户端IP,这样即使token外泄了,但因为客户端来源不在列表中,也不能访问;
6、“TTL”一栏中,可以指定这个令牌的生存周期,我要长期使用,所以不用理会;
继续下一步操作,就生成了对所有域名的DNS有编辑权限的令牌了,这就是我们在acme.sh中需要的CF_Token,它看起来应该类似如下的模样:
CF_Token="YXjpG9AnfQmuX5Ss9M9qaNab6SQwme3HWXNDzRWs"
二、获取CF_Zone_ID或CF_Account_ID的具体方法如下:
在acme.sh中,DNS api方式申请证书除了需要token,还需要CF_Zone_ID或CF_Account_ID。我要对账号下的所有的域名有编辑权限,需要CF_Account_ID配合token;若只想对指定的单个域名进行编辑,请使用CF_Zone_ID配合token。这个CF_Account_ID和CF_Zone_ID都很容易获取。点开首页,随便点击一个你托管在此的域名,在右侧会显示有当前域名的“区域 ID”和“帐户 ID”,这就分别对应你所需要的CF_Zone_ID和CF_Account_ID,它看起来应该类似如下的模样:
CF_Zone_ID="763eac4f1bcebd8b5c95e9fc50d010b4"
CF_Account_ID="763eac4f1bcebd8b5c95e9fc50d010b4"
三、使用方式:
回到acme.sh中,我们就可以使用DNS api方式申请域名证书了。
a、仅对指定的某个域名有权限使用DNS api方式申请证书(注意CF_Zone_ID为指定域名下的区域 ID,每个域名均不同,所以可以限定权限为某一个托管的域名),注意把***.****.com更改为要申请证书的域名。
export CF_Token="YXjpG9AnfQmuX5Ss9M9qaNab6SQwme3HWXNDzRWs"
export CF_Zone_ID="763eac4f1bcebd8b5c95e9fc50d010b4"
/root/.acme.sh/acme.sh --issue --dns dns_cf -d ***.****.com -d www.***.****.com
b、对账户下所有域名有权限使用DNS api方式申请证书:
export CF_Token="YXjpG9AnfQmuX5Ss9M9qaNab6SQwme3HWXNDzRWs"
export CF_Account_ID="763eac4f1bcebd8b5c95e9fc50d010b4"
/root/.acme.sh/acme.sh --issue --dns dns_cf -d ***.****.com -d www.***.****.com
申请证书需要一点时间,请耐心等待。运行完成后会给出证书路径。
3、 copy/安装证书
注意,默认生成的证书都放在安装目录下:~/.acme.sh/,请不要直接使用此目录下的文件,这里面的文件都是内部使用, 而且目录结构可能会变化。
正确的使用方法是使用 --install-cert 命令,并指定目标位置, 然后证书文件会被copy到相应的位置,参考以下命令:
.acme.sh/acme.sh --install-cert -d ***.****.com \
--key-file /etc/nginx/tls/***.****.com.key \
--fullchain-file /etc/nginx/tls/fullchain.cer \
--reloadcmd "service nginx force-reload"
Nginx 的配置 ssl_certificate 使用 /etc/nginx/ssl/fullchain.cer ,而非 /etc/nginx/ssl/<domain>.cer ,否则 SSL Labs 的测试会报 Chain issues Incomplete 错误。
这里指定的所有参数都会被自动记录下来,并在将来证书自动更新以后, 被再次自动调用。