【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

相关推荐
.柒宇.5 小时前
nginx入门教程
运维·nginx
如来神掌十八式16 小时前
nginx + spring gateway+spring 服务_nginx 转发到 gateway
nginx·spring·gateway
hotlinhao16 小时前
Nginx rewrite last 与 redirect 的区别——Vue history 模式短链接踩坑记录
前端·vue.js·nginx
tryCbest2 天前
Nginx常用操作命令-Linux和Windows系统
linux·windows·nginx
難釋懷2 天前
Nginx实现本地缓存查询
nginx·spring·缓存
ZzzZZzzzZZZzzzz…2 天前
Nginx 平滑升级:从 1.26.3 到 1.28.0,用户无感知
linux·运维·nginx·平滑升级·nginx1.26.3·nginx1.28.0
BullSmall2 天前
Prometheus 如何配置监控 SSL 证书即将过期
网络协议·ssl·prometheus
robch2 天前
python3 -m http.server 8001直接启动web服务类似 nginx
前端·nginx·http
cyber_两只龙宝3 天前
【Nginx】Nginx实现FastCGI详解
linux·运维·nginx·云原生·php·memcached·fastcgi
BullSmall3 天前
Prometheus 可以监控docker 部署的Nginx 吗?
nginx·docker·prometheus