5G注册流程分级详解(鉴权)Step9_南山耕夫的博客-程序员秘密_5g注册流程

技术标签: 5G  5g  

***   欢迎转发,转发请注明出处 。 相关更新会在公众号公布更新,敬请关注。公众号:5G通信大家学  ***

目录

9. Authentication/Security流程。

0)准备知识

1) 鉴权流程

A. 鉴权流程(请求阶段):

B. 鉴权流程(响应阶段):

C. 鉴权流程(鉴权确认和注册绑定部分)

2)5G密钥相关推导图


9. Authentication/Security流程。

0)准备知识

该步骤为UE的5G的鉴权流程,本文以目前使用的5G AKA鉴权方式为例介绍。5G AKA相比4G增加了归属网络的鉴权功能。4G的鉴权由MME完成,而5G的鉴权由AMF和AUSF共同完成,且5G的鉴权向量不支持预取,也不支持一次获取多组鉴权向量。

归属网络的AUSF提供鉴权过程的锚点密钥(anchor key)KSEAF,它是由加密保存在AUSF中的中间密钥Kausf计算得到的。5G中,锚点密钥和和服务网络(Serving Network)进行绑定,向UE提供隐式的服务网络认证。绑定的方式是将5G SN名称作为密钥推导的输入参数。

15G SNNServing Network Name

5G SNN的作用:

  • 用于推导锚点密钥,作为AUSF推导Kseaf的输入参数,及作为UE推导RES*和XRES*的输入参数;
  • 将锚点密钥和服务网络绑定;
  • 通过将服务码(Service code)设置为“5G”来保证锚点密钥用于5G核心网和UE之间的鉴权认证。

5G SNN的构成:

SNN最长1020个字节,由两部分构成:SNN-service-code和SNN-network-identifier,中间用冒号“:”进行连接。

由于在认证和鉴权过程中,安全密钥需要在UE和SEAF(位于AMF中)中分别推导,因此,SNN作为密钥推导的输入参数,需要在UE和SEAF分别进行构造。

  • SNN-service-code:固定为“5G”。在通过non-3GPP接入时,也用于区分接入网络,作为Access Network Identity使用;
  • SNN-network-identifier:用于识别当前的移动网络。根据TS 24.501章节9.12.1规定,对于PLMN网络,该值为:mncXXX.mccXXX.3gppnetwork.org(都为小写字母)。对应中国移动的5G网络SNN-network-identifier为:mnc000.mcc460.3gppnetwork.org。

UE侧根据RAT和小区广播的PLMN信息可以很容易推导出SNN,进而用于安全密钥的推导;而AMF侧根据配置信息也可以构造出SNN,用于鉴权和认证。

2)鉴权流程的触发条件

通常,与UE建立信令连接的流程都可以触发鉴权流程。我们常见到的能够触发鉴权流程的场景为:

  • UE使用SUCI发起注册流程;
  • AMF没有UE的有效上下文;
  • Registration Request消息没有被完整性保护;
  • UE携带5G-GUTI注册,但是old AMF对注册请求消息执行完整性检查失败;

1 鉴权流程

本部分的鉴权流程分成三个部分:

  1. 鉴权流程(请求阶段)
  2. 鉴权流程(响应阶段)
  3. 鉴权流程(鉴权确认和注册绑定部分)

A. 鉴权流程(请求阶段):

1)消息方向:AMF/SEAF -> AUSF

HTTP方法:POST

消息名称:Nausf_UEAuthentication_Authenticate Request

在整体注册流程的第8步中,AMF根据从UE得到的SUCI或者从old AMF得到的SUPI,选择对该UE进行鉴权的AUSF,构造Nausf_UEAuthentication_Authenticate Request消息并发送给该AUSF。

该请求的资源URI为:

{apiRoot}/nausf-auth/v1/ue-authentications

携带的参数类型为:AuthenticationInfo,具体的字段信息如下图,我们常见到的IE为SUPI或者SUCI,及SNN:

只要AMF得到了UE的SUPI,在Nausf_UEAuthentication_Authenticate Request消息中包括的都是SUPI,除非AMF不知道UE的SUPI,才会在该消息中包含SUCI。

AUSF收到请求消息后,会检查消息中的Serving Network Name是否得到了授权。如果检查失败,则返回:403 Forbidden,携带的原因值为:SERVING_NETWORK_NOT_AUTHORIZED。

2)消息方向:AUSF -> UDM

HTTP方法:POST

消息名称:Nudm_UEAuthentication_Get Request

该请求的资源URI为:

{apiRoot}/nudm-ueau/v1/{supiOrSuci}/security-information/ generate-auth-data

该消息用于AUSF请求UDM为UE选择一种鉴权方法,并计算新的鉴权向量(如果该鉴权需要鉴权向量的话)。如果请求中包含的是SUCI,UDM收到该请求后,首先,SIDF将SUCI解密为SUPI,之后根据SUPI为UE选择鉴权方式。目前,5G使用的鉴权方式有两种:EAP-AKA’ 和5G AKA。

请求消息AuthenticationInfoRequest的内容如下图:

- ResynchronizationInfo

  该字段包含两项内容:rand和auts。在鉴权重同步过程中,AUTS由UE计算得到。

B. 鉴权流程(响应阶段):

1UDM生成鉴权向量

UDM/ARPF在生成鉴权向量时,需要将Authentication Management Field (AMF)的separation bit设置为"1"。separation bit为AUTN中AMF字段的第0比特,该值为1标识生成的鉴权向量用于EPS/5G AKA鉴权;如果设置为0,标识该鉴权向量用于GSM、UMTS等非EPS/5G AKA鉴权(具体原理详见TS33.102,6.4.3章节及附录F)。对于鉴权向量来讲,如果设置为1,AKS鉴权过程中产生的CK和IK鉴权密钥不会离开HSS。 UDM/ARPF推导出 KAUSF并计算XRES*(在推导Kausf和XRES*时都会将serving network name作为输入参数使用)。最后UDM/ARPF生成的5G HE AV包含RAND、AUTN、XRES*、KAUSF四个参数。(其中鉴权令牌AUTN = SQN Å AK || AMF || MAC)。

2)消息方向:UDM -> AUSF

消息名称:Nudm_UEAuthentication_Get Response

  • 成功响应

返回200 OK响应。UDM计算出5G HE AV(RAND、AUTN、XRES*、KAUSF),并在响应消息中返回给AUSF。携带AuthenticationInfoResult内容。

该响应消息包含AuthenticationInfoResult,具体内容如下:

- supi

如果请求消息中是SUCI,UDM会使用SIDF解密出SUPI并在该字段中返回给AUSF。

- authType

AUSF根据该字段为UE开启"5G_AKA"鉴权流程或者"EAP_AKA_PRIME"鉴权流程。

选择的鉴权类型共有三个取值:"EAP_AKA_PRIME"、"5G_AKA"和"EAP_TLS",其中,"EAP_TLS"标准并不强制要求支持。

- AuthenticationVector

鉴权向量包含的内容如下:

其中:

- avType

取值两种:"5G_HE_AKA"和"EAP_AKA_PRIME"。

- rand

共128比特,16字节。

- autn

共128比特,16字节。AUTN的构成(SQN xor AK)||AMF||MAC,共48+16+64 bits。

  • 失败响应

- 403 Forbidden

可能的原因值为:AUTHENTICATION_REJECTED、INVALID_HN_PUBLIC_KEY_IDENTIFIER、INVALID_SCHEME_OUTPUT

- 404 Not Found

如果用户没有开户,则携带原因值:USER_NOT_FOUND

- 501 Not Implemented

原因值:UNSUPPORTED_PROTECTION_SCHEME。

3AUSF保存XRES*

AUSF临时保存从响应消息中的XRES*和SUPI,用于归属地的鉴权比较。

注:

TS33.501中,该步骤的解释为“The AUSF shall store the XRES* temporarily together with the received SUCI or SUPI.”。也就是说本步骤,AUSF也可能保存SUCI。不知道在什么场景下会出现AUSF临时保存SUCI?从上述Nudm_UEAuthentication_Get Response成功的200 OK响应AuthenticationInfoResult内容来看,并没有定义SUCI字段。在失败响应中,只有403 Forbidden,原因值:INVALID_SCHEME_OUTPUT,表示无法解密SUCI,也没有带回SUCI。怀疑3GPP该步骤的解释应该为编写错误。

4AUSF计算XRES*

AUSF根据接收到的5G HE AV(RAND、AUTN、XRES*、KAUSF)来计算5G AV(RAND、AUTN、HXRES*、KSEAF);根据XRES*计算出HXRES*;根据KAUSF计算出KSEAF(计算KSEAF仍然需要serving network name作为输入参数)。锚点密钥Kseaf此时诞生。

5)消息方向:AUSF -> AMF/SEAF

消息名称:Nausf_UEAuthentication_Authenticate Response

AUSF 删除KSEAF,并在Nausf_UEAuthentication_Authenticate Response消息中向AMF返回5G SE AV (RAND, AUTN, HXRES*) 。

从上述可见,AUSF产生的5G AV并没有直接发送给AMF,而是分两步发送:第一步,发送5G SE AV用于拜访地鉴权;第二步,如果拜访地鉴权成功,返回RES*归属地鉴权成功后,将锚点密钥Kseaf发送给AMF,此时才将完整的5G AV发送给了AMF。

该Response的内容如下:

消息IE介绍:

- authType

指示UE本次鉴权网络选择的鉴权方法,共有三个取值:"EAP_AKA_PRIME"、"5G_AKA"和"EAP_TLS"。

- _links

该字段包含本次鉴权后,UE返回的RES*,AMF返回RES*时需要调用的AUSF的资源URI。如果是5G AKA,该字段的值为“5g-aka”和执行鉴权确认的超链接URI,如http://172.16.141.122:8080/nausf-auth/v1/ue-authentications/06120902071/5g-aka-confirmation。如果是EAP鉴权,该字段的值为:"eap-session"及执行EAP Session的URI。

- 5gAuthData

包含上一步骤的5G SE AV (RAND, AUTN, HXRES*)。

6)消息方向:AMF/SEAF -> UE

消息名称:Authentication RequestNAS消息)

AMF/SEAF保存接收到的HXRES*,并向UE发送Authentication Request消息,启动T3560计时器,消息中包含RAND、AUTN、ngKSI、ABBA等参数。ME转发接收到的Authentication Request消息中的RAND和AUTN 给USIM。

5G AKA流程都是由网络发起的,UE可以拒绝网络发起的鉴权请求。

Authentication Request消息包含在N2接口的Downlink NAS Transport和Uu接口的RRC层DLInformationTransfer消息中发送给UE。

Authentication Request消息定义:

消息IE介绍:

- ngKSI

ngKSI是由SEAF生成的,取值范围0-6(3bit)(7保留)。如果UE发送给网络的ngKSI=7,表示没有密钥可用。ngKSI用于在UE和AMF中识别Kamf。在后续鉴权成功后,用于识别5G安全上下文。如果在初始NAS消息(Registration Request消息)中包含了ngKSI,AMF需要在Authentication Request中分配一个不同的ngKSI。

- ABBA

ABBA参数为保持前向兼容,其长度可变,在R16版本中,长度为2个字节,值规定为:0x0000,用于推导Kamf作为输入参数。该参数用于防止降维攻击。

- Authentication parameter RAND/ Authentication parameter AUTN

均为从AUSF收到的数据。

- EAP message

对于5G AKA鉴权,不包含该IE。

7UE计算RES*

USIM收到RAND和AUTN,需要先检查AUTN中的MAC区域,验证接收的AUTN新鲜度。验证通过后,USIM计算RES,并和CK、IK一起返回给ME。如果USIM 根据CK和IK计算出了Kc (如GPRS Kc) 也发给了ME,则ME忽略该值,在USIM和ME上都不保存该值。之后,ME根据收到的RES计算RES*(serving network name、RAND等作为输入参数)。ME根据CK||IK 、serving network  name 及AUTN中的SQN Å  AK 计算出KAUSF,进而计算出 KSEAF (serving network name作为输入参数)。最后,ME检查AUTN的AMF域的"separation bit"是否为1。

8)消息方向: UE -> AMF/SEAF

消息名称:Authentication ResponseNAS消息)

UE构造Authentication Response消息发送给AMF/SEAF。AMF/SEAF收到Authentication Response消息后停止T3560计时器。

Authentication Response消息包含在Uu接口RRC层的ULInformationTransfer消息和N2接口的Uplink NAS Transport消息中发送给AMF/SEAF。

Authentication Response消息定义:

消息IE介绍:

- Authentication response parameter

该参数为UE计算的RES*。(在5G AKA中,RES*由ME计算得到,16字节长度,在4G中,RES由USIM计算得到,最短4字节,最长16字节。)

9AMF/SEAF计算HRES*

AMF/SEAF根据UE发送的RES*计算出HRES* (输入参数有RES*、RAND等),SEAF比较HRES*和HXRES*,如果二者一致,则认为UE在当前的拜访网络鉴权成功。之后,执行第10步,通过Nausf_UEAuthentication_Authenticate Request消息将RES*发送给AUSF进行归属地鉴权。

如果HRES*和HXRES*不一致,则认为UE在拜访网络鉴权失败,仍然会继续执行第10步,只是此时不携带RES*,而是携带空值,以通知AUSF在拜访地鉴权失败。

如果此时UE不可达,SEAF不会收到RES* ,则SEAF认为本次鉴权失败,并通知AUSF。

注:

网络上及个别厂家文档写到:如果拜访网络鉴权失败,流程结束。该说法并不准确,即使拜访网络鉴权失败,仍然会通知归属地AUSF

如果在后面第12步中AUSF返回给SEAF鉴权结果Nausf_UEAuthentication_Authenticate Response消息中,指示RES*在归属地鉴权失败,或者RES*在拜访网络的SEAF中鉴权失败,则认为UE本次鉴权失败。如果UE使用SUCI发起的注册请求,则SEAF向UE发送UE Authentication Reject消息;如果UE使用的5G-GUTI发起的注册请求,AMF会尝试向UE请求SUCI再次进行鉴权尝试。如果最终UE鉴权失败,会收到Authentication Reject消息。

在UE侧,如果UE对Authentication Reject消息完整性检查通过,UE会设置update status为5U3 ROAMING NOT ALLOWED,并删除保存的5G-GUTI、TAI list、last visited registered TAI和ngKSI。在UE关机或者USIM卡更换之前不会再进行重新注册。如果Authentication Reject完整性检查失败,在30分钟到60分钟之间,会再次发起注册。

10)消息方向: AMF/SEAF -> AUSF

HTTP方法:PUT(注意:EAP鉴权方式时本步骤为POST方法)

消息名称:Nausf_UEAuthentication_Authenticate Request

该请求消息调用AUSF的资源URI:

{apiRoot}/nausf-auth/v1/ue-authentications/{authCtxId}/5g-aka-confirmation

该URI在第5步的响应消息中_links字段携带,也可以由AMF自行构造。如果构造的不准确,则在返回响应消息:404 Not Found,携带原因值:CONTEXT_NOT_FOUND,表示AUSF没有找到对应的资源URI。

该消息携带的确认数据只有ConfirmationData,包含:RES*。但是该值也有为空的情况,表示通知AUSF拜访地鉴权失败。具体场景如下:

- UE不可达的情况,AMF不会收到RES*;

- 拜访地鉴权失败AMF比较HRES*和HXRES*不一致;

- AMF收到UE的authentication failure消息,如:synchronization failure或者MAC failure。

11AUSF验证RES*

AUSF收到RES*后,首先验证5G AV是否过期。如果5G AV过期了,则认为归属网络鉴权失败。如果5G AV验证不超期,AUSF加密保存Kausf。之后,AUSF比较接收到的 RES*和保存的XRES*是否一致,如果一致,AUSF认为归属网络鉴权成功,并通知UDM鉴权结果,之后开启鉴权确认和注册绑定流程。

12)消息方向: AUSF -> AMF/SEAF

消息名称:Nausf_UEAuthentication_Authenticate Response

如果AUSF鉴权成功,则向AMF/SEAF返回200 OK响应,携带ConfirmationDataResponse信息,具体内容如下:

消息IE介绍:

- authResult

该IE共有三个可选值:

- AUTHENTICATION_SUCCESS:归属地鉴权成功

- AUTHENTICATION_FAILURE:归属地鉴权失败

- AUTHENTICATION_ONGOING:表示EAP Session鉴权正在进行,目前不涉及。

- supi/kseaf

从整个流程中可以看到,只有当归属地鉴权成功后,AMF才能得到解密后的SUPI和锚点Kseaf。拜访网络在得到SUPI之前,不能使用任何网络服务。之后SEAF根据Kseaf、ABBA参数和SUPI推导出Kamf,并和ngKSI一起发送给AMF。

C. 鉴权流程(鉴权确认和注册绑定部分)

该步骤主要用于防止AMF的虚假注册,如UE所处拜访网络没有的AMF,确发起了Nudm_UECM_Registration_Request,导致UE注册在了一个不存在的AMF上。

1)消息方向:AUSF -> UDM

HTTP方法:POST

消息名称:Nudm_UEAuthentication_ResultConfirmation Request

该请求消息的资源URI如下:

{apiRoot}/nudm-ueau/v1/{supi}/auth-events

资源URI中包含SUPI,消息体仅包含AuthEvent参数,内容如下:

消息IE介绍:

- nfInstanceId

执行鉴权的NF instance (如AUSF)。

- success

该值为布尔类型,true表示AUSF鉴权成功,false 表示鉴权不成功。false值也用于AUSF请求UDM删除鉴权结果。

- authRemovalInd

可选项,用于指示UDM中的鉴权结果是否删除,true表示删除。默认值为false。

2UDM保存AuthEvent相关信息

UDM保存UE的鉴权状态,如SUPI、鉴权结果、时间戳、serving network name等。

3)消息方向:UDM -> AUSF

消息名称:Nudm_UEAuthentication_ResultConfirmation Response

  • 成功响应

返回201 Created,消息体可以为空。如果不为空,则返回AuthEvent内容。HTTP消息头的Location字段包含创建的资源,URI如下:

{apiRoot}/nudm-ueau/v1/{supi}/auth-events/{authEventId}

  • 失败响应

404 Not Found,原因值:USER_NOT_FOUND。

3UDM对后续流程的鉴权

如果UDM收到了UE的后续流程,如:AMF发送的Nudm_UECM_Registration_Request消息,UDM会根据运营商策略执行相关检测和保护操作(详见TS 33.501,3GPP仅提供了建议操作)。

25G密钥相关推导图

15GS密钥推导图(TS 33.501

25GS密钥分布及生成模式图(TS 33.501

3UDM鉴权向量推导图(TS 33.102

4UE鉴权推导图(TS 33.102

 

后续流程,留待下回分解  ......

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wuyou125/article/details/114299375

智能推荐

如何在UE4中做出涟漪的效果_ue4 水面 uv_UWA的博客-程序员秘密

涟漪这个效果我相信很多人都尝试实现过,也有各种实现方法。在这里,我实现的方法是使用Custom节点,用算法生成法线。接下来向大家分享一下思路,看一下最终效果图。文末提供了材质球百度云链接。最终效果图简单地说一下原理:先用UV做出伪随机的格子,每个格子就是一个单独的UV,不过具有不同的灰度值,然后在格子的中心生成多个不同大小的同心圆,再做缩放和边缘混合。随机噪波生成首先,我们先定义一个三维向量用来进行三层不同大小涟漪的计算,因为UV的取值范围是0-1,所以我们定义的float3的值必

Android focusable属性的作用_android:focusable_路宇的博客-程序员秘密

当我们写代码的时候总会发现有的控件获取不到焦点,那是因为ImageButton,Button等都是抢占焦点的控件android:focusable=”true” 这行的意思就是说可以获取焦点android:focusable=”false” 这行就是不可获取焦点可以根据需求来写要不要获取焦点。焦点的作用:假如某控件没有焦点,相当于你点不到那个控件。不能对其进行监听操作等。应用场景: 在我们实现底部导航功能时,可以给想应的导航栏控件设置获取焦点的属性,提高用户体验度。......

caused by java.io.io_springboot运行出错,Caused by: java.io.IOException_PPT3031的博客-程序员秘密

springboot 运行启动,能够正常启动并且运行,但是一开始就在控制台输出如此错误:不知道原因何在??java.io.IOException: 浣犵殑涓绘満涓殑杞欢涓浜嗕竴涓凡寤虹珛鐨勮繛鎺ャ��而且这个提示的中文还乱码?如何解决org.apache.catalina.connector.ClientAbortException: java.io.IOException: 浣犵殑涓绘...

Jacobian矩阵和Hessian矩阵_小白学视觉的博客-程序员秘密

点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达前言还记得被Jacobian矩阵和Hessian矩阵统治的恐惧吗?本文清晰易懂的介绍了Jacobian矩阵和Hessi...

python作业_python小作业_weixin_39677538的博客-程序员秘密

1.简述变量命名规范变量由数字,字母,下划线组成不能以数字开头不能使用python中关键字不能使用中文和拼音区分大小写变量名要具有描述性推荐写法​7.1驼峰体AgeOfOldboy = 98​7.2下划线age_of_oldboy = 98 (官方推荐)2.name = input(“>>>”) name变量是什么数据类型通过代码检测字符串3.if条件语句的基本结构?单ifif else 二选一i...

微信小程序开发(四) - 全局外边框配置 - json 文件_lendq的博客-程序员秘密

注 :注释只能在wxml , js 文件中使用(<!-- --> , // ) 其余`json , wxss`文件都不能使用注释JSON 文件 的作用app.json 本质上只会更改外边框(除了网络超时)pages.json除了以上作用以外,还可以用来添加自定义wxml组件,后面会补充项目配置文件 project.config.json该...

随便推点

Chisel环境搭建教程(Ubuntu)_OuterRef的博客-程序员秘密

chisel的依赖很多,而且很容易出现版本不兼容的情况,这里每一步我都会提供自己的安装版本OS版本:Ubuntu 21.04 64bit相关参考资料见底

IO流实现文章的复制[email protected]的博客-程序员秘密

Io流实现文章复制1字节输入流: FileInputStream输出流 FileOutputStream2通用的复制工具FileInputStream fis = new FilrInputStream(“源文件路径”);FileOutputStream fos = new FilrOutputStream(“目标文件路径”);高效复制byte[] buf = new byte[8192];int len = 0;while((len=fis.read(buf))!=-1){fos

光的波粒二象性_WolfgangMoozart的博客-程序员秘密

光的波粒二象性光的波动性笛卡儿提出的两点假说《折光学》中提出了两种假说。一种假说认为,光是类似于微粒的一种物质;另一种假说认为光是一种以“以太”为媒质的压力。虽然笛卡儿更强调媒介对光的影响和作用,但他的这两种假说已经为后来的微粒说和波动说的争论埋下了伏笔。格里马第发现了光的衍射现象首先发现了光的衍射现象。据此他推想光可能是与水波类似的一种流体。格里马第第一个提出了“光的衍射”这一概念,...

媒体播放器程序——(第一天:建立程序结构)_鲨鱼咯咯哩的博客-程序员秘密

在linux系统上用c语言开发。使用GStreamer多媒体框架,该框架运行于GNOME桌面环境使用GTK+2.0图形用户界面框架实现屏幕上的显示。用户界面模块:用于和用户进行交互。用户使用键盘或鼠标操作程序时,用户界面将识别出的操作指令传递给核心控制模块,再由核心控制模块作出反应,将程序的运行结果传送到用户界面。核心控制模块:用于协调各个模块的运作,保存当前状态,在程序启动时,该模块最先启动,然后在调用其他模块,程序结束时,该模块清理其他模块使用过的内存,并且最后退出播放控制模块:专门用于

web前端常用工具网址_homie.Y的博客-程序员秘密

PX 转换 em   网址    http://pxtoem.com/

Java对象内存结构_茅坤宝骏氹的博客-程序员秘密

转载自 Java对象内存结构学C/C++出身的我,对Java有一点非常困惑,那就是缺乏计算对象占用内存大小的机制。而在C++中就可以通过sizeof运算符来获得基本类型以及类实例的大小。C和C++中的这个操作符对于指针运算、内存拷贝和IO操作都非常有用。Java中并没有一个类似的运算符。事实上,Java也不需要这种运算符。Java中基本类型的大小在语言规范中已经定义了,而C/C++中基本类型大小则...

推荐文章

热门文章

相关标签