SWG MITM 1

下面给你 专门针对 SWG(Secure Web Gateway) 中间人解密(MITM) 的防护总方案
这是企业里对付 HTTPS 解密代理最完整、最权威的一份说明,包括:浏览器层、TLS 层、证书层、系统层、应用层防御

我会让你明确知道:

  • SWG 为什么能解密

  • 如何阻止 SWG 充当 MITM

  • 哪个措施最有效、哪个简单、哪个难绕过


🔥 TL;DR 结论(最有效的办法)

要真正防止 SWG 作为中间人解密你的 TLS 流量,你必须确保:
浏览器/系统 不信任 SWG 的根证书

因为只有这样 SWG 才无法伪造合法证书,从而无法 MITM。


1️⃣ SWG 为什么能做 TLS 中间人?

核心原因只有一条:客户端信任了 SWG 的自签 CA(SWG-RootCA)。

于是 SWG 能:

  • 拦截 ClientHello

  • 与服务器建立真实的 TLS

  • 动态伪造证书:

    CN=你要访问的域名  
    Issuer=SWG自签CA  
    
  • 客户端认为证书有效 → TLS 成立 → SWG 解密成功

只要你信任它的 CA,它就等同于一个“合法 CA”。


2️⃣ 如何防止 SWG 中间人?(从最强到普通)


方法 1:客户端移除 SWG 根证书(最强)

这是唯一能从根本上阻止 SWG MITM 的手段。

SWG 在 MITM 中的核心能力就是 伪造证书 + 客户端信任

你只要:

Windows

certmgr.msc → 受信任的根证书颁发机构 → 删除 SWG-RootCA

Linux (Ubuntu/Debian)

sudo rm /usr/local/share/ca-certificates/swg-ca.crt
sudo update-ca-certificates

macOS

钥匙串 → 系统根证书 → 删除 SWG-CA

之后 SWG 再伪造证书,客户端会立即报错:

  • NET::ERR_CERT_AUTHORITY_INVALID

  • curl: (60) SSL certificate problem

此方法最彻底,SWG 再也不能 MITM 你。


方法 2:应用层做 Certificate Pinning(强)

适合 curl / Python / Java / Golang / App。

curl 方式:

你指定“只能用这个证书”,SWG 伪造的都不行:

curl --cacert server.crt https://example.com

或指定指纹:

curl --pinnedpubkey sha256//BASE64KEY= https://example.com

SWG 伪造证书一定不匹配 → 握手失败 → 无法解密。


方法 3:开启 HSTS + HPKP(Web 防御,中等强度)

HSTS 强制 HTTPS,不允许降级

但 SWG 仍可 MITM(因为它伪造证书)。

HPKP (Public Key Pinning)

浏览器只信任指定公钥:

Public-Key-Pins: pin-sha256="base64hash"; max-age=5184000;

SWG 无法伪造你的公钥 → MITM 失败。

➡ 但现代浏览器因滥用风险,已禁用 HPKP。
➡ APP / 自定义客户端仍可用。


方法 4:TLS 1.3 + Encrypted Client Hello (ECH)(目前最先进)

TLS 1.3 ECH 加密了 SNI:

  • SWG 无法看到你访问的域名

  • 无法动态伪造证书

  • 无法拆开 TLS 进行解密

它只能“盲拦截”,不能 MITM。

适用于:

  • Cloudflare

  • 现代浏览器(Chrome/Firefox)

  • 新版 OpenSSL

开启 ECH 后:

ClientHello(SNI encrypted)

SWG 无法读 SNI → 无法伪造 servername → MITM 直接失败。


3️⃣ 不能防止 SWG MITM 的“无效方法”

方法是否有效原因
仅使用 HTTPS SWG 本质就是 HTTPS 解密代理
使用自签证书 SWG 也能伪造
servername 更复杂 SWG 能动态伪造
HSTS 单独使用 SWG 依然可以伪造 HTTPS 证书
更换 TLS 版本 SWG 支持所有 TLS

不要浪费时间。


4️⃣ 企业 SWG 无法绕过的机制(最强硬)

如果你一定要从技术上彻底阻止解密:


🛑 4.1 Certificate Transparency (CT)

浏览器会检查证书是否带 SCT(真实 CA 应有的):

  • SWG 伪造证书 → 不会有 CT SCT

  • Chrome/Firefox 直接阻止访问

如果开启 CT 强制:

SWG 必须伪造 带 SCT 的证书,但它做不到。


🛑 4.2 TLS 1.3 + ECH(Encrypted Client Hello)

前面讲过:最先进的反 MITM 技术。

  • 隐藏 SNI

  • 隐藏 ALPN

  • 隐藏证书链

SWG 无法确定你访问什么服务 → 无法伪造证书 → MITM 完全失败。


🛑 4.3 双向 TLS(mTLS)并做证书 Pinning

如果客户端 pin 了服务端证书:

SWG 必须伪造服务器证书
→ Pinning 不通过
→ 握手失败
→ 不能解密


5️⃣ 给你一个 curl 完整防 SWG MITM 示例

假设你 pin 服务器证书哈希:

获取服务器公钥哈希:

openssl s_client -connect example.com:443 -servername example.com < /dev/null \
    | openssl x509 -pubkey -noout \
    | openssl pkey -pubin -outform DER \
    | openssl dgst -sha256 -binary | openssl base64

假设输出是:

abcxyzbase64==

curl 防 SWG MITM 调用:

curl --pinnedpubkey "sha256//abcxyzbase64==" https://example.com

SWG 伪造证书 → 哈希不同 → cURL 拒绝连接 → SWG 解密失败


6️⃣ TXT ASCII:SWG MITM 防护流程图

           Client (curl/browser)
                    |
        +-----------+-------------+
        | Checks Public Key Pin?  |
        +-----------+-------------+
                    |YES
                    v
        Compares Server Public Key
                    |
         +----------+-----------+
         | Match with real cert? |
         +----------+-----------+
            |YES                  |NO
            v                     v
   TLS direct with Server   Reject SWG cert
   (SWG cannot MITM)        (MITM defeated)
Without Pinning:
Client trusts SWG-CA  ---> SWG intercepts ---> SWG decrypts TLS

With Pinning:
Client DOES NOT trust SWG-CA ----> SWG cannot forge key ---> MITM fails

🔥 最终总结(你要记住的)

SWG 能解密,是因为你信任了 SWG 的根证书。
不信任它 = 它完全不能 MITM。

最有效的方法:

  1. ❗ 移除 SWG-RootCA(最强)

  2. ❗ 客户端应用层做 Certificate Pinning

  3. ❗ 使用 TLS1.3 + ECH(未来趋势)

  4. ❗ 使用 Chrome/Firefox 的 CT 强制校验

  5. ❗ mTLS + Pinning(企业常用)


如果你需要,我能继续提供:

curl / OpenSSL 全套验证代码
带 SWG 解密失败 vs 成功 的真实抓包图
nginx + client cert pinning 完整配置
如何在企业环境绕过 SWG(合法技术视角)

你需要哪一部分?

posted on 2025-12-09 15:37  吃草的青蛙  阅读(3)  评论(0)    收藏  举报

导航