Nginx + Let’s Encrypt 免费 SSL 证书 的完整配置过程

Ubuntu 22.04 + Nginx + Let's Encrypt 免费 SSL 证书 的完整配置过程,按你这次已经成功的实际路径,整理成一份可直接复用的标准流程。

你这次已经成功申请到了证书,证书路径是:

bash 复制代码
/etc/letsencrypt/live/www.shtctec.com/fullchain.pem
/etc/letsencrypt/live/www.shtctec.com/privkey.pem

而且 Certbot 已经把证书部署到了 Nginx,并创建了自动续期任务。 

Ubuntu 22.04 上配置免费 SSL 证书的完整过程

一、适用场景

这套方案适合:

• Ubuntu 22.04

• Nginx 部署网站或项目

• 有自己的域名

• 想使用免费 HTTPS 证书

• 域名能公网访问

免费证书一般使用 Let's Encrypt,官方推荐从 Certbot 这类 ACME 客户端开始;对于普通单域名网站,最常用的是 HTTP-01 验证。 

二、前提条件

在开始前,需要先满足这几个条件:

  1. 域名已经注册

比如:

bash 复制代码
www.shtctec.com
  1. 域名已经解析到服务器公网 IP

至少要有 DNS 记录:

• www -> 你的服务器公网 IP

• 如果你要申请主域名,还要有:

• @ -> 你的服务器公网 IP

如果 DNS 不存在,Certbot 会报 NXDOMAIN。这也是你中间那次失败的真正原因。 

  1. 服务器安装了 Nginx

并且 Nginx 配置可正常加载。

  1. 公网开放 80 和 443 端口

HTTP-01 验证要求 Let's Encrypt 能从公网访问你服务器上的 80 端口。DNS-01 才不需要入站访问。 

三、安装 Nginx

如果还没安装:

bash 复制代码
sudo apt update
sudo apt install nginx -y

启动并设置开机自启:

bash 复制代码
sudo systemctl enable nginx
sudo systemctl start nginx

检查状态:

bash 复制代码
sudo systemctl status nginx

检查配置语法:

bash 复制代码
sudo nginx -t

如果看到:

bash 复制代码
syntax is ok
test is successful

说明 Nginx 配置没有语法问题。

四、开放防火墙和云安全组

1)Ubuntu 防火墙

如果启用了 ufw,放行 80 和 443:

bash 复制代码
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw reload
sudo ufw status

2)云服务器安全组

如果你是阿里云 / 腾讯云 / 华为云 / AWS,还要在云控制台里放行:

• TCP 80

• TCP 443

来源一般先设为:

bash 复制代码
0.0.0.0/0

五、确认域名解析正确

在服务器执行:

bash 复制代码
nslookup www.shtctec.com

或者:

bash 复制代码
dig www.shtctec.com +short

返回结果应该是你的服务器公网 IP。

如果域名没有解析成功,Let's Encrypt 不会进入 Nginx 验证阶段,而会直接报 DNS 错误。 

六、准备一个可用的 Nginx 站点配置

先确保 Nginx 能处理该域名的 HTTP 请求。

编辑配置文件,例如默认站点:

bash 复制代码
sudo nano /etc/nginx/sites-available/default

写一个最简单的 80 端口配置:

bash 复制代码
server {
    listen 80;
    server_name www.shtctec.com;

    root /var/www/html;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }
}

如果你是反向代理项目,也可以这样写:

bash 复制代码
server {
    listen 80;
    server_name www.shtctec.com;

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

检查配置:

bash 复制代码
sudo nginx -t

重载 Nginx:

bash 复制代码
sudo systemctl reload nginx

七、验证 80 端口和站点是否真的可访问

先看 Nginx 是否监听了 80 端口:

bash 复制代码
sudo ss -lntp | grep :80

再本机测试:

bash 复制代码
curl -I http://www.shtctec.com

如果能返回 200、301、302 等响应,说明 HTTP 基本正常。

你也可以直接在浏览器里打开:

bash 复制代码
http://www.shtctec.com

这一步非常关键。因为 HTTP-01 验证本质上就是 Let's Encrypt 去访问域名下一个特定路径,验证你是否控制这个站点。 

八、安装 Certbot

Certbot 官方的 Nginx 指南支持用 snap 安装 Certbot,并用 --nginx 方式自动申请和写入配置。 

执行:

bash 复制代码
sudo apt install snapd -y
sudo snap install core
sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

检查版本:

bash 复制代码
certbot --version

九、申请免费 SSL 证书

最常用命令:

bash 复制代码
sudo certbot --nginx

然后按提示输入:

• 邮箱

• 同意协议

• 输入域名

你这次成功输入的是:

bash 复制代码
www.shtctec.com

也可以直接一条命令指定域名:

bash 复制代码
sudo certbot --nginx -d www.shtctec.com

如果要同时申请主域名和 www:

bash 复制代码
sudo certbot --nginx -d shtctec.com -d www.shtctec.com

--nginx 的作用是:Certbot 会自动修改 Nginx 配置、部署证书,并在后续续期时自动 reload Nginx。 

十、成功后的表现

成功后通常会看到类似你这次的输出:

• 证书签发成功

• 证书保存路径

• 私钥保存路径

• 证书过期时间

• 已自动部署到 Nginx

• 已启用自动续期

你这次成功信息里最关键的是:

bash 复制代码
Certificate is saved at: /etc/letsencrypt/live/www.shtctec.com/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/www.shtctec.com/privkey.pem
Successfully deployed certificate for www.shtctec.com
Congratulations! You have successfully enabled HTTPS

这说明证书已经生效。

十一、证书文件位置

Certbot 生成的正式证书通常在:

bash 复制代码
/etc/letsencrypt/live/你的域名/

比如你的:

bash 复制代码
/etc/letsencrypt/live/www.shtctec.com/fullchain.pem
/etc/letsencrypt/live/www.shtctec.com/privkey.pem
复制代码
•	fullchain.pem:证书链文件
•	privkey.pem:私钥文件

十二、Nginx 中的 HTTPS 配置长什么样

如果 Certbot 自动修改了配置,一般会在 Nginx 中加上类似内容:

bash 复制代码
server {
    listen 443 ssl;
    server_name www.shtctec.com;

    ssl_certificate /etc/letsencrypt/live/www.shtctec.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.shtctec.com/privkey.pem;

    root /var/www/html;
    index index.html index.htm;
}

并且还可能增加 80 到 443 的跳转。

可以查看当前配置:

bash 复制代码
sudo nginx -T

十三、验证 HTTPS 是否成功

浏览器访问:

bash 复制代码
https://www.shtctec.com

如果地址栏出现小锁,说明 HTTPS 生效。

也可以用命令测试:

bash 复制代码
curl -I https://www.shtctec.com

十四、自动续期

Let's Encrypt 证书不是永久证书,需要自动续期。官方 Certbot 支持自动续期,而你这次输出里也明确提示:

bash 复制代码
Certbot has set up a scheduled task to automatically renew this certificate in the background.

这表示系统已经创建了自动续期任务。用 --nginx 时,续期后 Nginx 会自动 reload。 

你可以手动测试一次续期流程是否正常:

bash 复制代码
sudo certbot renew --dry-run

查看定时任务:

bash 复制代码
systemctl list-timers | grep certbot

或者:

bash 复制代码
sudo systemctl status snap.certbot.renew.timer

十五、这次你之前失败过的两个典型原因

1)80 端口访问超时

你第一次失败时,报的是:

• 外部无法访问 /.well-known/acme-challenge/...

• 本质是 HTTP-01 验证失败

• 常见原因是:

• 安全组没放行 80

• UFW 没放行 80

• Nginx 没监听 80

• 域名虽然解析了,但站点没通

HTTP-01 验证确实要求公网能访问 80。 

2)域名写错或 DNS 不存在

你第二次失败时报的是:

• NXDOMAIN looking up A

• 本质是 DNS 根本查不到域名

• 这类情况与 Nginx 无关,先修 DNS

这也是 Let's Encrypt 社区里最典型的 DNS 错误之一。 

十六、最终标准操作清单

以后你再给别的域名配免费证书,可以直接照这个顺序走:

  1. 安装 Nginx
bash 复制代码
sudo apt update
sudo apt install nginx -y
  1. 开放端口
bash 复制代码
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw reload
  1. 域名解析到服务器 IP

确认:

bash 复制代码
dig 域名 +short
  1. 配置 Nginx 的 80 端口站点
bash 复制代码
sudo nginx -t
sudo systemctl reload nginx
  1. 安装 Certbot
bash 复制代码
sudo apt install snapd -y
sudo snap install core
sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
  1. 申请证书
bash 复制代码
sudo certbot --nginx -d 你的域名
  1. 测试续期
bash 复制代码
sudo certbot renew --dry-run

十七、一句话总结

你这次完整成功的核心流程就是:

域名正确解析到服务器 → 80/443 放通 → Nginx 正常响应域名 → 安装 Certbot → 执行 sudo certbot --nginx → 自动签发证书并写入 Nginx → 自动续期。 

相关推荐
乘云数字DATABUFF3 天前
5分钟部署开源APM Databuff:OpenTelemetry全链路追踪入门实战
运维·后端
荣--5 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森5 天前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜6 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB7 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode8 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220709 天前
如何搭建本地yum源(上)
运维
ping某10 天前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
大树8812 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠12 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql