😄 在 CentOS Stream 9 上用 Let’s Encrypt 装 HTTPS:一场和证书、浏览器、自己较劲的故事

7 阅读3分钟

HTTPS 这玩意儿吧, 没装之前你觉得它很神秘, 装完之后你会发现—— 它不神秘,它只是爱给你添戏。 🎭

本文不是官方文档复读机, 而是一篇 “真实踩坑纪实 + 人话翻译版 HTTPS 指南”

适合人群:

  • 会装 Nginx
  • 会写 proxy_pass
  • 但一碰 HTTPS 就开始怀疑人生的人

🧱 一、开局配置(不难,但很关键)

你的起点通常是这样:

  • 系统:CentOS Stream 9 🐧
  • Nginx:已装好,80 能访问
  • 域名:A 记录已指向服务器

这时你心里只有一个朴素愿望:

“我就想要个小绿锁 🔒,别整幺蛾子。”

——放心,幺蛾子马上就来。


🧰 二、Certbot 登场(主角出场必有 BGM)

安装:

sudo dnf install -y epel-release
sudo dnf install -y certbot python3-certbot-nginx

然后一行命令:

sudo certbot --nginx -d yiqiquhuxi.cn

Certbot 会非常热情地帮你做四件事:

1️⃣ 验证你是不是域名主人 2️⃣ 申请证书 3️⃣ 把证书塞进 /etc/letsencrypt/live/ 4️⃣ 顺手改你的 Nginx 配置(重点)

这一步结束时,你会看到一句非常温柔的话:

🎉 Congratulations! You have successfully enabled HTTPS

你以为结束了? 不。 这是故事的 第一幕


😵 三、Certbot:我帮你改了配置,不用谢

你打开 Nginx 配置一看:

咦? 我监听的是 8080, 你怎么把 listen 443 ssl; 写进来了?

别慌,这是 Certbot 的“直男式智能”。

它的逻辑只有一句话:

谁写了 server_name,我就改谁。

不管你是 80、8080、16601, 只要里面有:

server_name yiqiquhuxi.cn;

Certbot 就会冲进去加 HTTPS。

📌 结论:

  • 这不是 Bug
  • 这是“自动化没有审美”

🧠 四、正确姿势:80 是路,443 是门

经验总结一句话:

HTTP 是马路,HTTPS 是安检口。 🚪

✅ 推荐结构

HTTP(80)——别动它

server {
  listen 80;
  server_name yiqiquhuxi.cn;

  location / {
    proxy_pass http://后端;
  }
}

❌ 不要写:

return 301 https://...;

你不想跳,它就不该跳。

HTTPS(443)——单独一个 conf

server {
  listen 443 ssl http2;
  server_name yiqiquhuxi.cn;

  ssl_certificate /etc/letsencrypt/live/yiqiquhuxi.cn/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/yiqiquhuxi.cn/privkey.pem;

  location / {
    proxy_pass http://后端;
  }
}

📌 这一步,结构就赢了一半。


🚑 五、HTTPS 一上,502 立刻出现?

别慌。

502 的真实含义只有一句话:

Nginx:我敲了后端的门,但没人应。 🚪👻

常见原因:

  • proxy_pass 写错
  • 后端没起
  • 内网地址不可达

排查神器:

curl http://后端地址

还有终极裁判:

tail -f /var/log/nginx/error.log

日志从不骗人。


🔥 六、HTTPS 页面里引用 HTTP 资源?浏览器不干

你会遇到一个经典场面:

首页是 https:// 图片却是 http:// 然后——加载失败 ❌

这不是 Nginx 抽风。

这是浏览器拍桌子:

“你都加密了,还想夹带明文?不行!” 🔐

这叫 Mixed Content(混合内容)

真相很残酷:

❌ 你没法让 HTTPS 页面「坚持使用 HTTP 资源」

能活下来的方案只有:

  • 资源也走 HTTPS(推荐)
  • Nginx 反代资源
  • 后端改相对路径

别和浏览器对着干, 它是甲方。


🤯 七、我没写跳转,HTTP 怎么自己变 HTTPS 了?

恭喜你, 你遇到了 HSTS

HSTS 是什么?

一句话:

浏览器记仇。 🧠

只要你曾经告诉过它:

“这个站以后只准用 HTTPS”

它就会:

  • 永久自动升级
  • 不走 nginx
  • 不给你反悔机会

验证方式

  • 用无痕窗口
  • 或清除:
chrome://net-internals/#hsts

删掉域名,再试一次。


🔁 八、证书续期:你可以忘,系统不会

Let’s Encrypt:

  • 有效期 90 天
  • Certbot 已自动续期

你唯一要做的:

sudo certbot renew --dry-run

看到 success, 就可以放心去摸鱼了 ☕


🏁 九、最终总结(人话版)

  • Certbot 很勤快,但不懂你架构
  • HTTPS 不是开关,是协议承诺
  • 浏览器比 nginx 更强势
  • 不要和 Mixed Content、HSTS 硬刚

HTTPS 装到最后, 拼的不是命令, 是 认知对齐

装完证书的人很多, 真正理解它的人不多。

如果你看到这里——

🎉 恭喜,你已经是后者了。