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 → 自动续期。 

相关推荐
Net_Walke2 小时前
【Ubuntu】共享文件夹 /mnt/hgfs 下不显示问题解决
linux·运维·ubuntu
何中应2 小时前
Alertmanager设置邮件通知
运维·自动化·prometheus
熊明才2 小时前
PM2 服务器服务运维入门指南
运维·服务器·windows
桦02 小时前
【Linux复习】:多线程
linux·运维
云飞云共享云桌面2 小时前
SolidWorks三维设计不用单独买电脑,1台服务器10个设计用
运维·服务器·数据库·3d·电脑
acaad2 小时前
访问信创系统的服务器报错Received fatal alert: handshake_failure
运维·服务器
大树882 小时前
【无标题】
大数据·运维·服务器·人工智能
南境十里·墨染春水2 小时前
linux学习进展 基础命令 vi基础命令
linux·运维·服务器·笔记·学习
江畔何人初2 小时前
GTID的作用
linux·运维·服务器·mysql·云原生·kubernetes