在4G EPS漫游架构中,运营商间信令保护依赖SEG(Security Gateway),基于TS 33.210定义的IPsec隧道实现网络域安全。这种传输层安全模型存在根本性缺陷:IPX中间节点(Hubbing Provider)必须以明文方式处理DIAMETER信令,无法防范中间人攻击。当运营商通过IPX提供商进行Hubbing漫游时,所有敏感数据(IMSI、认证向量、位置信息)对IPX节点完全透明。
5GC采用SBI(Service Based Interface)架构,所有NF间通信基于HTTP/2 + JSON,传统的传输层隧道已无法满足应用层细粒度安全需求。3GPP TS 33.501 Section 9引入SEPP(Security Edge Protection Proxy)作为跨PLMN边界的非透明安全代理,在TS 33.500中详细定义其安全机制。SEPP的核心创新在于消息级安全(Message-Level Security)——对HTTP/2 JSON信令消息中的敏感数据字段逐个加密,同时保留路由所需的HTTP头部和JSON外层结构,使IPX中间节点仍能正确转发消息但无法窥探内容。
graph TD
subgraph VPLMN["拜访PLMN (VPLMN)"]
VNF[NF: AMF/SMF/AUSF]
VSEPP[cSEPP<br/>SEPP]
end
subgraph IPX["IPX网络"]
IPX1[IPX Provider A]
IPX2[IPX Provider B]
end
subgraph HPLMN["归属PLMN (HPLMN)"]
HSEPP[pSEPP<br/>SEPP]
HNF[NF: UDM/AUSF/UDR]
end
VNF -->|N32f 明文SBI| VSEPP
VSEPP -->|N32-c 握手<br/>TLS + 证书认证| IPX1
IPX1 --> IPX2
IPX2 -->|N32-c 握手| HSEPP
HSEPP -->|解密后明文SBI| HNF
style VSEPP fill:#e74c3c,color:#fff
style HSEPP fill:#e74c3c,color:#fff
style IPX1 fill:#f39c12,color:#fff
style IPX2 fill:#f39c12,color:#fff
SEPP是5GC中唯一一个既不属于VPLMN也不属于HPLMN内部而是横跨两个PLMN边界的网元。每个PLMN部署自己的SEPP实例,负责:
TS 29.573 Section 4.2定义了N32的两个子接口:
| 接口 | 全称 | 功能 | 协议栈 | TS章节 |
|---|---|---|---|---|
| N32-c | N32 Connection | 安全上下文建立、能力协商、密钥交换 | HTTP/2 + TLS 1.3 | TS 29.573 §4.2.2 |
| N32-f | N32 Forwarding | 受保护信令消息转发 | HTTP/2 + JWE/JWS | TS 29.573 §4.2.3 |
N32-c在两个SEPP之间建立TLS长连接,在此之上完成安全能力协商和密钥材料交换。N32-f则使用从N32-c协商阶段派生的密钥对实际SBI消息进行应用层保护。
根据TS 33.500 Section 6.1的定义:
这个角色划分是每消息级别的——同一个SEPP在不同消息流中可能扮演不同角色。
N32-c握手是SEPP间安全协作的基石,TS 33.500 Section 6.2和TS 29.573 Section 5.1定义了完整的两步握手流程。
sequenceDiagram
participant cSEPP as cSEPP<br/>(VPLMN)
participant IPX as IPX中间节点
participant pSEPP as pSEPP<br/>(HPLMN)
Note over cSEPP,pSEPP: Phase 1: TLS连接建立
cSEPP->>IPX: TLS ClientHello
IPX->>pSEPP: TLS ClientHello (转发)
pSEPP->>IPX: TLS ServerHello + Certificate
IPX->>cSEPP: TLS ServerHello + Certificate (转发)
cSEPP->>IPX: TLS Certificate + Finished
IPX->>pSEPP: TLS Certificate + Finished (转发)
pSEPP->>IPX: TLS Finished
IPX->>cSEPP: TLS Finished (转发)
Note over cSEPP,pSEPP: TLS隧道建立完成
Note over cSEPP,pSEPP: Phase 2: N32-c能力协商
cSEPP->>pSEPP: POST /n32c-handshake/exchange-capability<br/>SecurityCapability negotiate
pSEPP->>cSEPP: 200 OK + SecCapabilityResult<br/>接受/拒绝/修改
alt 协商成功
Note over cSEPP,pSEPP: 安全上下文建立完成<br/>派生N32f保护密钥
else 协商失败
pSEPP->>cSEPP: 200 OK + SecCapabilityResult(rejected)
Note over cSEPP,pSEPP: 无法建立N32f会话
end
N32-c建立在TLS 1.3之上(TS 33.210 Section 6.2定义证书Profile)。双向认证流程关键IE:
| IE名称 | 方向 | 说明 |
|---|---|---|
| TLS Certificate | 双向 | X.509 v3证书,包含PLMN ID扩展字段 |
| ServerNameIndication (SNI) | cSEPP→pSEPP | 携带目标SEPP的FQDN |
| Certificate Verify | 双向 | 证明持有私钥 |
PLMN-ID验证:pSEPP必须验证对端证书中的PLMN-ID与N32-c消息中的PLMN-ID一致(TS 33.517 Section 5.2.3)。这是防止证书冒用攻击的关键检查。
TLS隧道建立后,cSEPP发起SecurityCapability协商:
请求消息:POST /n32c-handshake/v1/exchange-capability
{
"securityCapability": {
"protectionPolicyIds": ["N32FullProtectionProfile", "N32ClearTextProtectionProfile"],
"supportedSecInfo": ["IECIES", "AES_GCM"],
"plmnId": {
"mcc": "460",
"mnc": "00"
},
"targetPlmnId": {
"mcc": "001",
"mnc": "01"
},
"n32fPurpose": ["roaming", "interconnect"]
},
"retransmitIndicator": false
}
关键IE解析:
| IE | 类型 | 说明 |
|---|---|---|
protectionPolicyIds |
array | 支持的保护策略列表。N32FullProtectionProfile=加密+完整性,N32ClearTextProtectionProfile=明文+完整性 |
supportedSecInfo |
array | 支持的加密算法。IECIES=椭圆曲线集成加密方案,AES_GCM=对称加密 |
plmnId |
object | 本端PLMN标识,必须与TLS证书一致 |
targetPlmnId |
object | 目标PLMN标识 |
n32fPurpose |
array | N32f用途标识 |
pSEPP收到请求后执行以下决策逻辑:
响应消息:200 OK
{
"securityCapabilityResult": {
"selectedProtectionPolicyId": "N32FullProtectionProfile",
"supportedSecInfo": ["IECIES", "AES_GCM"],
"plmnId": {
"mcc": "001",
"mnc": "01"
},
"negotiationResult": "successful"
}
}
stateDiagram-v2
[*] --> Idle: SEPP启动
Idle --> TLSEstablishing: 发起/接收TLS连接
TLSEstablishing --> TLSActive: TLS握手成功
TLSEstablishing --> Idle: TLS握手失败
TLSActive --> Negotiating: 发送exchange-capability
Negotiating --> Active: 协商成功<br/>密钥派生完成
Negotiating --> TLSActive: 协商被拒绝<br/>可重试
Active --> Active: N32f消息处理
Active --> Renegotiating: 密钥更新触发
Renegotiating --> Active: 重协商成功
Active --> Idle: 连接断开/超时
TS 33.500 Section 6.3定义了两种N32f保护策略:
| 维度 | N32 Full Protection | N32 Clear-Text Protection |
|---|---|---|
| 策略ID | N32FullProtectionProfile | N32ClearTextProtectionProfile |
| 加密 | 是(JWE) | 否 |
| 完整性 | 是(JWS) | 是(JWS) |
| 消息体可见性 | 完全加密 | 明文可读 |
| IPX可见性 | 不可读内容 | 可读内容 |
| 适用场景 | 高安全级别漫游直连 | IPX需解析路由的Hubbing场景 |
| TS定义 | TS 33.500 §6.3.1 | TS 33.500 §6.3.2 |
| 性能开销 | 较高(加解密) | 较低(仅签名验证) |
这是最安全也是最常见的模式。完整处理流程如下:
sequenceDiagram
participant NF_c as 源NF<br/>(VPLMN AMF)
participant cSEPP as cSEPP
participant IPX as IPX节点
participant pSEPP as pSEPP
participant NF_p as 目标NF<br/>(HPLMN UDM)
NF_c->>cSEPP: HTTP/2 POST<br/>/nudm-sdm/v1/{supi}/am-data<br/>{明文JSON: SUPI, S-NSSAI...}
Note over cSEPP: 1. 识别敏感数据类型<br/>2. SUPI → IECIES加密<br/>3. 整体JSON → JWE封装
cSEPP->>IPX: HTTP/2 POST (N32f)<br/>/n32f/v1/relay<br/>JWE Protected Payload
Note over IPX: IPX只能看到HTTP头<br/>和JSON外层路由字段<br/>无法解密消息体
IPX->>pSEPP: 转发N32f消息
Note over pSEPP: 1. JWE解密<br/>2. IECIES解密敏感字段<br/>3. 恢复原始明文JSON
pSEPP->>NF_p: HTTP/2 POST<br/>/nudm-sdm/v1/{supi}/am-data<br/>{明文JSON}
NF_p->>pSEPP: 200 OK + 订阅数据
pSEPP->>cSEPP: 200 OK (N32f保护)
cSEPP->>NF_c: 200 OK + 订阅数据(明文)
TS 33.500 Section 6.3.1.3定义了逐数据类型加密机制。SEPP维护一个敏感数据类型列表,对匹配的JSON字段执行IECIES加密:
| 数据类型 | JSON字段 | 加密方式 | 原因 |
|---|---|---|---|
| SUPI | supi |
IECIES | 用户永久标识,最高敏感度 |
| GPSI | gpsi |
IECIES | 通用公共订阅标识符 |
| Authentication Vector | authType, rand, autn, xresStar |
IECIES | 认证五元组 |
| UDM Subscription Data | nssai, subscribedUeAmbr |
IECIES | 订阅策略数据 |
| Location Info | tai, ecn |
IECIES | 位置隐私 |
| SUCI | suci |
IECIES | 已加密标识(双层保护) |
| PEI | pei |
IECIES | 设备永久标识 |
IECIES加密过程(TS 33.500 Annex E):
1. 生成临时ECC密钥对 (ephemeral public key, ephemeral private key)
2. ECDH共享密钥 = ephemeral_private_key × pSEPP_public_key
3. KDF(共享密钥) → DEK (Data Encryption Key) + MAC Key
4. Ciphertext = AES-GCM-Encrypt(DEK, plaintext_field_value)
5. 输出: {ephemeral_public_key || Ciphertext || MAC_Tag}
N32f消息体经过JWE JSON Serialization封装后的结构:
{
"protected": "eyJhbGciOiJFQ0RILUVTK0EyNTZLVyIsImVuYyI6IkEyNTZHQ00iLCJlcGsiOiJ...base64url...",
"unprotected": {
"kid": "sepp-hplmn-key-2026-001",
"iat": 1748304000
},
"recipients": [
{
"encrypted_key": "base64url_encoded_wrapped_CEK"
}
],
"iv": "base64url_encoded_initialization_vector",
"ciphertext": "base64url_encrypted_payload_containing_IECIES_encrypted_fields",
"tag": "base64url_authentication_tag"
}
| JWE字段 | 说明 |
|---|---|
protected |
Base64URL编码的保护头,含加密算法标识 |
encrypted_key |
用pSEPP公钥包装的Content Encryption Key |
iv |
AES-GCM初始化向量 |
ciphertext |
已加密的完整JSON负载(内含IECIES加密的敏感字段) |
tag |
AES-GCM认证标签 |
当选择明文完整性保护策略时,SEPP使用JWS而非JWE:
{
"payload": "base64url_original_json_payload_in_cleartext",
"protected": "eyJhbGciOiJFUzI1NiJ9",
"signature": "base64url_ECDSA_signature"
}
此模式下IPX节点可以解析消息体内容(用于基于内容的路由),但无法篡改(JWS签名保护)。适用场景包括:
5G漫游有两种部署拓扑,安全模型截然不同:
graph TB
subgraph Direct["直连模式 (Direct)"]
cSEPP1[cSEPP] -->|单一N32-c + N32-f| pSEPP1[pSEPP]
end
subgraph Hubbing["Hubbing模式"]
cSEPP2[cSEPP] -->|N32-c/TLS| IPXA[IPX-A SEPP Proxy]
IPXA -->|TLS hop-by-hop| IPXB[IPX-B SEPP Proxy]
IPXB -->|N32-c/TLS| pSEPP2[pSEPP]
cSEPP2 -.->|端到端N32f保护| pSEPP2
end
style cSEPP1 fill:#3498db,color:#fff
style pSEPP1 fill:#e74c3c,color:#fff
style cSEPP2 fill:#3498db,color:#fff
style pSEPP2 fill:#e74c3c,color:#fff
style IPXA fill:#f39c12,color:#fff
style IPXB fill:#f39c12,color:#fff
在Hubbing场景中(TS 33.500 Section 7),IPX中间节点作为TLS代理参与逐跳连接:
| 安全维度 | 直连模式 | Hubbing模式 |
|---|---|---|
| TLS连接数 | 1(端到端) | N(逐跳,N=中间节点数+1) |
| 证书验证 | 端到端验证 | 仅相邻跳验证 |
| N32f保护 | 端到端JWE/JWS | 端到端JWE/JWS(不变) |
| IPX可信度 | 不涉及 | 必须信任IPX提供商 |
| 密钥暴露风险 | 无 | IPX可获取TLS层密钥但无法获取JWE层密钥 |
关键设计:即使在Hubbing场景,N32f的应用层保护(JWE/JWS)始终是端到端的——从cSEPP到pSEPP,中间IPX节点无法解密JWE保护的消息体。这是SEPP相比4G SEG的根本安全优势:传输层安全可以逐跳终止,但应用层安全始终保持端到端。
在Hubbing场景中,cSEPP首先与IPX-A建立TLS连接(而非直接到pSEPP):
TLS ClientHello → IPX-A (SNI: ipx-a.example.com)
IPX-A扮演TLS终结点,解密消息后以新TLS连接转发到下一跳
每跳都需要独立的证书验证和N32-c能力协商
IPX节点作为TLS中间人,但无法突破JWE层的端到端加密。这种双层安全模型是3GPP SA3工作组刻意设计的纵深防御策略。
SEPP的密钥派生遵循TS 33.500 Section 6.4定义的层次结构:
graph TD
TLS_TLS["TLS Master Secret<br/>(TLS 1.3握手产出)"]
TLS_TLS --> N32_SK["N32 Security Context Key<br/>KDF(TLS Master Secret, 'N32-SC')"]
N32_SK --> CEK["Content Encryption Key (CEK)<br/>用于JWE消息加密<br/>KDF(N32_SK, 'CEK')"]
N32_SK --> CIK["Content Integrity Key (CIK)<br/>用于JWS签名<br/>KDF(N32_SK, 'CIK')"]
N32_SK --> DEK["Data Encryption Key (DEK)<br/>用于IECIES字段加密<br/>KDF(N32_SK, 'DEK')"]
CEK --> JWE_MSG["JWE加密的N32f消息体"]
CIK --> JWS_SIG["JWS签名/验证"]
DEK --> IECIES_ENC["敏感数据类型字段加密<br/>SUPI/GPSI/AV等"]
style TLS_TLS fill:#2c3e50,color:#fff
style N32_SK fill:#e74c3c,color:#fff
style CEK fill:#3498db,color:#fff
style CIK fill:#3498db,color:#fff
style DEK fill:#3498db,color:#fff
| 参数 | 值 | 说明 |
|---|---|---|
| CEK长度 | 256 bits | AES-256-GCM |
| CIK长度 | 256 bits | HMAC-SHA-256或ECDSA |
| DEK长度 | 256 bits | IECIES内部使用 |
| 密钥更新周期 | 可配置(通常24-72小时) | TS 33.500 §6.4.3 |
| 密钥更新触发 | 时间到期或消息计数阈值 | 防止密钥疲劳攻击 |
密钥更新通过重新执行N32-c协商实现(状态机中的Renegotiating状态)。新旧密钥过渡期间,SEPP使用密钥标识符(kid)区分不同版本的密钥。
| 协议层 | 特征 | Wireshark过滤器 |
|---|---|---|
| TCP | 目标端口443(HTTPS)或指定N32端口 | tcp.port == 443 |
| TLS | SNI包含sepp相关FQDN | tls.handshake.extensions_server_name contains "sepp" |
| HTTP/2 | POST路径包含/n32c-handshake/ | http2.headers.path contains "n32c" |
| HTTP/2 | POST路径包含/n32f/ | http2.headers.path contains "n32f" |
| JSON | 包含"securityCapability"或"securityCapabilityResult" | N/A(TLS加密后不可见) |
场景1:N32-c握手失败
故障现象:cSEPP日志显示 "N32-c negotiation rejected"
排查步骤:
1. 检查TLS证书是否过期:openssl x509 -in sepp_cert.pem -noout -dates
2. 验证PLMN-ID匹配:证书MCC/MNC vs 消息中的plmnId
3. 检查保护策略交集:两端是否至少有一个共同支持的保护策略
4. 确认CA信任链:pSEPP是否信任签发cSEPP证书的CA
场景2:N32f消息解密失败
故障现象:pSEPP返回 HTTP 401 + "Decryption failed"
排查步骤:
1. 检查密钥标识符(kid):是否使用了已过期的密钥
2. 验证时间同步:两端SEPP时钟偏差应 < 30秒
3. 检查IECIES公钥:pSEPP的公钥是否正确配置在cSEPP侧
4. 抓包对比:消息体是否在传输中被截断或修改
场景3:Hubbing场景消息丢失
故障现象:N32f消息发送后无响应
排查步骤:
1. 检查逐跳TLS状态:每段连接是否都保持Active
2. IPX路由策略:消息中的目标PLMN-ID是否在IPX路由表中
3. MTU问题:JWE封装后消息体增大可能导致分片失败
4. 超时配置:HTTP/2连接超时 vs 信令响应超时不匹配
| 对比维度 | 4G SEG (TS 33.210) | 5G SEPP (TS 33.500) |
|---|---|---|
| 保护层级 | 传输层(IPsec隧道) | 应用层(消息级JWE/JWS) |
| 保护粒度 | 整条隧道所有流量 | 逐消息、逐字段 |
| IPX可见性 | 完全可见(明文DIAMETER) | 仅HTTP头可见,消息体加密 |
| 认证方式 | IKEv2预共享密钥/证书 | X.509证书 + TLS 1.3 |
| 拓扑隐藏 | 无 | 有(URI重写) |
| 中间节点信任 | 必须完全信任IPX | 仅需信任TLS层,JWE层端到端 |
| 密钥管理 | IKE SA手动/自动更新 | N32-c自动协商 + 定时更新 |
| 灵活性 | 低(隧道粒度) | 高(策略可按消息类型配置) |
| 协议栈 | IPsec ESP/AH | HTTP/2 + TLS + JWE/JWS |
Release 18对SEPP机制进行了多项增强:
3GPP SA3工作组在Rel-19中正在讨论的SEPP增强:
Q1: N32-c和N32-f是否可以使用不同的TLS连接? A: 是的。N32-c建立独立的TLS连接用于安全能力协商。N32-f使用自己的HTTP/2长连接,两者在逻辑上分离。N32-f连接使用从N32-c协商阶段派生的密钥进行应用层保护,而非依赖传输层TLS加密(虽然TLS仍然存在)。
Q2: Hubbing场景中IPX提供商能看到哪些信息? A: 在N32 Full Protection模式下,IPX只能看到HTTP/2头部(如目标URI路径、Host头)和JWE封装后的密文。在N32 Clear-Text Protection模式下,IPX可以看到完整的JSON消息体但无法修改(JWS签名保护)。3GPP推荐漫游场景使用Full Protection模式。
Q3: SEPP如何处理非预期的消息(如来自未知PLMN的请求)? A: SEPP在TLS层就拒绝未授权的连接——如果对端证书中的PLMN-ID不在本SEPP的漫游协议列表中,TLS握手将被拒绝。即使TLS连接建立,N32-c能力协商阶段也会因PLMN-ID不匹配而失败。这是一种纵深防御策略。
Q4: 5G SEPP能否与4G SEG共存? A: 可以。在EPS-5GS互操作场景中(TS 23.501 Annex D),N26接口跨PLMN通信仍通过SEG保护,而纯5G漫游信令通过SEPP保护。运营商在向5G SA漫游迁移过程中通常经历"SEG+SEPP共存"的过渡期。
Q5: SEPP如何影响漫游信令延迟? A: SEPP引入的额外延迟主要包括:(1)消息级加解密处理时间(约1-3ms/消息);(2)JWE封装/解封装开销(约0.5-1ms)。总体额外延迟通常在5ms以内,相对于跨PLMN的传输延迟(通常50-200ms)影响可忽略。但密钥更新期间可能出现短暂的额外延迟。
本文由「51学通信」技术团队出品。51学通信由通信行业18年老兵爱卫生(微信ID: gprshome201101)维护,聚焦5G/6G核心网、3GPP标准解读、通信前沿技术深度分析。 出版作品有《5G核心网原理与实践》《IMS原理与实践》等4本通信专业书籍。知识星球「51学通信」提供深度技术答疑和行业洞察。
[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。
