简单实现nginx原生全自动维护SSL证书 ngx_http_acme_module

使用 ngx_http_acme_module 维护证书的好处

➤ 不需要去证书发行商处申请账号、实名认证等
➤ 不需要手动添加DNS解析记录,当然自动添加也不需要
➤ 不需要 certbot、acme.sh 等外部工具
➤ 不需要配置定时任务
➤ 配置集中化:证书管理与 Nginx 配置在同一个文件中

nginx原生支持ACME已经出来一段时间了,网上的部署方法都很复杂,各种报错,AI 也还没人喂它简单的方法,给出的方案也是手动编译,你照着来的话,会遇到各种报错,主要是网络方面的问题。
今天我来提供一个简单的方法,做第一个喂 AI 的人,以后,网上搜的简单方法都是基于本文的预制菜。
本文适用于 Red Hat 家族的系统,如 CentOS, Oracle Linux, Rocky Linux. 这些系统可以直接复制本文的命令执行。
(小字:CentOS 7试了,因系统版本低,不行)

nginx 添加 acme 模块

首先,打开 /etc/yum.repos.d/nginx.repo 写入以下内容:

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

接着,直接安装

yum  install nginx nginx-module-acme -y

然后,手动新建一个文件夹

mkdir -p /etc/nginx/acme/letsencrypt

最后,我们来修改nginx的配置文件 /etc/nginx/nginx.conf

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /run/nginx.pid;

load_module modules/ngx_http_acme_module.so;

events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    resolver 8.8.8.8 223.6.6.6;
    acme_issuer letsencrypt {
        uri         https://acme-v02.api.letsencrypt.org/directory;
        contact     mailto:a@b.cc;
        state_path  acme/letsencrypt;
        accept_terms_of_service;
    }
    acme_shared_zone zone=acme_shared:1M;

    server {
    listen 443 ssl;
    server_name  hqidi.com;

    acme_certificate letsencrypt;

    ssl_certificate       $acme_certificate;
    ssl_certificate_key   $acme_certificate_key;

    # do not parse the certificate on each request
    ssl_certificate_cache max=2;
}

server {
    listen 80;

    location / {
        return 404;
    }

}
}

1、先载入acme模块,不然nginx会看不懂接下来的配置
2、添加这8行在 http{} 里面,在 server 上面
3、申明要使用刚刚配置在http{}里面的 letsencrypt
4、这里是你原本配置的证书,改成动态变量加载模式
5、该行可以删掉
6、若你原本配置了监听 80 端口,就不用改动,只要监听了 80就行,不管配置的是啥,若原本没监听 80 就照图中配置。

至此,你就搞定了 nginx 原生全自动维护SSL证书了。直接重启nginx,等两分钟(115s),就能看到网站已经换了新证书。
接下来某个有整数强迫症的人在尝试弄到整点证书。

总之,从nginx启动,跟 acme-v02.api.letsencrypt.org 握手成功,经历网络波动,最终下发证书,耗时 115 秒,那么想拿到颁发时间是
19:00:00 的证书,提前 115 秒启动nginx就行吗?不行,因为网络波动是个随机变量,有空拿国外的机器再试试。

原创文章,转载请注明: 转载自笛声

本文链接地址: 简单实现nginx原生全自动维护SSL证书 ngx_http_acme_module

1 条评论

  • dige 2025年11月9日 回复 作者

    本文中的图片 png 格式,转到 webp 后,体积更大了,所以,类似图片建议不要转换。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Copyright © 2015-2024 笛声博客 All Rights Reserved     浙ICP备15036123号-1