GBA认证流程详解

GBA认证流程详解

GBA(Generic Bootstrapping Architecture)是一种用户认证机制,目前多用于运营商相关业务。在数据相关业务中,客户端与应用服务器交互过程时,进行用户认证鉴权。应用服务器NAF基于SIM卡的终端设备应用之间建立共享的用户秘钥(Ks_NAF),并利用该共享秘钥实现用户认证,即GBA。

学习GBA认证之前,先了解以下几个概念:

UE(User Equipment)用户终端设备
AKA(Authentication Key Agreement)认证秘钥协议
NAF(Network Application Function)应用服务器
BSF(Bootstrapping Server Function)引导服务器:BSF 与 UE 之间会执行 AKA 协议相互鉴权,得到会话密钥(Session Key,Ks),NAF用此密钥对终端进行认证;
HSS(Home Subscriber Server)归属用户服务器:记录所有用户相关数据的数据库;

GBA结构

GBA认证过程中,需要终端设备UE引导服务器BSF交互产生共享密钥Ks(终端设备上共享秘钥由SIM计算生成);
终端设备UE应用服务器NAF交互的时,应用服务器NAF引导服务器BSF 中取得有效的 共享密钥Ks
最终 UE 与 NAF 就可以得到相同共享密钥Ks,并进行用户认证。
UE、 BSF、NAF 三个网元之间的通信过程独立于具体的业务应用,因此 GBA 架构具有一定的通用性。

具体交互流程如下图流程所示:

GBA认证流程

一、UE请求NAF(第一次)

UE向NAF发起Https业务请求,举例如下:

  • UE在User-Agent头域中携带3gpp-gba,要求使用GBA认证;
  • UE在携带X-3GPP-Intended-Identity头域,标识身份(IMPU:IM Public Identity)。

GET https://test.server.cn/server/test HTTP/1.1 
Accept: application/json
X-3GPP-Intended-Identity: tel:+8618766668888
User-Agent: 3gpp-gba

HTTP/1.1 401 Unauthorized
Content-Length: 186
Content-Type: text/html
Date: Wed, 08 Jul 2020 09:27:46 GMT
Server: IAG
WWW-Authenticate: 
		Digest realm="3GPP-bootstrapping@test.server.cn",
		nonce="MTU5NDIwMDQ2NjphdXRuMTIzOnByaXZhdGUxMjM=", 
		algorithm=MD5, 
		qop="auth", 
		opaque="28447a3b2c57fb331c965531f7383566"

应用服务器NAF返回401 Unauthorized标识,表明需要进行GBA认证,并未返回客户端想要请求的body数据。

二、UE请求BSF(第一次)

UE向BSF服务器发起请求,要求进行AKA鉴权认证,客户端第一次请求BSF服务器时:

  • Authorization头域
    username 字段设置为(IMPU:IM Public Identity);
    realm为bsf地址;
    nonce、response为null;
    uri Http请求中值为“/”;
  • User-Agent 头域
    GBA-me为"Bootstrapping Client Agent; 3gpp-gb";
    GBA-U为"Bootstrapping Client Agent; 3gpp-gba-uicc";

UE向BSF发起Http请求,举例如下:


POST http://bsf.mnc<mnc>.mcc<mcc>.pub.3gppnetwork.org HTTP/1.1 
Authorization: 
		Digest username="<imsi>@ims.mnc<mnc>.mcc<mcc>.3gppnetwork.org", 
		realm="bsf.mnc<mnc>.mcc<mcc>.pub.3gppnetwork.org", 
		nonce="", 
		uri="/", 
		response=""
User-Agent: Bootstrapping Client Agent; 3gpp-gba
Date: Wed, 8 Jul 2020 09:27:45 GMT

HTTP/1.1 401 Unauthorized
WWW-Authenticate: 
		Digest realm="bsf.mnc<mnc>.mcc<mcc>.pub.3gppnetwork.org",
		// base64(RAND + AUTN + server specific data)
		nonce="ZapMdpGN/uJvMN6YBVOZ2gfRrVt/EwAAUT5Pc7K9vuxkAAAA0QAAAA==",
		algorithm=AKAv1-MD5,
		opaque="ODIMDAzOTAwMDIwMDkwMDM0MjAwNGU3ZDIxODY5MzlhNThiYWVkMTQ=",
		// qop auth或auth-int
		qop="auth"
  • 解码nonce,获取RAND、AUTN;
  • 利用RAND、AUTN进行AKA鉴权,计算下一次请求需要的bsfResponse;
2.1、解码nonce,获取RAND、AUTN

从返回头域WWW-Authenticate中,获取nonce数据,nonce的构成规则:
nonce = base64(RAND + AUTN + server specific data)

解码nonce,base64解码后:
前16字节为RAND,再16字节为AUTN

2.2、AKA计算
  • 计算challengeBytes
  • 计算challenge
  • AKA鉴权计算
  • 解析iccAuthResult
  • 计算bsfResponse

1)、计算challengeBytes

解码后的RAND、AUTN 按下表(参考3GPP TS 31.102_7.1.2)组织为一个字节数组challengeBytes

Byte(s)DescriptionLength
1Length of RAND (L1)1
2 to (L1+1)RANDL1
(L1+2)Length of AUTN (L2)1
(L1+3) to (L1+L2+2)AUTNL2

2)、计算challenge

challengeBytes进行base64编码,得到一个字符串challenge

3)、AKA鉴权计算

在Android平台上调用TelephonyManager原生接口getIccAuthentication()完成AKA鉴权计算,得到iccAuthResult

4)、解析iccAuthResult

iccAuthResult 按下表(参考3GPP TS 31.102_7.1.2)进行分解,得到iccAuthBytes

Byte(s)DescriptionLength
1“Successful 3G authentication” tag = ‘DB’1
2Length of RES (L3)1
3 to (L3+2)RESL3
(L3+3)Length of CK (L4)1
(L3+4) to (L3+L4+3)CKL4
(L3+L4+4)Length of IK (L5)1
(L3+L4+5) to (L3+L4+L5+4)IKL5
(L3+L4+L5+5)Length of KC (= 8)1
(L3+L4+L5+6 to (L3+L4+L5+13)KC8

iccAuthBytes 中解析出RES、CK、IK、KC,保留待用。

*5)、计算bsfResponse

username、RES、Qop、nonce、realm、uri、RequestType、body、Nc、cnonce进行Http digest 计算,生成最终的bsfResponse

至此完成AKA鉴权计算,生成了下次请求必须的bsfResponse,再次向BSF发起请求。

三、UE请求BSF(第二次)

再次向BSF发起请求,服务器会验证客户端生成的bsfResponse是否正确,从而验证客户端的合法性。

请求头域Authorization中:

  • username 字段设置为IMPI;
  • realm为bsf地址;
  • nonce 在第一次BSF返回401 header返回数据中得到;
  • uri HTTP中值为“/”;
  • qop 在第一次BSF返回401 header返回数据中得到;
  • nc 序列号可以从00000001开始;
  • cnonce 随机数;
  • opaque 在第一次BSF返回401 header返回数据中得到;
  • response 为bsfResponse;
  • algorithm 在第一次BSF返回401 header返回数据中得到;

POST http://bsf.mnc<mnc>.mcc<mcc>.pub.3gppnetwork.org HTTP/1.1 
Authorization: 
		Digest username="<imsi>@ims.mnc<mnc>.mcc<mcc>.3gppnetwork.org", 
		realm="bsf.mnc<mnc>.mcc<mcc>.pub.3gppnetwork.org",
		nonce="ZapMdpGN/uJvMN6YBVOZ2gfRrVt/EwAAUT5Pc7K9vuxkAAAA0QAAAA==",
		uri="/", 
		qop="auth", 
		nc=00000001, 
		cnonce="577ddb5a",
		response="25641685f5f95e7c66367c338cfffeac",
		opaque="ODIMDAzOTAwMDIwMDkwMDM0MjAwNGU3ZDIxODY5MzlhNThiYWVkMTQ=",
		algorithm=AKAv1-MD5
User-Agent:Bootstrapping Client Agent 3gpp-gba
Date:Wed, 8 Jul 2020 09:27:46 GMT

HTTP/1.1 200 OK
Authentication-Info: 
		rspauth="650c6877994d029e85762242bcd83fe5",
		qop=auth,
		cnonce="577ddb5a",
		nc=00000001
Content-Length: 249
Content-Type: application/vnd.3gpp.bsf+xml
Date: Wed, 08 Jul 2020 09:27:47 GMT
Server: 3gpp-gba-tmpi

<?xml version="1.0" encoding="UTF-8"?>
<BootstrappingInfo xmlns="uri:3gpp-gba">      <btid>ZapMdpGN/uJvMN6YBVOZ2jAwMzkwMDAy@bfbsf1azx.bf.bf.node.ims.mnc<mnc>.mcc<mcc>.3gppnetwork.org</btid>
       <lifetime>2020-07-08T10:27:47Z</lifetime>
</BootstrappingInfo>

若服务器验证bsfResponse通过,将会返回200 OK,并在Response Body中返回计算Ks_NAF所需要的btid

  • 计算Ks_NAF
    Ks_NAF为客户端与应用服务器交互的秘钥;
  • 用Ks_NAF计算nafResponse
    nafResponse为客户端请求Naf服务器的一个参数,由Ks_NAF与btid计算生成;

1)、计算Ks_NAF

  • Ks的计算公式(Ks可以用与计算KS_NAF):
    Ks = CK || IK

  • KS_NAF的算法为:
    Ks_NAF = KDF (Ks, "gba-me", RAND, IMPI, NAF_Id)

  • KDF为Ks_NAF的导出公式:
    KDF = HMAC-SHA-256 ( Key , S )

  • 参数Key为Ks,参数S的由如下各个参数拼接而成。
    S = FC || P0 || L0 || P1 || L1 || P2 || L2 || P3 || L3 ||... || Pn || Ln
    Key = Ks
    FC = 0x01
    P0 = "gba-me"
    L0 = length of P0
    P1 = RAND
    L1 = length of RAND
    P2 = IMPI
    L2 = length of IMPI
    P3 = NAF_ID
    L3 = length of NAF_ID

  • NAFID是由NAF 的全域名以及5字节安全协议ID共同组成,具体可参考3GPP TS 33.220,附录B有详细的算法说明。

2)、用Ks_NAF计算nafResponse

Ks_NAFpassword,以btidusername,进行进行Http digest 计算,生成与Naf服务器交互时使用的nafResponse

四、UE请求NAF(第二次)

拿到nafResponse后,就可以向应用服务器Naf再次发起业务请求操作了。

  • username 为B-TID
  • realm 由UE向第一次向NAF请求401 header返回数据中得到
  • nonce 由UE向第一次向NAF请求401 header返回数据中得到
  • uri="/"
  • qop 由UE向第一次向NAF请求401 header返回数据中得到
  • nc 在第二次BSF返回200 header返回数据中得到
  • cnonce 随机数
  • response 为nafResponse
  • opaque 由UE向第一次向NAF请求401 header返回数据中得到
  • algorithm 由UE向第一次向NAF请求401 header返回数据中得到

GET https://test.server.cn/server/test HTTP/1.1 
Authorization: 
		Digest username="ZapMdpGN/uJvMN6YBVOZ2jAwMzkwMDAy@bfbsf1azx.bf.bf.node.ims.mnc<mnc>.mcc<mcc>.3gppnetwork.org", 
		realm="3GPP-bootstrapping@test.server.cn", 
		nonce="MTU5NDIwMDQ2NjphdXRuMTIzOnByaXZhdGUxMjM=", 
		uri="/", 
		qop="auth", 
		nc=00000001, 
		cnonce="4fb04468", 
		response="9badb4dba543a836b5bfc97405d02d35", 
		opaque="28447a3b2c57fb331c965531f7383566", 
		algorithm=MD5
Accept: application/json 
X-3GPP-Intended-Identity: tel:+8618766668888 
User-Agent: 3gpp-gba

HTTP/1.1 200 OK
Authentication-Info: 
		nextnonce="MTU5NDIwMDQ2NzphdXRuMTIzOnByaXZhdGUxMjM=", 
		qop="auth", 
		uri="/", 
		nc=00000001, 
		cnonce="4fb04468", 
		rspauth="db4e12f73eef05d1df60905eef6a50bd"], 
Content-Length: 130
Content-Type: text/plain
Date: Wed, 08 Jul 2020 09:27:47 GMT
ETag: 1
Expires: Wed, 8 Jul 2020 11:27:47 GMT
Server: IAG

test body!!!
    

应用服务器NAF验证nafResponse通过,则返回200 OK,并携带客户端请求的应用数据test body!!!

参考:

UE与NAF之间TSL协商参考:3GPP TS 33.222
http://www.arib.or.jp/english/html/overview/doc/STD-T63v9_50/5_Appendix/Rel6/33/33222-660.pdf

GBA流程举例参考:ETSI TS 124 109
https://www.etsi.org/deliver/etsi_ts/124100_124199/124109/11.03.00_60/ts_124109v110300p.pdf

GBA认证流程参考:3GPP TS 33.220-g00
https://itectec.com/archive/3gpp-specification-ts-33-220/

3GPP TS 31.102
https://www.3gpp.org/ftp/tsg_ct/WG6_Smartcard_Ex-T3/CT6-92/Specifications/31%20102%20Rel%2015/31102-f30.doc

========== THE END ==========

欢迎关注我的公众号

bjxiaxueliang CSDN认证博客专家 Java OpenGL Android
一名普通Android程序员,专注Android、OpenGL ES、移动音视频等终端技术研发。
希望通过该博客分享自己的Android Coding心路。
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页
实付 29.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值