【BASE】Let's_Encrypt证书签发
Let’s Encrypt 是一个由非营利性组织互联网安全研究小组(ISRG)提供的免费、自动化和开放的证书颁发机构(CA)。
Let’s Encrypt 的签发/续签,通过脚本自动化完成;通过 acme.sh 相对来说是比较省心,自动化程度较高
紧急补充说明下: 因为我本文最终选着了 Let’s Encrypt 进行证书签发,发现比较老旧的系统,因为系统的根证书没有更新,所以导致这个签发的证书无法认证。所以需要兼容比较老旧的 ios,安卓 (微信小程序等)端的慎用。
安装 acme.sh工具
|
|
脚本安装好,脚本的具体操作如下:
- 安装文件和配置文件都在home目录下,也就是 ~/.acme.sh/
- 创建一个 bash alias,acme.sh=~/.acme.sh/acme.sh ,重新打开终端后直接输入 acme.sh 就可以快速方便地使用这个脚本
- 创建一个 crontab 定时任务,每天 0 点进行 acme.sh 脚本的续签证书,自动升级(可选)等任务
后续生成的文件和证书都是基于这个这个目录的( ~/.acme.sh/ )
acme.sh 生成证书
acme.sh 实现了 acme 协议支持的所有验证协议, 一般有两种方式验证:http 和 dns 验证。
Http 证书方式验证
Http 的证书验证方法,需要在域名指向的服务器的根目录下放置一个指定的文件,服务会通过访问这个文件来验证你是否对域名有所有权,只要验证通过就可以申请证书:
生成方式 ①
|
|
参数说明:
- -d : 需要生成证书的域名 (支持多个)
- –webroot: 项目根目录(用于验证)
注意:
acme.sh 会全自动的生成验证文件, 并放到网站的根目录, 然后自动完成验证. 最后会聪明的删除验证文件. 整个过程没有任何副作用.
生成方式 ②
如果你用的 apache 服务器, acme.sh 还可以智能的从 apache 的配置中自动完成验证, 你不需要指定网站根目录:
|
|
参数说明:
生成方式 ③
如果你用的 nginx 服务器, 或者反代, acme.sh 还可以智能的从 nginx 的配置中自动完成验证, 你不需要指定网站根目录:
|
|
参数说明:
生成方式 ④
如果你还没有运行任何 web 服务, 80 端口是空闲的, 那么 acme.sh 还能假装自己是一个webserver, 临时听在 80 端口, 完成验证:
|
|
注意事项
⭐️ ⭐️ ⭐️ 无论是 apache 还是 nginx 模式, acme.sh 在完成验证之后, 会恢复到之前的状态, 都不会私自更改你本身的配置. 好处是你不用担心配置被搞坏, 也有一个缺点, 你需要自己配置 ssl 的配置, 否则只能成功生成证书, 你的网站还是无法访问 https. 我选用的就是方式 ③
更高级的用法:
How to issue a cert
手动 DNS 方式
手动在域名上添加一条 txt 解析记录,验证域名的所有权
这种方式的好处是, 你不需要任何服务器, 不需要任何公网 ip, 只需要 dns 的解析记录即可完成验证. 坏处是,如果不同时配置 Automatic DNS API,使用这种方式 acme.sh 将无法自动更新证书,每次都需要手动再次重新解析验证域名所有权。
|
|
然后, acme.sh 会生成相应的解析记录显示出来, 你只需要在你的域名管理面板中添加这条 txt 记录即可.
等待解析完成之后, 重新生成证书:
|
|
注意第二次这里用的是 –renew
dns 方式的真正强大之处在于可以使用域名解析商提供的 api 自动添加 txt 记录完成验证.
acme.sh 目前支持 cloudflare, dnspod, cloudxns, godaddy 以及 ovh 等数十种解析商的自动集成.
以 dnspod 为例, 你需要先登录到 dnspod 账号, 生成你的 api id 和 api key, 都是免费的. 然后:
|
|
证书就会自动生成了. 这里给出的 api id 和 api key 会被自动记录下来, 将来你在使用 dnspod api 的时候, 就不需要再次指定了. 直接生成就好了:
|
|
⭐️ DNS自动模式(建议)
原理:这个方法会向域名解析平台添加一个TXT记录值;所以需要提供平台的 Key 和 Secret; 参考源码:https://github.com/acmesh-official/acme.sh/blob/master/dnsapi/dns_tencent.sh 可以根据需求选择不同的解析平台(阿里云,腾讯云。。等)我选择的是腾讯云
切换签发平台
|
|
脚本默认的签发平台是 ZeroSSL ,我本来使用的也是默认的签发平台;但是到了最近一直报错:get authz objec with invalid status, please try again later. 经过各种排查,终于找到了原因: Github 上有人说是ZeroSSL的dns身份认证出问题了;🪜https://github.com/acmesh-official/acme.sh/issues/4991 ;所以迫于无奈我也只能切换了签发平台,用上了 Letsencrypt ;
获取DNS解析平台秘钥
我这里选择的是腾讯云;大家也可以根据自己的需求选择不同的解析平台;
获取腾讯云的 Key 和 **Secret;**添加到环境变量; 第一次成功后会自动保存到 account.conf 中;所以不需要每次都导入;
|
|
生成证书
|
|
查看源码可得知:**acme.sh **读取腾讯云中的 Api 授权ID和密码;并通过 dns_tencent 参数指定 DNS 的供应商设置为腾讯云;然后通过 API 自动为指定域名添加 TXT 记录;并在验证完毕后移除 TXT 记录;
⭐ ⭐️ 注意:API 授权信息:Key 和 Secret 将保存在 ~/.acme.sh/account.conf 中
acme.sh 安装证书
除了apache自动安装之外,nginx 的证书安装也是半自动的,自己只需修改 nginx 配置文件即可
Nginx 证书
|
|
参数说明:
-d : 域名(已经生成证书的域名)
–key-file: 生成 KEY 文件
–fullchain-file: 生成 pem 文件
–reloadcmd: 证书生成后执行命令(我这边一般自己手动执行,因为nginx的配置要手动改)
注意:
(一个小提醒, 这里用的是 service nginx force-reload, 不是 service nginx reload, 据测试, reload 并不会重新加载证书, 所以用的 force-reload)
Nginx 的配置 ssl_certificate 使用 /etc/nginx/ssl/fullchain.cer ,而非 /etc/nginx/ssl/
Apache证书
|
|
查看安装证书信息
|
|
acme.sh 自动续期
目前 Let’s Encrypt 证书的有效期是 90 天,官方推荐的方式是脚本自动化续签
|
|
acme.sh 自动更新工具
Let’s Encrypt 一直处于高速发展的状态,每隔一段时间都会添加新的特性,而 acme.sh 也会随着官方不断更新,所以保持 acme.sh 更新是很有必要的,而 acme.sh 也提供了自动升级的功能:
手动升级
|
|
自动升级
|
|
关闭自动升级
|
|
参考资料
- 官方简略教程:
https://github.com/Neilpang/acme.sh/wiki/%E8%AF%B4%E6%98%8E
- Let’s Encrypt证书快速申请并自动续期:
无客户端快速申请并自动续期Let’s Encrypt证书 – 古博
- Mozilla SSL配置生成器: