ECDHE_RSA验证
ECDHE_RSA验证
上一篇博客中对TLS1.2中对ECDHE_RSA再握手阶段的密钥协商进行了解释,但是考虑到没有实际验证,无法100%的保证理解的正确性,后来几天一直在想办法验证,今天终于验证成功,把验证过程在这里简单说一下。
首先使用wireshark对TLS1.2握手的数据包了抓取,如下图所示:
从图中可以看到Client Hello,Server Hello,Server Key Exchange等交互过程,ECDHE_RSA主要应用在Server Key Exchange的过程中,所以我们先看下这个包的内容:
从图中可看出,EC Diffie- Hellman 参数在这里出现,其中Pubkey就是DH密钥交换用到的参数,而Signature就是对这个Pubkey的保护,确认其来源的正确性,防止中间人攻击。
为了验证这个猜想,需要进行如下计算:
- 对Signature进行RSA加密(验签)得到摘要信息d1
- 计算Pubkey的SHA512摘要信息d2
- 比较d1和d2,如果相同说明猜想正确
为了计算第一步,我们需要验签的公钥,这个需要去证书中寻找,如下图所示:
这里可以看到有两个certificate,一个1947长度,一个1176长度,从证书信息可以看出,1176长度的证书是CA的根证书,是用来验证1974的证书的,这个就是证书链,熟悉公钥证书体系的应该知道。
我们需要用到的公钥就在1947的证书中,其中subjectPublicKey就是我们需要的,这里有两个参数,一个是RSA的n,一个是公钥e。
有个n和e,我们就可以验证上面的Signature了,从而得到的d1,经计算:
d1 = 1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00305130d060960864801650304020305000440079daee9d2d662803b39919a94b313eef9bc989330f8dca20d379515105e59629a1ed24a7eaa447a87753004a2663fc841a3da332e82bfa94a87e1834420fcc5
熟悉pkcs1的人对这个格式肯定不陌生,这里需要补充一点,计算hash之后再计算签名之前一般是需要对数据按照预定义好的格式进行填充的,这里就使用了pkcs1。
所以准确的d1为:
079daee9d2d662803b39919a94b313eef9bc989330f8dca20d379515105e59629a1ed24a7eaa447a87753004a2663fc841a3da332e82bfa94a87e1834420fcc5
d1之前的3051300d060960864801650304020305000440为hash512的OID
d1得到之后就需要计算d2了,这里颇费了些周折,因为随TLS1.2的具体实现过程没有细节的研究过,对生成d2的消息具体是哪些不确定,一开始直接用Pubkey去计算,发现不对,然后又在网上搜索了半天,有人说是下图的这段数据是消息:
但是计算后发现还是不对,然后又尝试了各种可能,甚至自己写了段代码实现hash512,发现还是不对,就还是这个说法是不对的。直到今天查看了RFC4492,其中有一段这样的描述:
这里的ClientHello.random是客户端强求连接时发给服务器的hello包中的随机数:
ServerHello.random是服务器发给客户端的hello应答中的随机数:
然后使用上图RFC4492中公式计算消息的SHA512的摘要信息,如下:
sha512_hash ( 5e4f7d144d4e1135ee95a288bf2b8804a21f440af92ab0dab49b81120ee5e00858c7ff8c2ac3b911d05d916e6384e725c8d0365e7934a107261c89265cd483f00300174104f5d34e39b69e7570f3bb0af648ef3f4a794cb3d68e39386fc55461291fd5d61271b55a1b5b8f8a9b74de16b5b5880a4b1afea7fcadbc3fd0435c066ac9b88502 )
//-----最终计算结果 — 07 9D AE E9 D2 D6 62 80 3B 39 91 9A 94 B3 13 EE F9 BC 98 93 30 F8 DC A2 0D 37 95 15 10 5E 59 62 9A 1E D2 4A 7E AA 44 7A 87 75 30 04 A2 66 3F C8 41 A3 DA 33 2E 82 BF A9 4A 87 E1 83 44 20 FC C5
d1 == d2,验证成功!
THE END!