经常会有人问到这个问题,以前看了很多次没有记住,这里有必要坐下总结,希望可以通俗易懂便于记忆:
Https协议由两部分组成:http+ssl,即在http协议的基础上增加了一层ssl的握手过程.
1 浏览器作为发起方,向网站发送一套浏览器自身支持的加密规则,比如客户端支持的加密算法,Hash算法,ssl版本,以及一个28字节的随机数client_random。
2 网站选出一套加密算法和hash算法,生成一个服务端随机数server_random并以证书的形式返回给客户端浏览器,这个证书还包含网站地址、公钥public_key、证书的颁发机构CA以及证书过期时间。
3 浏览器解析证书是否有效,如果无效则浏览器弹出提示框告警。如果证书有效,则根据server_random生成一个preMaster_secret和Master_secret(会话密钥) master_secret
的生成需要 preMaster_key
,并需要 client_random
和 server_random
作为种子。浏览器向服务器发送经过public_key加密的preMaster_secret,以及对握手消息取hash值并使用master_secret
进行加密
发送给网站.-----------------客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供服务器校验
4 服务器使用private_key
解密后得到preMaster_secret,再根据client_random
和 server_random
作为种子得到master_secret.
然后使用
master_secret
解密握手消息并计算
hash
值
,
跟浏览器发送的
hash
值对比是否一致
.
然后把握手消息通过
master_secret
进行对称加密后返回给浏览器
.
以及把握手消息进行
hash
且
master_secret
加密后发给浏览器.--------------
服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供客户端校验。
5 客户端同样可以使用
master_secret
进行解密得到握手消息
.
校验握手消息的
hash
值是否跟服务器发送过来的
hash
值一致
,
一致则握手结束
.
通信开始。
6 以后的通信都是通过
m
aster_secret+对称加密算法的方式进行. 客户端与服务器进入加密通信,就完全是使用普通的HTTP协议,只不过用"会话密钥"加密内容。SSL握手过程中如果有任何错误,都会使加密连接断开,从而阻止了隐私信息的传输。
- 非对称加密算法:RSA,DSA/DSS
- 对称加密算法:AES,RC4,3DES
- HASH算法:MD5,SHA1,SHA256
参考: 阮一峰日志