HTTPS加密过程
建议可以在电脑上安装一下Woreshark,这个软件方便直观的观察加密流程。
https:在http(超文本传输协议)基础上提出的一种安全的http协议,因此可以称为安全的超文本传输协议。http协议直接放置在TCP协议之上,而https提出在http和TCP中间加上一层加密层。从发送端看,这一层负责把http的内容加密后送到下层的TCP,从接收方看,这一层负责将TCP送来的数据解密还原成http的内容。
SSL(Secure Socket Layer):是Netscape公司设计的主要用于WEB的安全传输协议。从名字就可以看出它在https协议栈中负责实现上面提到的加密层。因此,一个https协议栈大致是这样的:
image
密钥交换/协商机制的几种类型
-
依靠非对称加密算法
原理:拿到公钥的一方先生成随机的会话密钥,然后利用公钥加密它;再把加密结果发给对方,对方用私钥解密;于是双方都得到了会话密钥。
举例:RSA -
依靠专门的密钥交换算法
原理:这个比较复杂,一两句话说不清楚,待会儿聊到 DH 的那个章节会详谈。
举例:DH(Diffie–Hellman的简写),ECDH(DH 的变种)
基于RSA的秘钥交换
这大概是 SSL 最古老的密钥协商方式(我更倾向称之为秘钥交换)——早期的 SSLv2 只支持一种密钥协商机制,就是它。交换过程如下:
image.png
现在,假设A与B通信,A是SSL客户端(上图左侧),B是SSL服务器端(上图右侧):
A(客户端):我想和你(服务端)安全的通话,我支持的加密算法组合有这些,并生成了一随机数Client Random(把消息封装成Client Hello发送给B)。
B(服务端):我们用ECDHE-RSA-SHA这对组合好了,我也生成一个随机值Server Random(把消息封装成Server Hello发送给A)。
B(服务端):这是我的证书,里面有我的信息和公钥,你拿去验证一下我的身份吧(把证书Certificate发给A)。
A(客户端):(收到B发来的加密方式和证书Certificate,验证B的证书的真实性,如果其中一项有误,发出警告并断开连接,这一步保证了B的公钥的真实性,至于如何验证下面详细讲)
确认数字证书有效,然后生成一个新的随机数(Premaster secret),并使用数字证书中的公钥加密了这个随机数,发给服务器B。
接着,A和B分别根据约定的加密方法,使用前面的三个随机数(Client Random,Server Random,Premaster secret),生成"对话密钥"(session key),用来加密接下来的整个对话过程。
握手阶段有三点需要注意:
(1)生成对话密钥一共需要三个随机数。
(2)握手之后的对话使用"对话密钥"加密(对称加密),服务器的公钥和私钥只用于加密和解密"对话密钥"(非对称加密),无其他作用。
(3)服务器公钥放在服务器的数字证书之中。
通过上面的分析,可以看到整个握手阶段都不加密(也没法加密),都是明文的。因此,如果有人窃听通信,他可以知道双方选择的加密方法,以及三个随机数中的两个。整个通话的安全,只取决于第三个随机数(Premaster secret)能不能被破解。
虽然理论上,只要服务器的公钥足够长(比如2048位),那么Premaster secret可以保证不被破解。但是为了足够安全,我们可以考虑把握手阶段的算法从默认的RSA算法,改为 Diffie-Hellman算法(简称DH算法)。。。。
现在来说一下客户端是如何验证服务端发来的证书Certificate的:
客户端接到服务器传来的证书,从本机得到CA的公钥值,这样就可以解密数字证书末尾的数字签名了,解密签名得到原始的证书摘要HASHs,然后自己也按照证书中的HASH算法,自己也对证书计算一个摘要HASHc,如果HASHs == HASHc,则认证通过,否则认证失败。
作者:浪够_
链接:https://www.jianshu.com/p/39ad3e40f7af
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。