開放、平等、協(xié)作、快速、分享
??我們都知道TLS需要依賴非對稱算法(RSK,EC,DS,DH...)完成秘鑰交換,身份認(rèn)證的功能,但是非對稱算法的耗時和耗計算資源的特性在對資源或者耗時敏感的場景下,你就想把他優(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的概念有所了解,但是一直覺得他沒什么用處,就大致看了一下實現(xiàn),沒深究。但是TLS1.3中居然設(shè)計到了PSK的概念,我想有必要在這里總結(jié)一下,以免忘記。(其實就我個人而言,要理解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。之后的流程,就如其他算法一樣,這里不再描述。
報文如下:
其中:
client key exchange如下:
正如上面所說,client key exchange攜帶的是identity,其實就是key對應(yīng)的標(biāo)識。服務(wù)器肯定也有該標(biāo)識對應(yīng)的key,這樣才能協(xié)商成功。
這個我個人覺得比較累贅,RFC上說了他的用處,大家可以看看,我沒啥耐心。
PSK-only中,key是兩端配置寫死的,那么在PSK-RSA中呢,key也需要配置。
先看報文:
報文的流程,和標(biāo)準(zhǔn)的RSA流程一模一樣。
我們細(xì)看client key exchange報文:
它和標(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 其實定義和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概述