【Let‘s Encrypt SSL】使用 acme.sh 给 Nginx 安装 Let’s Encrypt 提供的免费 SSL 证书

安装acme.sh

安装 acme.sh 并设置邮箱用来接受重要通知,如证书快过期未更新通知

bash 复制代码
curl https://get.acme.sh | sh -s email=my@example.com

执行命令后几秒就安装好了,如果半天没有反应请 Ctrl+C 后重新执行命令。acme.sh 安装在 ~/.acme.sh 目录下,并自动创建了一个 cronjob,每天 0:00 点自动检测所有的证书,如果快过期了, 则会自动更新。安装后,理论上会自动添加一个 acme.sh 全局应用别名,但有时候会 command not found,需要手动执行以下命令:source ~/.bashrc 或 source ~/.bash_profile,或关掉终端重新打开,然后再继续下一步。也可以在 ~/.acme.sh 目录下使用 sh acme.sh 执行命令(例如:sh acme.sh --list)

申请证书

Zerossl

acme.sh v3.0 开始默认的免费 SSL 证书变更为:ZeroSSL

相关文章:

从 acme.sh v3.0 说说 ZeroSSL
Zerossl官网

HTTP方式

修改 nginx.conf 配置文件

bash 复制代码
server {
	listen 80;
	#请填写绑定证书的域名
	server_name example.com;
}

申请证书,--day 2 表示更新证书的天数,默认值为 60 天

bash 复制代码
acme.sh --issue -d xh123.cn --nginx --days 2

进入~/.acme.sh 目录下,查看证书信息

手动 DNS 方式

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

手动 DNS 验证

bash 复制代码
acme.sh --issue -d example.com -d "*.example.com" --dns \
--yes-I-know-dns-manual-mode-enough-go-ahead-please

到 DNS 解析中,新增一条 TXT 记录,域名前缀为 _acme-challenge,记录值为终端输出的 TXT value 的值。然后再次执行

bash 复制代码
acme.sh --renew -d example.com -d "*.example.com" \
--yes-I-know-dns-manual-mode-enough-go-ahead-please

DNS API 方式

本文章使用腾讯云 DNSPod

登录腾讯云 DNSPod并创建DNSPos Token 秘钥

获取到秘钥后,在 ~/.acme.sh 目录下的 account.conf 配置文件中添加配置

bash 复制代码
# 腾讯云
export DP_Id="YourId"
export DP_Key="YourToken"

申请证书,--server letsencrypt 表示指定证书申请服务器为 Let's Encrypt,--day 2 表示更新证书的天数,默认值为 60 天

bash 复制代码
acme.sh --issue --server letsencrypt --dns dns_dp -d example.com --days 2

安装证书

不要直接复制证书到目标目录,正确的方式是使用 -install-cert 命令安装。在命令中指定目标位置,证书文件会被复制到相应的位置。reloadcmd 命令:当证书发布/更新后,reloadcmd 命令会被自动调用,让新的配置生效。也就是证书更新之后,nginx 配置的证书信息也会自动更新。

bash 复制代码
acme.sh --install-cert -d example.com \
--key-file       /etc/nginx/conf/ssl/example.com/example.com.key \
--fullchain-file /etc/nginx/conf/ssl/example.com/fullchain.cer \
--reloadcmd      "systemctl force-reload nginx"

nginx.conf 配置证书信息

conf 复制代码
server {
    #SSL 默认访问端口号为 443
    listen 443 ssl;
    #请填写绑定证书的域名
    server_name example.com;
    #请填写证书文件的相对路径或绝对路径
    ssl_certificate /etc/nginx/conf/ssl/example.com/fullchain.cer;
    #请填写私钥文件的相对路径或绝对路径
    ssl_certificate_key /etc/nginx/conf/ssl/example.com/example.com.key;

    location / {
        root   /etc/nginx/html/blog;
        index  index.html index.htm;
    }
}

重启nginx后生效

bash 复制代码
nginx -c /etc/nginx/nginx.conf
nginx -s reload

使用https方式访问域名网站,查看证书信息

其他命令

查看申请的证书

bash 复制代码
acme.sh --list

强制续期证书

bash 复制代码
acme.sh --renew -d example.com --force

删除证书

删除证书

bash 复制代码
acme.sh --remove -d example.com

撤销证书

bash 复制代码
acme.sh --revoke -d example.com

命令执行成功后,需要一并删除在~/.acme.sh目录中的域名文件夹

bash 复制代码
rm -rf example.com_ecc

更新 acme.sh

目前由于 acme 协议和 Let's Encrypt CA 都在频繁的更新,因此 acme.sh 也经常更新以保持同步。

手动升级 acme.sh 到最新版

bash 复制代码
acme.sh --upgrade

如果你不想手动升级,可以开启自动升级:

bash 复制代码
acme.sh --upgrade --auto-upgrade

你也可以随时关闭自动更新:

bash 复制代码
acme.sh --upgrade --auto-upgrade 0

本文参考链接:
acme.sh-实现自动化部署SSL证书(有详细的 DNS API)
Let's Encrypt SSL 泛域名证书申请和配置
nginx 配置 acme.sh

相关推荐
MiNG MENS10 小时前
nginx 代理 redis
运维·redis·nginx
珊瑚怪人11 小时前
一个域名问题
nginx
dxdz13 小时前
一文搞定 Linux Nginx 从安装、启动到 nginx.conf 全配置详解(新手也能看懂)
nginx
遇见火星14 小时前
Nginx 负载均衡配置模板:轮询、权重、IP哈希、最少连接
tcp/ip·nginx·负载均衡
untE EADO16 小时前
Nginx代理到https地址忽略证书验证配置
运维·nginx·https
Treh UNFO18 小时前
nginx的重定向
大数据·数据库·nginx
理人综艺好会18 小时前
nginx了解
运维·nginx
likeGhee19 小时前
docker创建nginx+keepalived+nacos集群(仅测试环境)
nginx·docker
KnowSafe1 天前
自动化+智能化:证书生命周期管理的双重革命
ssl·itrustssl·trustasia·证书自动化
Harvy_没救了1 天前
【网络部署】 Win11 + VMware CentOS8 + Nginx 文件共享服务 Wiki
运维·网络·nginx