🔥 一句话解释 SNI

SNI 是 TLS 握手时,客户端提前告诉服务器:"我想访问的是哪一个域名"。

它的作用是让服务器在 TLS 握手阶段就能知道要给哪个域名的证书


🎯 为什么需要 SNI?

因为现在很多网站是 多域名共享同一个 IP

例如:

diff 复制代码
1.2.3.4 上托管了:
- api.a.com
- img.a.com
- pay.a.com

如果没有 SNI:

客户端连接 1.2.3.4:443 → TLS 握手开始

服务器此时 不知道你想访问哪个域名的证书

→ 就没法送对证书

→ 导致握手失败

所以 TLS 扩展 "SNI" 就诞生了。


🧠 SNI 在 TLS 握手里到底发生了什么?

TLS 1.2 / 1.3 都一样,基本流程是:

markdown 复制代码
ClientHello:
    - TLS Versions
    - Cipher Suites
    - Extensions:
        - SNI = "api.example.com"   ← 就是这里!
        - ALPN (比如 h2/h3)
        - ...

服务器收到 ClientHello 后,看到 SNI:

复制代码
哦,你访问的是 api.example.com!
那我给你发 api.example.com 的证书

然后握手继续。


🔥 SNI 与 "IP 直连(DNS Mapping)" 有什么关系?

这是你现在最关心的一点:

你做 DNS 优化时会把域名替换成 IP:

arduino 复制代码
https://api.example.com/user
→
https://203.107.1.1/user   (IP直连)

如果你 不加 Host header

服务器会认为:

复制代码
你要访问 203.107.1.1
那我发给你"203.107.1.1"对应的证书(基本不存在)
→ TLS 握手立即失败

所以你必须:

less 复制代码
req.setValue("api.example.com", forHTTPHeaderField: "Host")

⚠️ 更重要的是:
"Host" header 会被 URLSession 自动用作 SNI 的域名

所以 TLS 握手会变成:

ini 复制代码
SNI = "api.example.com"

→ 即使你是连的 IP,TLS 仍然能拿到对应的域名证书

→ 握手成功

这就是 IP 直连 + HTTPS 能工作的原因。


🎯 用一句更工程化的话总结:

SNI 就是 TLS 握手阶段的 Host header。

客户端会在 ClientHello 里把这个域名告诉服务器,让服务器知道发哪一套证书。

相关推荐
熊猫钓鱼>_>11 小时前
Flutter app_settings 鸿蒙适配实战:Intent 体系到 Want 的跨越
flutter·华为·harmonyos·openharmony·intent·want
里欧跑得慢12 小时前
Flutter主题与样式详解
前端·css·flutter·web
程序员老刘14 小时前
现在回头看,Dart取消宏是无比正确的决定
flutter·ai编程·dart
莫道桑榆晚hh14 小时前
Flutter 双端开发实战:一套代码搞定 iOS + Android,从开发到上架全流程
flutter
Zeaon16 小时前
别再手写筛选栏了:一个可组合的 Flutter 选择组件(5 入口 × 7 委托)
android·flutter
事圆则缓17 小时前
Flutter 快速上手
flutter
「、皓子~21 小时前
海狸IM 2.1 私有化部署从零到一:中间件、微服务与 Nginx 全流程
nginx·flutter·微服务·中间件·开源软件·im·海狸im
嘴贱欠吻!1 天前
Flutter 触觉反馈插件 Gaimon三方库鸿蒙端教程
flutter·华为·harmonyos
getapi1 天前
1 在 macOS 电脑上更新 Flutter iOS 应用到 App Store
flutter·macos·ios
恋猫de小郭1 天前
Flutter 状态管理基准测评,一个很有趣的观点
android·前端·flutter