Let’s Encrypt 是一个由非营利性组织互联网安全研究小组(ISRG)提供的免费、自动化和开放的证书颁发机构(CA)。
Let's Encrypt 的签发/续签,通过脚本自动化完成;通过 acme.sh 相对来说是比较省心,自动化程度较高;


安装 acme.sh工具

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

生成方式 ①

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

参数说明:

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

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

生成方式 ②

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

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

参数说明:

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

生成方式 ③

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

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

参数说明:

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

生成方式 ④

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

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 将无法自动更新证书,每次都需要手动再次重新解析验证域名所有权。

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

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

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, 都是免费的. 然后:

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 的时候, 就不需要再次指定了. 直接生成就好了:

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

acme.sh 安装证书

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

Nginx 证书

# 此处以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/<domain>.cer ,否则 SSL Labs 的测试会报 Chain issues Incomplete 错误。

Apache证书

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"

查看安装证书信息

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 天,官方推荐的方式是脚本自动化续签

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 也提供了自动升级的功能:

手动升级

acme.sh --upgrade

自动升级

acme.sh  --upgrade  --auto-upgrade

关闭自动升级

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...


一只小蜗牛
318 声望12 粉丝