IMS(IP Multimedia Subsystem)的初始注册绝非"发一个REGISTER、回一个200 OK"这么简单。TS 24.229 Section 5.1.1.2规定了基于IMS-AKA(Authentication and Key Agreement)的双轮SIP REGISTER机制:第一轮REGISTER触发网络侧下发鉴权挑战(401 Unauthorized),第二轮REGISTER携带UE计算的鉴权响应完成认证。这种设计的核心意图是双向认证——既验证UE的身份合法性,也让UE验证网络的合法性(防止伪基站攻击)。
与5G接入层的5G-AKA(TS 33.501)不同,IMS-AKA运行在应用层(SIP协议之上),承载于IPSec安全关联(SA)保护下的Gm接口。整个流程涉及SIP信令和Diameter Cx接口两条控制平面的交叉联动,是IMS安全体系的第一道关卡。
| 设计目标 | 实现手段 | 对应规范 |
|---|---|---|
| UE与网络双向认证 | IMS-AKA五元组(RAND/AUTN/RES/IK/CK) | TS 33.203 Section 6.1 |
| 防止重放攻击 | nonce随机数 + CSeq递增 | RFC 3310 Section 3 |
| 后续信令加密保护 | IK/CK推导IPSec SA | TS 33.203 Section 7.1 |
| 用户身份隐私 | IMPI(IP Multimedia Private Identity)不暴露 | TS 23.228 Section 4.3.3 |
下面给出IMS初始注册的完整信令流,涵盖SIP层和Diameter层的所有交互:
sequenceDiagram
participant UE
participant P_CSCF as P-CSCF
participant I_CSCF as I-CSCF
participant HSS
participant S_CSCF as S-CSCF
Note over UE,S_CSCF: 第一轮REGISTER——鉴权挑战下发
UE->>P_CSCF: SIP REGISTER (无Authorization头)<br/>CSeq: 1 REGISTER<br/>Contact: expires=600000
P_CSCF->>P_CSCF: 记录UE IP:Port<br/>建立Path头部
P_CSCF->>I_CSCF: SIP REGISTER (添加Path, P-Visited-Network-ID)
I_CSCF->>HSS: Diameter UAR<br/>User-Name=IMPI<br/>Public-Identity=IMPU<br/>Visited-Network-Identifier
HSS->>I_CSCF: Diameter UAA<br/>Server-Name=S-CSCF地址<br/>或 Capability-Set
Note over I_CSCF: 若UAA未返回S-CSCF地址<br/>则按能力集选择S-CSCF
I_CSCF->>S_CSCF: SIP REGISTER (转发)
S_CSCF->>HSS: Diameter MAR<br/>SIP-Number-Auth-Items=1<br/>SIP-Authentication-Scheme=Digest-AKAv1-MD5
HSS->>S_CSCF: Diameter MAA<br/>SIP-Auth-Data-Item:<br/> RAND || AUTN || XRES || CK || IK
S_CSCF->>S_CSCF: 构造nonce<br/>nonce = Base64(RAND‖AUTN‖<br/>server-specific-data)<br/>存储XRES等待验证
S_CSCF->>I_CSCF: SIP 401 Unauthorized<br/>WWW-Authenticate: Digest<br/> realm, nonce, algorithm=AKAv1-MD5<br/> ik=..., ck=..., qop=auth-int
I_CSCF->>P_CSCF: SIP 401 Unauthorized
P_CSCF->>P_CSCF: 提取IK/CK<br/>准备IPSec SA参数
P_CSCF->>UE: SIP 401 Unauthorized
Note over UE,S_CSCF: UE侧AKA计算
UE->>UE: ISIM/USIM输入RAND→<br/>计算RES, 验证AUTN<br/>推导IK/CK
Note over UE,S_CSCF: 第二轮REGISTER——携带鉴权响应
UE->>P_CSCF: SIP REGISTER (含Authorization)<br/>CSeq: 2 REGISTER<br/>Authorization: Digest<br/> response=H(RES,nonce,...)<br/>algorithm=AKAv1-MD5
P_CSCF->>P_CSCF: 验证IPSec SA<br/>建立安全关联
P_CSCF->>I_CSCF: SIP REGISTER (IPSec保护)
I_CSCF->>HSS: Diameter UAR (第二轮)
HSS->>I_CSCF: Diameter UAA (Server-Name)
I_CSCF->>S_CSCF: SIP REGISTER
S_CSCF->>S_CSCF: 比较response vs H(XRES,...)<br/>验证通过→注册成功
S_CSCF->>HSS: Diameter SAR<br/>Server-Assignment-Type=REGISTRATION
HSS->>S_CSCF: Diameter SAA<br/>User-Profile (iFC, 服务配置)
S_CSCF->>I_CSCF: SIP 200 OK<br/>P-Associated-URI<br/>Service-Route
I_CSCF->>P_CSCF: SIP 200 OK
P_CSCF->>UE: SIP 200 OK
UE发出的初始REGISTER请求,不含任何鉴权信息,但其头部字段蕴含丰富的路由和标识信息:
REGISTER sip:ims.mnc460.mcc3gppnetwork.org SIP/2.0
Via: SIP/2.0/UDP [2001:db8::1]:5060;branch=z9hG4bK1234
From: <sip:[email protected]>;tag=abc123
To: <sip:[email protected]>
Call-ID: cb03a0s09a2sdfglkj490333
CSeq: 1 REGISTER
Contact: <sip:460001234567890@[2001:db8::1]:5060>;+sip.instance="<urn:gsma:imei:35693803-123456-0>";expires=600000
Expires: 600000
Require: sec-agree
Proxy-Require: sec-agree
Security-Client: digest, ipsec-3gpp; alg=hmac-sha-256-128; ealg=aes-cbc; spi-c=234567; spi-s=345678; port-c=5062; port-s=5064
Content-Length: 0
关键IE解读:
| IE名称 | 含义 | 规范引用 |
|---|---|---|
Request-URI |
注册域标识(registrar domain),通常为ims.mnc<MNC>.mcc<MCC>.3gppnetwork.org |
TS 23.003 Section 13.7 |
From/To |
均为IMPU(Public User Identity),初始注册时两者相同 | TS 24.229 Section 5.1.1.2.1 |
Contact |
UE的绑定地址 + +sip.instance(GRUU的实例ID) |
RFC 5627 |
Security-Client |
UE支持的IPSec安全参数(算法、SPI、端口号) | TS 33.203 Section 7.1 |
Require: sec-agree |
强制要求安全协商 | TS 33.203 Annex T |
I-CSCF收到REGISTER后,首先通过Diameter Cx接口查询HSS(TS 29.229 Section 6.1):
UAR(User-Authorization-Request)关键AVP:
| AVP名称 | 含义 | 取值示例 |
|---|---|---|
User-Name |
IMPI(Private Identity) | [email protected] |
Public-Identity |
IMPU | sip:[email protected] |
Visited-Network-Identifier |
拜访网络标识 | ims.mnc460.mcc3gppnetwork.org |
UAR-Flags |
注册/去注册指示 | REGISTRATION=1 |
UAA(User-Authorization-Answer)可能返回两种结果: - Server-Name:已有分配的S-CSCF地址(重注册场景) - Server-Capabilities:S-CSCF能力集(初始注册,需I-CSCF选择)
S-CSCF收到无鉴权信息的REGISTER后,向HSS请求认证向量(Authentication Vector, AV):
MAR关键AVP:
| AVP名称 | 含义 |
|---|---|
SIP-Number-Auth-Items |
请求的AV数量(通常为1) |
SIP-Authentication-Scheme |
Digest-AKAv1-MD5 |
SIP-Auth-Data-Item |
空壳,请求HSS填充 |
MAA返回的认证五元组:
| 参数 | 长度 | 含义 | 生成方 |
|---|---|---|---|
| RAND | 128 bit | 网络生成的随机挑战 | HSS |
| AUTN | 128 bit | 认证令牌(含MAC, SQN, AMF) | HSS |
| XRES | 可变长度 | 期望的UE响应(Expected RES) | HSS |
| CK | 128 bit | 加密密钥(Cipher Key) | HSS |
| IK | 128 bit | 完整性密钥(Integrity Key) | HSS |
S-CSCF构造401响应,将AKA参数封装进WWW-Authenticate头部:
SIP/2.0 401 Unauthorized
Via: SIP/2.0/UDP [2001:db8::1]:5060;branch=z9hG4bK1234;rport
...
WWW-Authenticate: Digest realm="ims.mnc460.mcc3gppnetwork.org",
nonce="RCM2R0FEQ0JNQUNBQT09fnRlc3Q=",
algorithm=AKAv1-MD5,
qop="auth-int",
ik="736f6d65696b76616c7565",
ck="736f6d65636b76616c7565",
opaque="5f06c423c50e"
Security-Server: ipsec-3gpp; alg=hmac-sha-256-128; ealg=aes-cbc; spi-c=987654; spi-s=876543; port-c=5063; port-s=5065
Content-Length: 0
nonce的构造(RFC 3310 Section 3):
graph LR
A[RAND<br/>128 bit] --> B["Base64编码<br/>H(RAND)"]
C[AUTN<br/>128 bit] --> B
D[SQN⊕AK<br/>隐藏序列号] --> C
E[AMF<br/>认证管理域] --> C
F[MAC-A<br/>消息认证码] --> C
B --> G["nonce = Base64<br/>(H(RAND) ‖ AUTN ‖ <br/>server-specific-data)"]
核心要点:
- nonce不是简单的RAND,而是Base64(RAND ‖ AUTN ‖ 附加数据)
- ik和ck以十六进制字符串形式传递给P-CSCF,用于建立IPSec SA
- qop=auth-int表示要求完整性保护(后续REGISTER必须带消息体摘要)
UE收到401后,将nonce中的RAND和AUTN提取出来,送入ISIM/USIM卡执行AKA算法:
flowchart TD
A["UE收到401<br/>提取nonce → RAND, AUTN"] --> B["USIM/ISIM卡<br/>输入K(长期共享密钥) + RAND"]
B --> C["f1算法 → XMAC"]
B --> D["f2算法 → RES"]
B --> E["f3算法 → CK"]
B --> F["f4算法 → IK"]
B --> G["f5算法 → AK<br/>用于解隐藏SQN"]
C --> H{"XMAC == MAC<br/>(AUTN中的MAC)?"}
H -->|否| I["❌ 网络认证失败<br/>UE拒绝注册"]
H -->|是| J["验证SQN范围<br/>防止重放攻击"]
J -->|SQN有效| K["✅ 双向认证通过<br/>构造Authorization头"]
J -->|SQN异常| L["发起AUTS同步<br/>Synchronization failure"]
K --> M["response = H(RES, nonce, ...)<br/>AKAv1-MD5 Digest计算"]
AKAv1-MD5的response计算(RFC 3310 Section 3):
response = H(A1, A2) 其中:
A1 = H(username : realm : password) ← password = RES
A2 = H(Method : digest-uri)
实际计算:
A1 = H(IMPI : realm : RES)
A2 = H(REGISTER : sip:ims.mnc460.mcc3gppnetwork.org)
response = H(A1 : nonce : nc : cnonce : qop : A2)
关键区别:普通HTTP Digest的password是预共享密码,而AKAv1-MD5的"password"是每次动态计算的RES,这确保了每次认证的唯一性。
REGISTER sip:ims.mnc460.mcc3gppnetwork.org SIP/2.0
Via: SIP/2.0/UDP [2001:db8::1]:5064;branch=z9hG4bK5678;rport
From: <sip:[email protected]>;tag=abc123
To: <sip:[email protected]>
Call-ID: cb03a0s09a2sdfglkj490333
CSeq: 2 REGISTER
Contact: <sip:460001234567890@[2001:db8::1]:5064>;+sip.instance="<urn:gsma:imei:35693803-123456-0>";expires=600000
Authorization: Digest username="[email protected]",
realm="ims.mnc460.mcc3gppnetwork.org",
nonce="RCM2R0FEQ0JNQUNBQT09fnRlc3Q=",
uri="sip:ims.mnc460.mcc3gppnetwork.org",
response="6629fae49393a05397450978507c4ef1",
algorithm=AKAv1-MD5,
qop=auth-int,
nc=00000001,
cnonce="0a4f113b",
opaque="5f06c423c50e"
Security-Verify: ipsec-3gpp; alg=hmac-sha-256-128; ealg=aes-cbc; spi-c=987654; spi-s=876543; port-c=5063; port-s=5065
Content-Length: 0
与第一轮REGISTER的关键差异:
| 字段 | 第一轮 | 第二轮 |
|---|---|---|
CSeq |
1 | 2(必须递增) |
Authorization |
无 | 含response等鉴权参数 |
Security-Verify |
无 | 回显401中的Security-Server |
Via端口 |
5060(明文端口) | 5064(IPSec保护端口) |
Require |
sec-agree | 无(已完成协商) |
SIP/2.0 200 OK
Via: SIP/2.0/UDP [2001:db8::1]:5064;branch=z9hG4bK5678;rport=5065
...
Contact: <sip:460001234567890@[2001:db8::1]:5064>;expires=600000
Date: Sat, 23 May 2026 08:30:00 GMT
P-Associated-URI: <sip:[email protected]>,
<tel:+8613800138000>
Service-Route: <sip:[email protected];lr>
Path: <sip:pcscf.ims.mnc460.mcc3gppnetwork.org;lr>
Content-Length: 0
关键IE解读:
| IE名称 | 含义 | 设计意图 |
|---|---|---|
P-Associated-URI |
该IMPI关联的所有IMPU列表 | UE获知自己拥有的所有公 identity |
Service-Route |
UE后续发请求时必须使用的路由路径 | 确保后续INVITE等经过S-CSCF触发业务 |
Path |
S-CSCF存储的到UE的路径 | 确保网络侧下发请求(如INVITE)经由P-CSCF到达UE |
Date |
服务器时间 | UE校准定时器 |
graph TB
subgraph "Cx接口三阶段"
D1["阶段1: UAR/UAA<br/>I-CSCF → HSS<br/>目的: 查询S-CSCF分配"]
D2["阶段2: MAR/MAA<br/>S-CSCF → HSS<br/>目的: 获取认证向量AV"]
D3["阶段3: SAR/SAA<br/>S-CSCF → HSS<br/>目的: 通知注册完成+下载用户档案"]
end
D1 -->|"S-CSCF地址<br/>或能力集"| D2
D2 -->|"AV五元组<br/>RAND/AUTN/XRES/CK/IK"| D3
D3 -->|"用户Profile<br/>iFC/Service-Profile"| Done["注册完成"]
style D1 fill:#e1f5fe
style D2 fill:#fff3e0
style D3 fill:#e8f5e9
| 阶段 | Diameter命令 | 触发时机 | 核心AVP | 失败影响 |
|---|---|---|---|---|
| S-CSCF发现 | UAR/UAA | I-CSCF收到REGISTER | Server-Name或Server-Capabilities |
返回403 Forbidden |
| 鉴权向量获取 | MAR/MAA | S-CSCF收到无鉴权REGISTER | SIP-Auth-Data-Item(五元组) |
无法发送401 |
| 注册确认 | SAR/SAA | S-CSCF鉴权成功后 | User-Data(iFC)、Charging-Information |
无法触发AS业务 |
当HSS中存储的SQN(Sequence Number)与USIM中的SQN不一致时,USIM会拒绝AUTN验证,触发SQN同步流程(TS 33.203 Section 6.3.2):
auts参数(包含隐藏的SQN_MS)auts传给HSSIMS-AKA不仅完成认证,还推导出IPSec SA所需的密钥材料。整个安全关联建立过程如下:
flowchart TD
subgraph "密钥材料获取"
A["401中的ik/ck"] --> B["P-CSCF提取<br/>IK(完整性)<br/>CK(加密)"]
end
subgraph "IPSec SA参数协商"
B --> C["Security-Client<br/>(UE提议)"]
B --> D["Security-Server<br/>(网络提议)"]
C --> E["匹配算法<br/>alg=hmac-sha-256-128<br/>ealg=aes-cbc"]
D --> E
end
subgraph "SA建立"
E --> F["SPI-c/SPI-s<br/>端口映射<br/>port-c/port-s"]
F --> G["IPSec ESP隧道<br/>UE ↔ P-CSCF"]
end
端口重映射机制(TS 33.203 Section 7.1):
| 端口角色 | 明文端口(第一轮REGISTER) | IPSec端口(第二轮REGISTER) |
|---|---|---|
| UE Client | 5060 | 5062(spi-c指定) |
| UE Server | 5060 | 5064(spi-s指定) |
| P-CSCF Client | 5060 | 5063(spi-c指定) |
| P-CSCF Server | 5060 | 5065(spi-s指定) |
P-CSCF在401中通过Security-Server头部告知自己的IPSec端口和SPI值,UE在第二轮REGISTER中使用新的端口号并通过Security-Verify回显确认。后续所有SIP信令(包括注册成功后的INVITE)都在IPSec隧道内传输。
| 维度 | IMS-AKA | SIP Digest | 5G-AKA(接入层) |
|---|---|---|---|
| 规范 | TS 33.203 | RFC 2617 | TS 33.501 |
| 算法 | AKAv1-MD5 / AKAv2-MD5 | MD5 / SHA-256 | 5G AKA / EAP-AKA' |
| 双向认证 | 是(AUTN验证网络) | 否(单向) | 是 |
| 密钥材料 | IK+CK推导IPSec SA | 无 | K_AUSF/K_SEAF推导 |
| 密钥存储 | ISIM(首选)或USIM | 配置文件 | USIM |
| 序列号保护 | SQN⊕AK隐藏 | 无 | SQN⊕AK隐藏 |
| 安全层级 | 应用层(SIP over IPSec) | 应用层(SIP) | 接入层(NAS) |
| 重同步机制 | auts参数 | 无 | AUTS参数 |
在Wireshark中过滤IMS注册流程:
# 过滤所有REGISTER相关消息
sip.Request-Line contains "REGISTER" || sip.Status-Code == 401 || (sip.Status-Code == 200 && sip.CSeq.method == "REGISTER")
# 过滤Diameter Cx接口
diameter.Application-Id == 16777216 && (diameter.Command-Code == 300 || diameter.Command-Code == 303 || diameter.Command-Code == 301)
关键抓包特征:
- 第一轮REGISTER:无Authorization头,CSeq: 1 REGISTER
- 401响应:WWW-Authenticate头含algorithm=AKAv1-MD5和ik/ck参数
- 第二轮REGISTER:Authorization头含response值,CSeq: 2 REGISTER
- 200 OK:含P-Associated-URI和Service-Route
| 故障现象 | 可能原因 | 排查方法 |
|---|---|---|
| 收不到401 | I-CSCF→HSS的UAR失败;S-CSCF未分配 | 检查Diameter UAA结果码;查HSS用户签约 |
| 401后发REGISTER无响应 | IPSec SA未建立;端口不匹配 | 对比Security-Client/Server中的spi和port |
| 收到403 Forbidden | response计算错误;RES≠XRES | 检查UE的AKA算法实现;核对HSS共享密钥K |
| 收到403(Subscription Expired) | HSS中用户未签约IMS | 检查HSS IMS订阅状态 |
| 反复SQN同步 | USIM与HSS的SQN严重失步 | 重置HSS中的SQN计数器 |
| SIP 500 Server Error | S-CSCF过载或MAR/MAA超时 | 查S-CSCF日志;检查Cx接口连通性 |
| ## 八、状态转换图:IMS注册的完整生命周期 |
stateDiagram-v2
[*] --> 未注册: UE开机/IMS启用
未注册 --> 鉴权进行中: 发送REGISTER(CSeq=1)
鉴权进行中 --> 网络鉴权中: 收到401<br/>USIM执行AKA
网络鉴权中 --> 鉴权响应发送: AUTN验证通过<br/>计算RES/response
网络鉴权中 --> SQN同步: SQN验证失败<br/>构造auts
SQN同步 --> 鉴权进行中: 重发REGISTER(含auts)
网络鉴权中 --> 认证失败: AUTN中MAC不匹配<br/>UE拒绝
认证失败 --> 未注册: 等待重试
鉴权响应发送 --> 已注册: 收到200 OK
鉴权响应发送 --> 认证失败: 收到403<br/>response验证失败
已注册 --> 已注册: 周期性重注册<br/>(刷新注册)
已注册 --> 未注册: 发送REGISTER(expires=0)<br/>或注册超时
已注册 --> 鉴权进行中: 重注册需重新鉴权<br/>(根据网络策略)
Q1: IMS-AKA中的AKAv1-MD5和AKAv2-MD5有什么区别?
A: 两者核心AKA算法相同(f1-f5函数族),区别在Digest封装方式。AKAv1使用RES作为密码直接参与Digest计算,AKAv2则对RES进行额外哈希处理后再参与Digest计算(password = H(RES)),提供更强的安全性。TS 33.203 Annex H.3对AKAv2有详细定义。实际网络中AKAv2逐渐成为首选。
Q2: 为什么401中的ik和ck要传递给P-CSCF,P-CSCF不应该看不到密钥吗? A: 这是TS 33.203 Section 7.1的设计。P-CSCF作为IMS网络的边缘节点,需要IK和CK来建立与UE之间的IPSec SA。密钥材料在S-CSCF和P-CSCF之间的Diameter Sh接口或内部接口上传输,属于网络域内安全(NDS/IP, TS 33.210保护)。P-CSCF只使用IK/CK建立IPSec隧道,不参与用户的长期密钥K。
Q3: ISIM和USIM在IMS-AKA中有什么差异? A: ISIM是专为IMS设计的SIM应用,直接存储IMPI、IMPU和IMS专用密钥K_IMS。USIM存储的是IMSI和接入层密钥K。当UE没有ISIM时,TS 24.229 Annex B规定了从USIM的IMSI推导IMPI/IMPU的方法,并使用USIM的K执行AKA算法。但ISIM方式是首选,因为分离的密钥体系提供了更好的安全隔离。
Q4: 第二轮REGISTER为什么必须递增CSeq? A: CSeq(Command Sequence)是SIP事务标识的核心字段。RFC 3261 Section 8.1.1.5规定同一Call-ID下的每个新请求必须递增CSeq。401触发的新REGISTER是新的事务,必须使用CSeq=2。若CSeq未递增,S-CSCF会视为重传而丢弃,导致注册挂死。这是实际排障中最常见的UE实现Bug之一。
Q5: 注册成功后,UE如何知道何时需要重注册?
A: 两种机制并行:① UE的Contact头部中的expires参数值(如600000ms=10分钟)作为软定时器,UE在到期前主动发起重注册;② 网络侧S-CSCF维护注册定时器,若超时未刷新则触发网络侧去注册(Diameter SAR with Server-Assignment-Type=TIMEOUT_DEREGISTRATION)。通常UE在有效期50%~80%时发起刷新。
本文由「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 等场景全覆盖。
