開(kāi)放、平等、協(xié)作、快速、分享
??我們都知道TLS需要依賴非對(duì)稱算法(RSK,EC,DS,DH...)完成秘鑰交換,身份認(rèn)證的功能,但是非對(duì)稱算法的耗時(shí)和耗計(jì)算資源的特性在對(duì)資源或者耗時(shí)敏感的場(chǎng)景下,你就想把他優(yōu)化掉。本文我們就簡(jiǎn)紹一種TLS標(biāo)準(zhǔn)本身提供的優(yōu)化方式:PSK.
??PSK的方式應(yīng)該是最古老的一種秘鑰交換和認(rèn)證方式,但是它在TLS中的江湖地位是比較低的,從最早的非正式的優(yōu)化方案到有了自己的RFC編號(hào)RFC4279(December 2005)對(duì)比TLS的歷史
之前搞TLS的過(guò)程中,PSK的概念有所了解,但是一直覺(jué)得他沒(méi)什么用處,就大致看了一下實(shí)現(xiàn),沒(méi)深究。但是TLS1.3中居然設(shè)計(jì)到了PSK的概念,我想有必要在這里總結(jié)一下,以免忘記。(其實(shí)就我個(gè)人而言,要理解TLS 1.3的session resume原理,是不需要理解PSK的,anyway,就當(dāng)記錄了)
RFC 4279中詳細(xì)描述了各個(gè)方面。
簡(jiǎn)單的說(shuō),就是client寫死一個(gè)key,server寫死一個(gè)key,當(dāng)然這兩個(gè)key是一樣的。
這個(gè)key被用來(lái)當(dāng)做pms(pre master key)的一部分。當(dāng)然,client 和 server也可以配置多個(gè)key,為了決定使用哪個(gè)key,每個(gè)key對(duì)應(yīng)一個(gè)psk identity(字符串標(biāo)識(shí))。
客戶端會(huì)發(fā)送client key exchange,client key exchange中攜帶有一個(gè)字符串:identity,server收到identity,查找identity對(duì)應(yīng)的key,這樣就能知道客戶端使用的是那個(gè)key了。
我們知道,其他的非PSK算法,client key exchange解出來(lái)的48字節(jié)的值,就是pms,但是PSK時(shí),不一樣,假設(shè)我們?cè)O(shè)置的key是”0x12345678”,4字節(jié),那么我們的pms是:
00 04 00 00 00 00 00 04 12 34 56 78,一共12字節(jié)。
RFC上這么描述premaster 的生成:
The premaster secret is formed as follows: if the PSK is N octets long, concatenate a uint16 with the value N, N zero octets, a second uint16 with the value N, and the PSK itself.
struct { opaque other_secret<0..2^16-1>; opaque psk<0..2^16-1>; }; Here "other_secret" either is zeroes (plain PSK case) or comes from the Diffie-Hellman or RSA exchange (DHE_PSK and RSA_PSK, respectively).
這里,我們的other_secret填寫的是0。之后的流程,就如其他算法一樣,這里不再描述。
報(bào)文如下:
其中:
client key exchange如下:
正如上面所說(shuō),client key exchange攜帶的是identity,其實(shí)就是key對(duì)應(yīng)的標(biāo)識(shí)。服務(wù)器肯定也有該標(biāo)識(shí)對(duì)應(yīng)的key,這樣才能協(xié)商成功。
這個(gè)我個(gè)人覺(jué)得比較累贅,RFC上說(shuō)了他的用處,大家可以看看,我沒(méi)啥耐心。
PSK-only中,key是兩端配置寫死的,那么在PSK-RSA中呢,key也需要配置。
先看報(bào)文:
報(bào)文的流程,和標(biāo)準(zhǔn)的RSA流程一模一樣。
我們細(xì)看client key exchange報(bào)文:
它和標(biāo)準(zhǔn)的就多了一個(gè)identity域,其他的比如Encrypted premaster就和標(biāo)準(zhǔn)的算法一樣。
對(duì)于標(biāo)準(zhǔn)的RSA,Encrypted premaster包含了48字節(jié)(去掉padding后)的random,用作pre master key,顯然PSK之所以叫做PSK,我們肯定不能簡(jiǎn)簡(jiǎn)單單的和標(biāo)準(zhǔn)RSA一樣,把Encrypted premaster解開(kāi),提取出的值就是pre master key。
PSK-RSA中的pre master key 其實(shí)定義和PSK-only中的一樣
struct { opaque other_secret<0..2^16-1>; opaque psk<0..2^16-1>; }; Here "other_secret" either is zeroes (plain PSK case) or comes from the Diffie-Hellman or RSA exchange (DHE_PSK and RSA_PSK, respectively).
舉個(gè)例子,Encrypted premaster我們解密開(kāi)是a-xA-X,48字節(jié),那么我們的pre master key 就是
00 30 a-xA-X 00 04 12 34 56 78 ,共56字節(jié)。
剩余的流程,和其他標(biāo)準(zhǔn)算法一樣。
這個(gè)就不多說(shuō)了,握手流程和標(biāo)準(zhǔn)的DHE和ECDHE一樣,只是client key exchange和server key exchange不一樣罷了。
注:server key exchange 有個(gè)”PSK identity hint”這里沒(méi)細(xì)究。
通過(guò)標(biāo)準(zhǔn)的握手,從pubkey中提取出標(biāo)準(zhǔn)的pre msater key,然后添加我們?cè)O(shè)置的key,就如PSK-RSA一樣就行了。
下一篇:TLS 1.3概述
24小時(shí)免費(fèi)咨詢
請(qǐng)輸入您的聯(lián)系電話,座機(jī)請(qǐng)加區(qū)號(hào)