開放、平等、協(xié)作、快速、分享
??我們都知道TLS需要依賴非對稱算法(RSK,EC,DS,DH...)完成秘鑰交換,身份認(rèn)證的功能,但是非對稱算法的耗時和耗計(jì)算資源的特性在對資源或者耗時敏感的場景下,你就想把他優(yōu)化掉。本文我們就簡紹一種TLS標(biāo)準(zhǔn)本身提供的優(yōu)化方式:PSK.
??PSK的方式應(yīng)該是最古老的一種秘鑰交換和認(rèn)證方式,但是它在TLS中的江湖地位是比較低的,從最早的非正式的優(yōu)化方案到有了自己的RFC編號RFC4279(December 2005)對比TLS的歷史
之前搞TLS的過程中,PSK的概念有所了解,但是一直覺得他沒什么用處,就大致看了一下實(shí)現(xiàn),沒深究。但是TLS1.3中居然設(shè)計(jì)到了PSK的概念,我想有必要在這里總結(jié)一下,以免忘記。(其實(shí)就我個人而言,要理解TLS 1.3的session resume原理,是不需要理解PSK的,anyway,就當(dāng)記錄了)
RFC 4279中詳細(xì)描述了各個方面。
簡單的說,就是client寫死一個key,server寫死一個key,當(dāng)然這兩個key是一樣的。
這個key被用來當(dāng)做pms(pre master key)的一部分。當(dāng)然,client 和 server也可以配置多個key,為了決定使用哪個key,每個key對應(yīng)一個psk identity(字符串標(biāo)識)。
客戶端會發(fā)送client key exchange,client key exchange中攜帶有一個字符串:identity,server收到identity,查找identity對應(yīng)的key,這樣就能知道客戶端使用的是那個key了。
我們知道,其他的非PSK算法,client key exchange解出來的48字節(jié)的值,就是pms,但是PSK時,不一樣,假設(shè)我們設(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如下:
正如上面所說,client key exchange攜帶的是identity,其實(shí)就是key對應(yīng)的標(biāo)識。服務(wù)器肯定也有該標(biāo)識對應(yīng)的key,這樣才能協(xié)商成功。
這個我個人覺得比較累贅,RFC上說了他的用處,大家可以看看,我沒啥耐心。
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)的就多了一個identity域,其他的比如Encrypted premaster就和標(biāo)準(zhǔn)的算法一樣。
對于標(biāo)準(zhǔn)的RSA,Encrypted premaster包含了48字節(jié)(去掉padding后)的random,用作pre master key,顯然PSK之所以叫做PSK,我們肯定不能簡簡單單的和標(biāo)準(zhǔn)RSA一樣,把Encrypted premaster解開,提取出的值就是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).
舉個例子,Encrypted premaster我們解密開是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)算法一樣。
這個就不多說了,握手流程和標(biāo)準(zhǔn)的DHE和ECDHE一樣,只是client key exchange和server key exchange不一樣罷了。
注:server key exchange 有個”PSK identity hint”這里沒細(xì)究。
通過標(biāo)準(zhǔn)的握手,從pubkey中提取出標(biāo)準(zhǔn)的pre msater key,然后添加我們設(shè)置的key,就如PSK-RSA一樣就行了。
下一篇:TLS 1.3概述
24小時免費(fèi)咨詢
請輸入您的聯(lián)系電話,座機(jī)請加區(qū)號