找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 27|回复: 0

Ubuntu + Nginx + Discuz HTTPS 安全加固实战:DNS 排错、Let's Encrypt 证书申请与自动续期

[复制链接]

5

主题

0

回帖

21

积分

管理员

积分
21
发表于 4 小时前 | 显示全部楼层 |阅读模式
Ubuntu + Nginx + Discuz HTTPS 安全加固实战:DNS 排错、Let's Encrypt 证书申请与自动续期

一、项目背景

最近在 Ubuntu 服务器上部署 Discuz 论坛,Web 服务使用 Nginx,后端使用 PHP 和 MariaDB。为了提高网站访问安全性,准备为站点配置 HTTPS,实现浏览器与服务器之间的加密通信。
实施过程中遇到了几个问题:
  • 域名解析不生效,公共 DNS 返回 NXDOMAIN。
  • 阿里云云解析控制台显示 DNS 配置正常,但公网仍然无法解析。
  • 阿里云云解析日志中没有看到预期的解析记录。
  • Ubuntu 服务器需要安装 Certbot。
  • Certbot 交互式输入邮箱时出现 Invalid email address。
  • 需要确认 Nginx 配置、HTTPS 访问和证书自动续期是否正常。

本文记录整个排查过程及关键命令,供后续部署和运维参考。
二、实验环境

项目配置信息
操作系统Ubuntu Server
Web 服务Nginx
网站程序Discuz
后端组件PHP、MariaDB
域名解析阿里云云解析 DNS
HTTPS 证书Let's Encrypt
证书管理工具Certbot
证书配置方式Certbot Nginx 插件
Web 服务端口TCP 80、443
说明:本文以 brainrb.cn 为示例域名。实际部署时,必须使用自己真实注册且已完成 DNS 解析的域名。
三、HTTPS 安全加固的整体流程

整个实施过程可以分为以下几个阶段:
  • 检查域名注册状态和 DNS 解析。
  • 排查公网 DNS 返回 NXDOMAIN 的原因。
  • 检查服务器公网 IP、Nginx 配置和网络端口。
  • 安装 Certbot。
  • 申请 Let's Encrypt 证书。
  • 配置并验证 Nginx HTTPS。
  • 检查证书自动续期。
  • 验证 Discuz 网站及 HTTP 到 HTTPS 的跳转。

需要注意:DNS、证书签发、Nginx 配置和浏览器访问是不同的环节,应该按顺序逐项验证,而不是出现访问故障就直接修改 Nginx。



四、问题一:域名解析不生效

4.1 检查 DNS 解析记录

最初在阿里云云解析 DNS 控制台中,已经配置了根域名和 www 子域名的 A 记录,指向服务器公网 IP。
Windows CMD 中执行:
nslookup www.brainrb.cn 223.5.5.5nslookup www.brainrb.cn 8.8.8.8nslookup brainrb.cn 223.5.5.5nslookup brainrb.cn 8.8.8.8其中:
  • 223.5.5.5:阿里云公共 DNS。
  • 8.8.8.8:Google 公共 DNS。

当时查询结果均出现:
*** public1.alidns.com can't find brainrb.cn:Non-existent domain这说明当前查询的公共 DNS 认为该域名不存在。
4.2 检查 NS 记录和 SOA 记录

继续执行:
nslookup -type=NS brainrb.cn 223.5.5.5nslookup -type=SOA brainrb.cn 223.5.5.5NS 记录用于查看域名对应的权威 DNS 服务器;SOA 记录包含权威 DNS 区域的相关信息。
当时两条命令同样返回 Non-existent domain,说明问题不只是网站 A 记录没有返回 IP,还需要进一步检查域名注册状态和 DNS 委派。
4.3 检查权威 DNS 服务器

当时域名使用的 DNS 服务器是:
dns3.hichina.comdns4.hichina.com执行:
nslookup www.brainrb.cn dns3.hichina.comnslookup www.brainrb.cn dns4.hichina.com查询过程中,dns4.hichina.com 曾出现超时和 Query refused。
需要注意,Query refused 表示 DNS 服务器拒绝了该次查询,并不能单独证明域名委派一定存在问题。应该结合 NS 查询、权威 DNS 返回结果及注册局状态综合判断。
4.4 检查阿里云控制台

重点检查以下内容:
  • 域名是否已经注册成功。
  • 域名是否存在过期、暂停解析或审核异常。
  • 注册商侧的 DNS 服务器是否与云解析控制台分配的服务器一致。
  • 根域名 @ 和 www 的 A 记录是否启用。
  • A 记录指向的 IP 是否为当前服务器公网 IP。

阿里云云解析控制台显示 DNS 配置正确,并不一定代表公网 DNS 已经可以正常解析。
4.5 最终排查结果

最终发现,问题是查询时域名拼写错误,并不是 Nginx 配置或 Discuz 数据库故障。
这是一次很有代表性的排错经验:排查网络问题时,先确认域名、IP、端口等基础信息,避免在错误的对象上反复操作。
4.6 Ubuntu 服务器使用 dig 排查 DNS

在 Linux 服务器上,可以使用 dig 进一步排查。
安装工具:
apt updateapt install -y dnsutils查询 A 记录:
dig brainrb.cn Adig www.brainrb.cn A查询 NS 记录:
dig brainrb.cn NS指定公共 DNS:
dig @223.5.5.5 brainrb.cn NSdig @8.8.8.8 brainrb.cn A查询权威 DNS:
dig @dns3.hichina.com brainrb.cn SOAdig @dns3.hichina.com brainrb.cn Adig @dns3.hichina.com www.brainrb.cn A逐级追踪 DNS 委派:
dig +trace brainrb.cn NS常见结果解释:
返回结果含义
NOERROR查询正常结束,需要进一步检查答案区是否有记录
NXDOMAIN当前 DNS 查询路径认为该域名不存在
SERVFAIL解析过程中发生错误
REFUSEDDNS 服务器拒绝本次查询
ANSWER SECTION 为空需要结合响应状态、查询类型和权威区信息判断
注意:NOERROR 不代表一定存在所查询的记录;如果没有答案,还需要检查是否为 NODATA 情况。



五、问题二:安装 Certbot

DNS 解析恢复后,开始准备 HTTPS 证书申请。
Certbot 是用于申请和管理 Let's Encrypt 证书的工具,可以配合 Nginx 插件自动配置 HTTPS。
5.1 安装 Snap

在 Ubuntu 服务器上执行:
apt updateapt install -y snapd检查 Snap:
snap version5.2 安装 Certbot

执行:
snap install --classic certbot验证安装:
certbot --version如果提示找不到 certbot 命令,可以先检查:
ls -l /snap/bin/certbot如果文件存在,但系统 PATH 中没有 /snap/bin,可以使用绝对路径执行:
/snap/bin/certbot --version确认路径无误后,也可以创建常用命令的软链接:
ln -s /snap/bin/certbot /usr/bin/certbot执行前先检查 /usr/bin/certbot 是否已经存在,避免覆盖现有文件。
5.3 安装过程中的命令拼写错误

安装过程中曾输入:
sudu sanp install --classic certbot系统提示:
Command 'sudu' not found原因是命令拼写错误:
  • sudu 应为 sudo。
  • sanp 应为 snap。

正确命令:
snap install --classic certbot当终端提示符为 root@hjjj 时,已经具有 root 权限,不需要额外使用 sudo。



六、申请 Let's Encrypt HTTPS 证书

6.1 申请前的检查

首先确认 DNS:
dig +short brainrb.cn Adig +short www.brainrb.cn A预期结果应该返回实际服务器公网 IP。
检查 Nginx:
nginx -tsystemctl status nginx检查 80、443 端口监听:
ss -lntp | grep -E ':80|:443'如果尚未申请证书,443 端口可能还没有监听,这是正常的;申请完成并配置 HTTPS 后再检查即可。
同时需要确认:
  • 阿里云 ECS 安全组允许 TCP 80、443 入站。
  • Ubuntu 防火墙没有阻止相关端口。
  • Nginx 中已经存在匹配域名的 HTTP 虚拟主机。
  • 公网可以访问网站的 HTTP 页面。

6.2 使用 Certbot 的 Nginx 插件申请

本次使用的命令形式为:
certbot --nginx \  -d brainrb.cn \  -d www.brainrb.cn其中:
  • certbot:证书管理工具。
  • --nginx:使用 Nginx 插件验证域名,并尝试自动修改 Nginx 配置。
  • -d brainrb.cn:申请根域名证书。
  • -d www.brainrb.cn:同时将 www 子域名加入证书。

两个域名都必须满足验证要求,否则整个证书申请可能失败。
6.3 邮箱输入报错

申请过程中出现邮箱输入问题,终端提示:
Enter email address or hit Enter to skip.(Enter 'c' to cancel):Invalid email address输入邮箱时反复出现:
There is a problem with your email address.邮箱本身符合常见的邮箱地址格式,但交互式输入仍然没有通过验证。
一种更容易检查的方式是通过参数显式指定邮箱:
certbot --nginx \  -d brainrb.cn \  -d www.brainrb.cn \  --email your-email@example.com \  --agree-tos将示例邮箱替换为自己的真实邮箱。
注意:如果当前仍处于交互式输入界面,应先根据提示退出,再重新执行完整命令。不要把取消命令 c 当作邮箱地址输入。
6.4 证书申请注意事项

申请前必须确认域名拼写正确。之前排查 DNS 时,曾因域名写错导致查询结果为 NXDOMAIN。
另外,使用 --nginx 不意味着所有环境都可以自动配置成功。如果 Nginx 配置复杂、已有多个虚拟主机或存在其他证书配置,需要在申请前做好备份,并在申请后检查配置变化。



七、验证 Nginx HTTPS 配置

证书申请成功后,检查 Nginx 配置:
nginx -t正常情况下应看到:
syntax is oktest is successful重新加载 Nginx:
systemctl reload nginx查看监听端口:
ss -lntp | grep -E ':80|:443'查看证书列表:
certbot certificatesCertbot 通常会在以下目录存储证书:
/etc/letsencrypt/live/brainrb.cn/常见文件:
文件用途
fullchain.pem服务器证书及证书链
privkey.pem私钥文件
cert.pem服务器证书
chain.pem中间证书链
证书目录名称可能取决于 Certbot 为证书生成的实际名称,应以 certbot certificates 的输出为准。
如果使用 certbot --nginx 自动配置,通常不需要手动将证书路径再写入 Nginx;应先检查 Certbot 已经修改的虚拟主机配置,避免重复添加冲突配置。



八、验证 HTTPS 是否正常

8.1 浏览器验证

分别访问:
https://brainrb.cnhttps://www.brainrb.cn检查:
  • 浏览器是否能够正常打开网站。
  • 是否出现证书错误。
  • 证书中的域名是否与访问的域名一致。
  • Discuz 首页、登录页和主要功能是否正常。
  • 页面中的 CSS、JavaScript、图片等资源是否正常加载。

如果浏览器显示混合内容警告,应检查 Discuz 配置和页面中是否仍然引用 http:// 资源。
8.2 使用 curl 验证

在服务器或其他具备 curl 的主机上执行:
curl -I https://brainrb.cncurl -I https://www.brainrb.cn检查返回的 HTTP 状态码及响应头。
如果想验证 HTTP 是否跳转 HTTPS:
curl -I http://brainrb.cn若已经配置跳转,通常可以看到 301 或 308 等重定向响应,并通过 Location 响应头查看目标地址。
也可以使用:
curl -IL http://brainrb.cn查看完整的重定向链。
8.3 使用 OpenSSL 查看证书

openssl s_client \  -connect brainrb.cn:443 \  -servername brainrb.cn重点查看证书链和验证结果。
如果显示:
Verify return code: 0 (ok)说明 OpenSSL 对该连接的证书链验证通过。



九、配置并验证证书自动续期

Let's Encrypt 证书不是永久有效的,因此必须确保续期流程正常。
9.1 查看 Certbot 证书

certbot certificates检查证书名称、域名和有效期。
9.2 查看自动续期定时器

如果使用 Snap 安装 Certbot,可以检查:
systemctl status snap.certbot.renew.timer如果该定时器不存在,也不代表续期一定失效;应进一步查看当前安装方式配置的定时任务:
systemctl list-timers --all | grep -i certbot也可以查看:
systemctl list-unit-files | grep -i certbot9.3 测试续期流程

执行:
certbot renew --dry-run该命令用于模拟续期流程,不会替换当前正式证书。
如果测试成功,说明 Certbot 的续期验证流程基本正常。
注意:续期依赖域名解析、验证方式、服务器端口和证书配置等条件。即使本次申请成功,也应确保后续续期时相关条件仍然满足。



十、常见故障与排查方法

故障现象优先排查方向关键命令
公共 DNS 返回 NXDOMAIN域名拼写、注册状态、NS 委派、记录是否存在dig +trace domain NS
DNS 返回错误 IPA 记录、缓存、当前公网 IPdig domain A
Certbot 找不到 Nginx 配置server_name、Nginx 虚拟主机nginx -T
Certbot 域名验证失败DNS、80 端口、安全组、HTTP 可达性dig、curl -I
邮箱输入验证失败交互式输入、邮箱格式、命令参数使用 --email
Nginx 无法加载配置语法错误、证书路径、重复配置nginx -t
HTTPS 访问失败443 端口、证书、虚拟主机ss -lntp、openssl s_client
证书续期失败定时器、DNS、验证方式、端口certbot renew --dry-run



十一、HTTPS 安全加固的后续建议

HTTPS 证书申请成功,只代表网站具备 TLS 加密访问能力。对于 Discuz 论坛,还应继续做好以下工作:
  • 保持系统和软件更新:定期更新 Ubuntu、Nginx、PHP 和 Discuz。
  • 限制管理入口:管理后台尽量限制访问来源,并使用强密码及多因素认证(如支持)。
  • 保护证书私钥:不要将 privkey.pem 上传到公开代码仓库或博客。
  • 检查 HTTP 跳转:确认所有正式访问入口都统一使用 HTTPS。
  • 排查混合内容:确保页面资源和接口没有继续使用不安全的 HTTP 链接。
  • 定期检查续期:执行续期模拟测试,并为续期失败建立告警。
  • 谨慎启用 HSTS:先确认 HTTPS、子域名和所有必要服务均正常,再考虑启用 HSTS,避免错误配置导致访问问题。

十二、总结

这次 HTTPS 安全加固的主要经验有三点:
第一,DNS 是网站对外提供 HTTPS 服务的基础。 在申请证书之前,应确认域名拼写、解析记录、服务器公网 IP 和权威 DNS 委派都没有问题。
第二,先检查基础环境,再处理应用层问题。 域名无法解析时,不应直接修改 Discuz 数据库或重装 Nginx;应该先确定问题属于 DNS、网络、Web 服务还是应用程序。
第三,申请证书不是工作的终点。 还需要检查 Nginx 配置、浏览器证书状态、HTTP 到 HTTPS 的跳转以及证书自动续期,才能形成完整的 HTTPS 运维闭环。
通过这次实践,完成了从 DNS 故障排查到 Let's Encrypt 证书申请的完整流程,也积累了 Ubuntu、Nginx 和 Certbot 的常用运维命令。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Discuz! X

GMT+8, 2026-10-17 14:23 , Processed in 0.011996 second(s), 19 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表