使用 acme.sh 自动获取 LetsEncrypt 的 SSL 证书
acme.sh
References
备注
下列代码主要为方便记忆,并非可用。
安装
见 References#2 acme.sh 中文 WiKi
curl https://get.acme.sh
可选
配置 Servers,默认 SSL server 是 zerossl,我用的是 LetsEncrypt.org
。
--server <server_uri> ACME Directory Resource URI. (default: https://acme.zerossl.com/v2/DV90)
See: https://github.com/acmesh-official/acme.sh/wiki/Server
代码:
acme.sh --server LetsEncrypt.org
示例:
# /bin/bash
DOMAIN_NAME=$1
ROOT_DIR=$2
# 生成 RSA 证书:
acme.sh --issue -d $DOMAIN_NAME -w $ROOT_DIR
# 生成 ECC 证书:
# PS: acme.sh 有三种验证方式可供选择:
# 1. HTTP webroot 验证
# 2. standalone 验证
# 3. DNS 验证
# 假设您已经有一个运行中的 web 服务器并希望使用 HTTP webroot 验证,您需要指定 webroot 目录的路径。
# !!! 一定要找准 webroot 目录,否则执行 `--issue` 命令会失败
# 使用 acme.sh 签发证书。将 your_webroot 替换为实际的 webroot 目录路径,然后运行以下命令:
acme.sh --issue -d $DOMAIN_NAME -d www.$DOMAIN_NAME -w $ROOT_DIR --keylength ec-256
# 查看已生成的证书
acme.sh --list
# 将 ~/.acme.sh/$DOMAIN_NAME_ecc(我使用 ECC 证书所以有 ECC) 目录下内容复制到 nginx 配置目录下
# 见 References#1 [3. copy/安装 证书](https://github.com/acmesh-official/acme.sh/wiki/%E8%AF%B4%E6%98%8E#3-copy%E5%AE%89%E8%A3%85-%E8%AF%81%E4%B9%A6)
cp -r /root/.acme.sh/$DOMAIN_NAME_ecc/ /etc/nginx/ssl/$DOMAIN_NAME/
# 安装 RSA 证书
acme.sh --install-cert -d $DOMAIN_NAME \
--key-file /etc/nginx/ssl/$DOMAIN_NAME/$DOMAIN_NAME.rsa.key \
--fullchain-file /etc/nginx/ssl/$DOMAIN_NAME/$DOMAIN_NAME.rsa.crt \
--reloadcmd "systemctl reload nginx"
# 安装 ECC 证书
# 使用 –installcert 命令,并指定目标位置,然后证书文件会被复制到相应的位置
acme.sh --install-cert -d $DOMAIN_NAME \
--key-file /etc/nginx/ssl/$DOMAIN_NAME/$DOMAIN_NAME.key \
--fullchain-file /etc/nginx/ssl/$DOMAIN_NAME/$DOMAIN_NAME.crt \
# –reloadcmd 参数用于让web服务器重新加载新的证书文件,例子中使用的是 nginx 服务器,您也可以定义成其它服务器。
# (一个小提醒, 这里用的是 service nginx force-reload, 不是 service nginx reload, 据测试, reload 并不会重新加载证书, 所以用的 force-reload)
--reloadcmd "service nginx force-reload" \
# –ecc 参数用于 ECC 证书,rsa证书请不要添加此参数
--ecc
# 4. 查看已安装证书信息
acme.sh --info -d $DOMAIN_NAME
# Let’s Encrypt 的证书有效期为3个月,每3个月得重新申请证书
# 通过 acme.sh 可以自动管理SSL证书的申请
# 通过上面步骤的安装后 acme.sh 会定期自动更新 SSL 证书
nginx
Nginx 中需要更新 SSL 相关配置。
nginx -s reload
PS:当使用 --nginx 服务器请求 acme.sh 签发证书报接口未找到,需要在 nginx 服务器下添加一个错误提示的 接口 path 以让 acme.sh 请求特定的 SSL server 检查域名所有权。
Trouble Shooting
Q1:我仅生成了 $DOMAIN_NAME 的 ECC
,忘了 www.$DOMAIN_NAME
导致 www.$DOMAIN_NAME 的 HTTPS 没有生效。
A1:重新生成 。 acme.sh --issue -d $DOMAIN_NAME -d www.$DOMAIN_NAME -w $ROOT_DIR --nginx --force
,--nginx 因为我用的 nginx 服务器
。
Q2:我生成的默认就是 ECC 而不是 RSA?
A2:可以通过命令 acme.sh --list
下 KeyLength
查看。