惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Microsoft Azure Blog
Microsoft Azure Blog
Engineering at Meta
Engineering at Meta
A
About on SuperTechFans
T
The Blog of Author Tim Ferriss
I
InfoQ
博客园_首页
G
Google Developers Blog
爱范儿
爱范儿
Last Week in AI
Last Week in AI
量子位
阮一峰的网络日志
阮一峰的网络日志
雷峰网
雷峰网
酷 壳 – CoolShell
酷 壳 – CoolShell
Vercel News
Vercel News
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
GbyAI
GbyAI
月光博客
月光博客
The GitHub Blog
The GitHub Blog
V
Visual Studio Blog
N
Netflix TechBlog - Medium
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 司徒正美
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 聂微东

烧饼博客

【收】溢价 60 收 Vmiss la tri - 交易 - 烧饼论坛 新人报道 - 综合 - 烧饼论坛 关于本地自建大模型想听听大佬们的意见 - 综合 - 烧饼论坛 现在 ChatGPT 哪个区的价格最划算? - AI - 烧饼论坛 无聊, 氵个帖 - 综合 - 烧饼论坛 我看用户数量还没我的 id 大 - 综合 - 烧饼论坛 突然来到了这里。新人报道 - 综合 - 烧饼论坛 新人报道哈,水下 - 综合 - 烧饼论坛 来的早才能 ID 好 - 综合 - 烧饼论坛 新人报到,初来乍到 - 综合 - 烧饼论坛 祝贺烧饼论坛开业大吉,又多了一个好去处 - 综合 - 烧饼论坛 这个社区这么火吗 🔥🔥🔥🔥我在隔壁社区都能看见有人在求邀请码 - 综合 - 烧饼论坛 2026-8-21 今日论坛词云 - 综合 - 烧饼论坛 有懂机械硬盘行情的家人吗 - 硬件 - 烧饼论坛 目前最强核显是不是 8700G? - 硬件 - 烧饼论坛 lao1.me 社区祝贺烧饼论坛开业 - 综合 - 烧饼论坛 之前注册过 wo.sb,不知道现在这个域名在谁手里 - 综合 - 烧饼论坛 大家在哪里看见这个网站的? 留念一下 - 综合 - 烧饼论坛 大家都是从哪找来的这里鸭? - 综合 - 烧饼论坛 收 hostdzire 的 LAX/SFO 三年付 - 交易 - 烧饼论坛 新人报道 - 综合 - 烧饼论坛 这论坛有力气 - 综合 - 烧饼论坛 蓝色论坛风格自定义 css - 综合 - 烧饼论坛 新人报到,这域名,有实力。😥 - 综合 - 烧饼论坛 agents ci 智能体社区祝贺烧饼论坛成立!!!!! - 综合 - 烧饼论坛 刚来,发帖测试一下 - 综合 - 烧饼论坛 sb 论坛 vip 限量开启 - 综合 - 烧饼论坛 codex 要发重置卡啦! - AI - 烧饼论坛 【油猴脚本】快来领取你的烧饼小人 - 技术 - 烧饼论坛 大佬们快多分享一些自定义 CSS 吧! - 综合 - 烧饼论坛
Debian / Ubuntu 下使用 nginx-acme 自动签发并配置 SSL 证书
Showfom · 2026-01-16 · via 烧饼博客
Debian / Ubuntu 下使用 nginx-acme 自动签发并配置 SSL 证书

本文将介绍在 Debian 或 Ubuntu 下使用 nginx-acme 自动签发并配置 SSL 证书的方法。

本文适合 Debian Stable 和 Ubuntu LTS,请使用 root 用户进行操作。

#1、什么是 nginx-acme

nginx-acme 是 Nginx 官方开发的基于 ACME 协议自动签发 SSL 证书的模块,隔壁 Caddy 都出了几百年的功能, Nginx 也终于赶上了。

和 Nginx 使用 C 语言开发不同,这个模块是用 Rust 语言开发的,这里就不做评价。

这个模块支持 RFC8555RFC8737RFC8738draft-ietf-acme-profiles 等规范,目前我实际测试下来已经基本可以用于生产环境。

#2、安装 N.WTF

这里我们使用烧饼博客打包的 N.WTF,这个项目已经集成了 nginx-acme 模块,可以做到开箱即用。

首先,安装一些必要的软件包:

sudo apt update
sudo apt upgrade -y
sudo apt install curl vim wget gnupg dpkg apt-transport-https lsb-release ca-certificates

然后加入 N.WTF 的 GPG 公钥和 apt 源:

curl -sSL https://n.wtf/public.key | sudo bash -c 'gpg --dearmor > /usr/share/keyrings/n.wtf.gpg'
sudo bash -c 'echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/n.wtf.gpg] https://mirror-cdn.xtom.com/sb/nginx/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/n.wtf.list'

国内机器可以用清华 TUNA 的国内源:

curl -sSL https://mirrors.tuna.tsinghua.edu.cn/n.wtf/public.key | sudo bash -c 'gpg --dearmor > /usr/share/keyrings/n.wtf.gpg'
sudo bash -c 'echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/n.wtf.gpg] https://mirrors.tuna.tsinghua.edu.cn/n.wtf/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/n.wtf.list'

Debian 下也可以直接使用 extrepo:

sudo apt update
sudo apt install extrepo -y
sudo extrepo enable n.wtf

接着更新系统并安装 Nginx:

sudo apt update
sudo apt install nginx-extras -y

#3、nginx-acme 准备工作

准备工作很简单,我们需要建立一个目录来存放 SSL 证书并给予正确的权限,这里我们以 /var/cache/nginx/letsencrypt 为演示:

sudo mkdir -p /var/cache/nginx
sudo mkdir -p /var/cache/nginx/letsencrypt
sudo chown 33:33 /var/cache/nginx -R

然后别忘了把域名解析到你的服务器哦!

#4、配置 Nginx 站点

我们以 example.com 为例,假设你的邮箱是 [email protected],需要配置的域名是 example.comwww.example.com,并且希望访问 www.example.com 跳转到 example.com

直接修改 /etc/nginx/sites-enabled/default 文件:

resolver 8.8.8.8:53 ipv6=off valid=5s;

acme_issuer letsencrypt {
    uri         https://acme-v02.api.letsencrypt.org/directory;
    contact     user@example.com;
    state_path  /var/cache/nginx/letsencrypt;
    accept_terms_of_service;
    ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt;
    ssl_verify off;
}

acme_shared_zone zone=ngx_acme_shared:1M;

server {
    # Listen on port 80 for all IPv4 and IPv6 addresses
    listen 80 default_server;
    listen [::]:80 default_server;
   
    # Match all domain names
    server_name _;

    location /.well-known/ {
        return 404;
    }

    location / {
        # Redirect all other HTTP requests to HTTPS using 301 permanent redirect
        return 301 https://$host$request_uri;
    }
}

server {
    # Standard TLS listening
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;

    # HTTP/2 protocol support
    http2 on;
   
    # HTTP/3 QUIC protocol support
    listen 443 quic reuseport;
    listen [::]:443 quic reuseport;
    add_header Alt-Svc 'h3=":443"; ma=86400' always;
    add_header X-Protocol $server_protocol always;

    server_name example.com;
    root /var/www/html;
    index index.html;

    # modern configuration
    ssl_protocols TLSv1.3;
    ssl_ecdh_curve X25519:prime256v1:secp384r1;
    ssl_prefer_server_ciphers off;

    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 443 ssl;
    listen [::]:443 ssl;

    http2 on;

    listen 443 quic;
    listen [::]:443 quic;

    add_header Alt-Svc 'h3=":443"; ma=86400' always;
    add_header X-Protocol $server_protocol always;

    server_name www.example.com;
    return 301 https://example.com$request_uri;

    ssl_protocols TLSv1.3;
    ssl_ecdh_curve X25519:prime256v1:secp384r1;
    ssl_prefer_server_ciphers off;

    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;
}

然后验证 Nginx 配置并重新加载:

sudo nginx -t
sudo nginx -s reload

此时,在默认的 Nginx 日志文件 /var/log/nginx/access.log 中可以看到 Let's Encrypt 验证服务器的请求记录:

23.178.112.210 - - [15/Jan/2026:16:08:18 +0000] "GET /.well-known/acme-challenge/blablablablablablablablablablablablablablab HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)"
34.212.137.78 - - [15/Jan/2026:16:08:18 +0000] "GET /.well-known/acme-challenge/blablablablablablablablablablablablablablab HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)"
18.222.179.58 - - [15/Jan/2026:16:08:18 +0000] "GET /.well-known/acme-challenge/blablablablablablablablablablablablablablab HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)"
16.171.19.61 - - [15/Jan/2026:16:08:18 +0000] "GET /.well-known/acme-challenge/blablablablablablablablablablablablablablab HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)"
13.228.72.222 - - [15/Jan/2026:16:08:18 +0000] "GET /.well-known/acme-challenge/blablablablablablablablablablablablablablab HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)"
2600:3000:2710:200::81 - - [15/Jan/2026:16:08:20 +0000] "GET /.well-known/acme-challenge/blablablablablablablablablablablablablablab HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)"
2600:1f14:804:fd02:f7fd:3c68:dec7:a062 - - [15/Jan/2026:16:08:20 +0000] "GET /.well-known/acme-challenge/blablablablablablablablablablablablablablab HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)"
2600:1f16:269:da00:c9ce:508c:ea69:9c2 - - [15/Jan/2026:16:08:20 +0000] "GET /.well-known/acme-challenge/blablablablablablablablablablablablablablab HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)"
2a05:d016:39f:3101:8b83:62b8:2603:d15d - - [15/Jan/2026:16:08:20 +0000] "GET /.well-known/acme-challenge/blablablablablablablablablablablablablablab HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)"
2406:da18:85:1401:1f69:967a:a988:cdc8 - - [15/Jan/2026:16:08:20 +0000] "GET /.well-known/acme-challenge/blablablablablablablablablablablablablablab HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)"

等待数秒后即可访问 https://example.com/ 了。

如果要给 IP 地址签发证书,则需要在 acme_issuer letsencrypt {} 段里添加一行 profile shortlived;,并且 server_name 必须写入完整的 IP 地址,不能直接用 server_name _ 哦。

不过目前 nginx-acme 最新版本 0.3.1 签发 IP 证书还是会失败,开发版已经修复,应该需要等下一个版本才能使用。

目前最新版本已经支持 IP 地址证书的签发,可以在 accept_terms_of_service; 下方加入一条 profile shortlived; 并且自行修改 server_name example.com; 为你的 IP 地址,比如 server_name 192.0.2.2 2001:db8::2; 即可。

读者们在使用过程中如果遇到问题,可以在 V2EX 交流讨论:

https://be.st/Mv7j