Let’s Encrypt 是一个由非营利性组织互联网安全研究小组(ISRG)提供的免费、自动化和开放的证书颁发机构(CA)。
Let's Encrypt 的签发/续签,通过脚本自动化完成;通过 acme.sh 相对来说是比较省心,自动化程度较高;
安装 acme.sh工具
curl https://get.acme.sh | 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 的证书验证方法,需要在域名指向的服务器的根目录下放置一个指定的文件,服务会通过访问这个文件来验证你是否对域名有所有权,只要验证通过就可以申请证书:
生成方式 ①
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
参数说明:
生成方式 ③
如果你用的 nginx 服务器, 或者反代, acme.sh 还可以智能的从 nginx 的配置中自动完成验证, 你不需要指定网站根目录:
acme.sh --issue -d mydomain.com --nginx /etc/conf/nginx/domain.com.conf
参数说明:
生成方式 ④
如果你还没有运行任何 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 id 和 api key, 都是免费的. 然后:
export DP_Id="1234"
export DP_Key="sADDsdasdgdsf"
acme.sh --issue --dns dns_dp -d aa.com -d www.aa.com
证书就会自动生成了. 这里给出的 api id 和 api 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
参考资料
- 官方简略教程:
https://github.com/Neilpang/acme.sh/wiki/%E8%AF%B4%E6%98%8E
- Let’s Encrypt证书快速申请并自动续期:
无客户端快速申请并自动续期Let’s Encrypt证书 – 古博
- Mozilla SSL配置生成器:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。