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 验证。 
⸻
二、前提条件
在开始前,需要先满足这几个条件:
- 域名已经注册
比如:
bash
www.shtctec.com
- 域名已经解析到服务器公网 IP
至少要有 DNS 记录:
• www -> 你的服务器公网 IP
• 如果你要申请主域名,还要有:
• @ -> 你的服务器公网 IP
如果 DNS 不存在,Certbot 会报 NXDOMAIN。这也是你中间那次失败的真正原因。 
- 服务器安装了 Nginx
并且 Nginx 配置可正常加载。
- 公网开放 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 错误之一。 
⸻
十六、最终标准操作清单
以后你再给别的域名配免费证书,可以直接照这个顺序走:
- 安装 Nginx
bash
sudo apt update
sudo apt install nginx -y
- 开放端口
bash
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw reload
- 域名解析到服务器 IP
确认:
bash
dig 域名 +short
- 配置 Nginx 的 80 端口站点
bash
sudo nginx -t
sudo systemctl reload nginx
- 安装 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
- 申请证书
bash
sudo certbot --nginx -d 你的域名
- 测试续期
bash
sudo certbot renew --dry-run
⸻
十七、一句话总结
你这次完整成功的核心流程就是:
域名正确解析到服务器 → 80/443 放通 → Nginx 正常响应域名 → 安装 Certbot → 执行 sudo certbot --nginx → 自动签发证书并写入 Nginx → 自动续期。