【BASE】Let's_Encrypt证书签发

Let’s Encrypt 是一个由非营利性组织互联网安全研究小组(ISRG)提供的免费、自动化和开放的证书颁发机构(CA)。
Let’s Encrypt 的签发/续签,通过脚本自动化完成;通过 acme.sh 相对来说是比较省心,自动化程度较高
紧急补充说明下: 因为我本文最终选着了 Let’s Encrypt 进行证书签发,发现比较老旧的系统,因为系统的根证书没有更新,所以导致这个签发的证书无法认证。所以需要兼容比较老旧的 ios,安卓 (微信小程序等)端的慎用。


安装 acme.sh工具

1
curl https://get.acme.sh | sh 

脚本安装好,脚本的具体操作如下:

  1. 安装文件和配置文件都在home目录下,也就是 ~/.acme.sh/
  2. 创建一个 bash alias,acme.sh=~/.acme.sh/acme.sh ,重新打开终端后直接输入 acme.sh 就可以快速方便地使用这个脚本
  3. 创建一个 crontab 定时任务,每天 0 点进行 acme.sh 脚本的续签证书,自动升级(可选)等任务

后续生成的文件和证书都是基于这个这个目录的( ~/.acme.sh/ )

acme.sh 生成证书

acme.sh 实现了 acme 协议支持的所有验证协议, 一般有两种方式验证:httpdns 验证。

Http 证书方式验证

Http 的证书验证方法,需要在域名指向的服务器的根目录下放置一个指定的文件,服务会通过访问这个文件来验证你是否对域名有所有权,只要验证通过就可以申请证书:

生成方式 ①

1
acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/

参数说明:

  • -d : 需要生成证书的域名 (支持多个)
  • –webroot: 项目根目录(用于验证)

注意:
acme.sh 会全自动的生成验证文件, 并放到网站的根目录, 然后自动完成验证. 最后会聪明的删除验证文件. 整个过程没有任何副作用.

生成方式 ②

如果你用的 apache 服务器, acme.sh 还可以智能的从 apache 的配置中自动完成验证, 你不需要指定网站根目录:

1
acme.sh --issue -d mydomain.com --apache /etc/conf/apache/domain.com.conf

参数说明:

  • -d : 需要生成证书的域名 (支持多个)
  • –apache : apache该域名的配置文件 (会重写,但是完成后会恢复)

生成方式 ③

如果你用的 nginx 服务器, 或者反代, acme.sh 还可以智能的从 nginx 的配置中自动完成验证, 你不需要指定网站根目录:

1
acme.sh --issue -d mydomain.com --nginx /etc/conf/nginx/domain.com.conf

参数说明:

  • -d : 需要生成证书的域名 (支持多个)
  • –nginx : nginx该域名的配置文件 (会重写,但是完成后会恢复)

生成方式 ④

如果你还没有运行任何 web 服务, 80 端口是空闲的, 那么 acme.sh 还能假装自己是一个webserver, 临时听在 80 端口, 完成验证:

1
acme.sh --issue -d mydomain.com --standalone

注意事项

⭐️ ⭐️ ⭐️ 无论是 apache 还是 nginx 模式, acme.sh 在完成验证之后, 会恢复到之前的状态, 都不会私自更改你本身的配置. 好处是你不用担心配置被搞坏, 也有一个缺点, 你需要自己配置 ssl 的配置, 否则只能成功生成证书, 你的网站还是无法访问 https. 我选用的就是方式 ③
更高级的用法:
How to issue a cert

手动 DNS 方式

手动在域名上添加一条 txt 解析记录,验证域名的所有权
这种方式的好处是, 你不需要任何服务器, 不需要任何公网 ip, 只需要 dns 的解析记录即可完成验证. 坏处是,如果不同时配置 Automatic DNS API,使用这种方式 acme.sh 将无法自动更新证书,每次都需要手动再次重新解析验证域名所有权。

1
2
acme.sh --issue --dns -d mydomain.com \
 --yes-I-know-dns-manual-mode-enough-go-ahead-please

然后, acme.sh 会生成相应的解析记录显示出来, 你只需要在你的域名管理面板中添加这条 txt 记录即可.
等待解析完成之后, 重新生成证书:

1
2
acme.sh --renew -d mydomain.com \
  --yes-I-know-dns-manual-mode-enough-go-ahead-please

注意第二次这里用的是 –renew
dns 方式的真正强大之处在于可以使用域名解析商提供的 api 自动添加 txt 记录完成验证.
acme.sh 目前支持 cloudflare, dnspod, cloudxns, godaddy 以及 ovh 等数十种解析商的自动集成.
dnspod 为例, 你需要先登录到 dnspod 账号, 生成你的 api idapi key, 都是免费的. 然后:

1
2
3
4
5
export DP_Id="1234"

export DP_Key="sADDsdasdgdsf"

acme.sh --issue --dns dns_dp -d aa.com -d www.aa.com

证书就会自动生成了. 这里给出的 api idapi key 会被自动记录下来, 将来你在使用 dnspod api 的时候, 就不需要再次指定了. 直接生成就好了:

1
acme.sh --issue -d mydomain2.com --dns  dns_dp

⭐️ DNS自动模式(建议)

原理:这个方法会向域名解析平台添加一个TXT记录值;所以需要提供平台的 Key 和 Secret; 参考源码:https://github.com/acmesh-official/acme.sh/blob/master/dnsapi/dns_tencent.sh 可以根据需求选择不同的解析平台(阿里云,腾讯云。。等)我选择的是腾讯云

切换签发平台

1
2
#切换默认平台为letsencrypt 其他更换最后平台即可
acme.sh --set-default-ca --server letsencrypt

脚本默认的签发平台是 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解析平台秘钥

我这里选择的是腾讯云;大家也可以根据自己的需求选择不同的解析平台;
image.png
获取腾讯云的 Key 和 **Secret;**添加到环境变量; 第一次成功后会自动保存到 account.conf 中;所以不需要每次都导入;

1
2
export Tencent_SecretId="AKID****************"
export Tencent_SecretKey="1sW**********************"

生成证书

1
acme.sh --issue --dns dns_tencent -d mydomain.com -d mydomain2.com

查看源码可得知:**acme.sh **读取腾讯云中的 Api 授权ID和密码;并通过 dns_tencent 参数指定 DNS 的供应商设置为腾讯云;然后通过 API 自动为指定域名添加 TXT 记录;并在验证完毕后移除 TXT 记录;
⭐ ⭐️ 注意:API 授权信息:Key 和 Secret 将保存在 ~/.acme.sh/account.conf 中

acme.sh 安装证书

除了apache自动安装之外,nginx 的证书安装也是半自动的,自己只需修改 nginx 配置文件即可

Nginx 证书

1
2
3
4
5
6
# 此处以www.gubo.org为例,一定要修改为自己的域名
# 证书路径设置为/etc/nginx/ssl/,可自行设置为其它路径
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"

参数说明:
-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/.cer ,否则 SSL Labs 的测试会报 Chain issues Incomplete 错误。

Apache证书

1
2
3
4
5
acme.sh --install-cert -d example.com \
--cert-file      /path/to/certfile/in/apache/cert.pem  \
--key-file       /path/to/keyfile/in/apache/key.pem  \
--fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \
--reloadcmd     "service apache2 force-reload"

查看安装证书信息

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
root@VM-16-12-ubuntu:~/.acme.sh# acme.sh --info -d food.xjr2018.com
[Thu Oct 12 15:44:50 CST 2023] The domain 'food.xjr2018.com' seems to have a ECC cert already, lets use ecc cert.
DOMAIN_CONF=/root/.acme.sh/food.xjr2018.com_ecc/food.xjr2018.com.conf
Le_Domain=food.xjr2018.com
Le_Alt=no
Le_Webroot=nginx:/www/server/panel/vhost/nginx/food.xjr2018.com.conf
Le_PreHook=
Le_PostHook=
Le_RenewHook=
Le_API=https://acme.zerossl.com/v2/DV90
Le_Keylength=ec-256
Le_OrderFinalize=https://acme.zerossl.com/v2/DV90/order/uyxGZw4tH4oNIBWwnA8iqw/finalize
Le_LinkOrder=https://acme.zerossl.com/v2/DV90/order/uyxGZw4tH4oNIBWwnA8iqw
Le_LinkCert=https://acme.zerossl.com/v2/DV90/cert/7jp1094e1XBfZdZHYqjFKw
Le_CertCreateTime=1697020345
Le_CertCreateTimeStr=2023-10-11T10:32:25Z
Le_NextRenewTimeStr=2023-12-09T10:32:25Z
Le_NextRenewTime=1702117945
Le_RealCertPath=
Le_RealCACertPath=
Le_RealKeyPath=/www/server/nginx/conf/ssl/food.xjr2018.com/food.xjr2018.com.key.pem
Le_ReloadCmd=
Le_RealFullChainPath=/www/server/nginx/conf/ssl/food.xjr2018.com/food.xjr2018.com.cert.pem

acme.sh 自动续期

目前 Let’s Encrypt 证书的有效期是 90 天,官方推荐的方式是脚本自动化续签

1
18 8 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

acme.sh 自动更新工具

Let’s Encrypt 一直处于高速发展的状态,每隔一段时间都会添加新的特性,而 acme.sh 也会随着官方不断更新,所以保持 acme.sh 更新是很有必要的,而 acme.sh 也提供了自动升级的功能:

手动升级

1
acme.sh --upgrade

自动升级

1
acme.sh  --upgrade  --auto-upgrade

关闭自动升级

1
acme.sh --upgrade  --auto-upgrade  0

参考资料

  1. 官方简略教程:

https://github.com/Neilpang/acme.sh/wiki/%E8%AF%B4%E6%98%8E

  1. Let’s Encrypt证书快速申请并自动续期:

无客户端快速申请并自动续期Let’s Encrypt证书 – 古博

  1. Mozilla SSL配置生成器:

Redirecting to ssl-config.mozilla.org…

0%