“我正在参加「启航计划」”
SSL/TLS专栏导航 |
---|
1. SSL/TLS原理常识 |
2. Go源码中TLS完结 |
3. openssl中TLS完结 |
4. SSL卸载 |
5. SSL署理 |
6. SSL V.P.N |
7. SSL 与 IPSec |
8. 其他 |
获取PDF版本请查找关键字:“TLS详解” |
@[toc]
通常情况下,第三次握手报文的载荷包含:
- 可选的Certificate载荷
- ClientKeyExchange载荷
- 可选的CertificateVerify载荷
- ChangeCipherSpec载荷
- Finished载荷 但是在ECDHE办法的TLS握手流程中,首要有:ClientKeyExchange、ChangeCipherSpec、Finished载荷。第三次握手报文如下:
1. 验证客户端证书
略
2. 核算预主密钥、主密钥
预主密钥和主密钥的核算办法涉及如下几个参数,通过TLS的握手报文,客户端和服务端都现已拥有下面的密钥资料,客户端和服务端各自核算出相同的预主密钥、主密钥以及会话密钥。
当选用RSA算法进行密钥交流时,则在客户端通过随机产生;然后通过服务端证书的公钥进行加密,最终通过ClientKeyExchange载荷发送到服务端;
当选用ECDHE算法进行密钥交流时,则需求运用对端的公钥、本端的私钥、以及选用的椭圆曲线函数别离核算生成预主密钥。
Go中生成预主密钥的流程如下:
ecdheKeyAgreement
。
从ecdheKeyAgreement
结构的SharedKey()
办法中能够看出,预主密钥的核算涉及:对端的公钥,本端的私钥,以及选用的椭圆曲线。
3. 制造会话密钥
会话密钥有3类合计6把:
密钥名称 | 效果 |
---|---|
client MAC | 客户端音讯认证码密钥 |
server MAC | 服务端音讯认证码密钥 |
client KEY | 客户端对称加密密钥 |
server KEY | 服务端对称加密密钥 |
client IV | 客户端初始向量,对称加密时运用 |
server IV | 服务端支持向量,对称加密时运用 |
会话密钥的制造是在RFC2246(TLS1.0)中**“6.3. Key calculation”**定义的,它的核算办法如下:
TLS协议能够完结对报文机密性、完整性、认证的功用;机密性则是通过运用对称密码加密来完结的(此刻会运用到6把密钥中的后4把);完整性和认证功用则是通过音讯认证码来完结的(此刻会用到6把密钥的前2把)。但是除此之外,还有一种愈加高档的算法:AE(Authenticated Encryption)或者AEAD(Authenticated Encryption with Associated Data ),中文成为认证加密。认证加密是一种将音讯认证码和对称加密算法相结合,能够一起满意机密性、完整性、认证三大功用的机制。关于认证加密相关常识在“密码学常识”中进行介绍,这儿不再赘述。
Go中的TLS源码当然也支持这种比较新颖的办法(2000年今后开始出现认证加密机制)。
关于TLS服务端而言,ClientCipher套件用来解析运用;ServerCipher套件用来加密运用。别离存在TLS衔接的两个半衔接上(in半衔接用来读取客户端加密信息,存储ClientCipher套件; out半衔接用来加密服务端信息,存储ServerCipher套件)
密钥信息目前并不能立刻投入运用,而是在收到对方的ChangeCipherSpec报文后,再切换运用新洽谈的密钥。在go源码的完结中,将cipher, mac别离对应的nextCipher,nextMac结构中。
4. 读取Change Cipher Spec报文
client的Client Key Exchange载荷处理结束后,洽谈两边现已完结了互相认证,预主密钥和会话密钥都现已核算结束,之后便能够进行加密通讯。但是在加密通讯之前,TLS协议有着愈加完备的处理机制:通过Change Cipher Spec载荷来告诉洽谈两边一起完结密钥切换;通过Finished报文来查验洽谈出的密钥是否能够正常通讯。
CCS载荷的效果就是告诉对方开始切换密钥,今后通讯均运用新洽谈的密钥进行加密通讯。CCS载荷内容很简单:只要1字节长度,值为1。
5. 读取Finished报文
Finished报文首要用来查验两边洽谈的密钥信息是否能够进行正常通讯。Finished载荷核算办法如下(RFC5246:”7.4.9. Finished”小节):
PRF(master_secret, finished_label, Hash(handshake_messages))
从这儿能够看出:参加Finished载荷内容核算的包含:主密钥、Finish标签、一切的握手音讯的摘要。之前每一个握手函数都会存储到到hs.finishedHash上,就是为了此刻运用。 关于finished_label,客户端为“client finished”;服务端为”server finished”。这三个数据洽谈两边都悉数拥有,各自独立核算,然后比较是否相同;假如相同,则两边洽谈出的密钥均准确无误,能够用来加密通讯;假如校验失败,阐明洽谈有误,应立即停止洽谈。