ssl 握手
https://razeencheng.com/post/ssl-handshake-detail.html
https://www.jianshu.com/p/7158568e4867
两篇文章结合看比较清晰。
主要过程
- Client hello,一个随机数 + 自己支持的加密算法有哪些
- Server hello,一个随机数 + 选定的算法+数字证书
- Server done, 服务端给个信号,老子该发的都发完了。
- Client Key Exchange(此时客户端拿到证书后,获得了可靠的公钥) 再搞一48字节随机数,然后用公钥加密 称为 预主密钥(PreMaster Secret)
- (内心活动)此时两端用三个随机数就可以搞成对称加密的密钥了。为啥3个随机数,我理解这个密钥必须不能重复在不同的会话中,而前面两个随机数是两端互相不信任对方能搞出唯一的uuid,第三个随机才算是密码。然后两端各自发送切换为加密传输的信号(见6)
- Change Cipher Spec(Client) ,老子从下条消息就开始加密传输了,注意到起
- Encrypted Handshake Message(Client) 先试一下,把之前的消息加密试试(client finish)
- Change Cipher Spec(Server) 老子也从下一条开始整加密信息了
9,Encrypted Handshake Message(Server), 我也试一下,把之前的消息加密试试。
- Change Cipher Spec(Server) 老子也从下一条开始整加密信息了
整个过程其实主要在做两件事儿,1.传递公钥 2.商量传递对称加密的钥匙
抓包看握手过程
从抓包看握手了,5次。但是理论上第二次和第三次是可以合并的,实际中往往第三次包很大,所以被分开。
另外change cipher Spec、Change Cipher Spec、Finish也可能合并在一起。
TLS
讲得比较清楚
https://zhangbuhuai.com/post/tls.html
常见面试问题
http://blog.itpub.net/69952849/viewspace-2672996/
总结
TLS 是比较新的协议主流的版本是TLS1.3, TLS1.2 , SSL是以前的老协议,由网景公司提出,后来TLS标准化了SSL。
数字签名,说白了你的正文可能非常大,所以加密解密都耗时。所以先对正文作hash,再对这个hash产物加密,最后的加密产物就是数字签名。验证的时候先用公钥解密(证明来源),解密后得hashA,然后自己再对正文进行hash得hashB,如果hashA===hashB,说明正文未被修改。
数字证书https://www.ruanyifeng.com/blog/2011/08/what\_is\_a\_digital\_signature.html 软一峰这篇比较清楚。说白了是公钥不受信任,需要一个三方来验证公钥身份。如何验证呢?就是用第三方的私钥加密当前公钥+额外的信息(比如域名等)加密产物就是数字证书,验证这个数字证书的过程就是用第三方的公钥来解密数字证书。所谓数字证书原理其实就是用非对称加密来产生钥匙对,一环套一环。