使用 acme.sh 自动获取 LetsEncrypt 的 SSL 证书

acme.sh

References

  1. acme.sh
  2. acme.sh 中文 WiKi
  3. 使用acme.sh免费申请HTTPS证书

备注

下列代码主要为方便记忆,并非可用。

安装
见 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 Configuration

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 查看。

完结撒花

最终效果

posted @ 2023-03-07 15:22  月光宝盒造梦师  阅读(352)  评论(0编辑  收藏  举报