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认证过程中,需要终端设备UE
与引导服务器BSF
交互产生共享密钥Ks
(终端设备上共享秘钥由SIM计算生成);
当终端设备UE
与应用服务器NAF
交互的时,应用服务器NAF
到引导服务器BSF
中取得有效的 共享密钥Ks
;
最终 UE 与 NAF 就可以得到相同共享密钥Ks
,并进行用户认证。
UE、 BSF、NAF 三个网元之间的通信过程独立于具体的业务应用,因此 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) | Description | Length |
---|---|---|
1 | Length of RAND (L1) | 1 |
2 to (L1+1) | RAND | L1 |
(L1+2) | Length of AUTN (L2) | 1 |
(L1+3) to (L1+L2+2) | AUTN | L2 |
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) | Description | Length |
---|---|---|
1 | “Successful 3G authentication” tag = ‘DB’ | 1 |
2 | Length of RES (L3) | 1 |
3 to (L3+2) | RES | L3 |
(L3+3) | Length of CK (L4) | 1 |
(L3+4) to (L3+L4+3) | CK | L4 |
(L3+L4+4) | Length of IK (L5) | 1 |
(L3+L4+5) to (L3+L4+L5+4) | IK | L5 |
(L3+L4+L5+5) | Length of KC (= 8) | 1 |
(L3+L4+L5+6 to (L3+L4+L5+13) | KC | 8 |
从 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_NAF
为password
,以btid
为username
,进行进行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