证书申请
比如说bob有一个网站bob.cn,bob生成了一对公私钥,其把个人身份及公钥发送给CA登记机构,CA登记机构验证bob的身份,比如是个dv证书,就看证书所对应的域名是不是你的,域名是不是指向你的服务器。登记机构验证通过之后,就会把证书签名申请发送给CA机构,CA机构用其私钥签名之后,颁发证书给bob.cn网站。bob就可以在其web服务器上部署证书。
在机构证书中,使用到了非对称加密的验签,比如我们服务器的nginx中会配置ssl.cert,以及ssl.key(private key)(私钥中包含了公钥)。
TLS握手
-
client发送hello,client会告诉server,我支持哪些安全套件
-
server发送hello,server告诉client,我选择哪个安全套件,比如选定了某个椭圆曲线
TLS安全密码套件:
密钥交换算法:ECDHE身份验证算法:RSA
对称加密算法:AES_128_GCM
签名hash算法:SHA_256
-
server发送证书,用于认证服务器的身份
当client拿到这个证书之后,其如何进行验签呢?
其首先提取成两部分,第一部分就是网站身份数据,通过证书提供的一个hash算法,生成一个hash值。
第二部分是我们用CA证书私钥签名后的密文,用CA机构的公钥验签,如果验签成功,就说明这块内容确实是CA结构所加密的,也就是验证了CA机构的合法性。
再检查两段hash值,匹配则验签成功。
-
server发送服务器所生成的ClientKey(这个是DH密钥交换所使用的)
-
server 发送 hello done
2到5步可以认为是同时发送的
也就是1到5步 只消耗了一个RTT
-
client也生成一个ClientKey,发送给服务器端(这个是DH密钥交换所使用的)
这里就完成了DH秘钥交换协议,DH密钥交换原理,参考:从数学角度讲解DH密钥交换算法、非对称加密、数字签名 -
两端同时生成对称加密密钥
-
后面就可以基于这个加密密钥进行加密通讯了
6到8步,也是一个RTT,所以握手是两个RTT
报文一去一回需要的时间:RTT(Round Trip Time)