此前我一直对 https / ssl 如何 保护数据不被窃听有点疑问,因为 服务器 的证书是公开的,只能实行上行方向的数据加密,下行数据的加密我一直认为是 浏览器 会自动生成一个 客户端 的密钥对并将公钥发给服务器。今天仔细研究了 https / ssl ,发现其实并不像我想的那样,这里面既有非对称加密,又因为性能原因使用了对称加密。其原理大概是这样的: , T) q& o4 h- B( n3 C6 c. t
- 客户端浏览器连接到https/ssl服务器,并发送ssl版本号等信息到服务器,协商此次连接使用的版本和参数
- 服务器根据客户端发来的协商数据和自身支持的特性返回客户端协商参数,并且将服务器的证书发送给客户端,服务器的证书里包括用于非对称加密的服务器的公钥
- 客户端收到服务器的证书,可以用于鉴别服务器身份,防止假冒的服务器。但最重要的用处是将一段由客户端浏览器随机生成的数据pre-master secret用服务器证书里的公钥进行加密,发给服务器。注意,因为这段加密的数据只由用服务器的私钥才能解密,所以pre-master secret不会被人监听到。
- 服务器收到加密后的pre-master secret数据后,用自己的私钥解密得到原始的pre-master secret,并使用一定算法得到对称加密的密钥master secret。
- 客户端也根据同样的算法得到master secret。
- 至此,客户端和服务器之间的上/下行数据传送使用对称加/解密,初始密钥为master secret。常用的对称加密算法有RC4,AES等。
: l- D; M+ L/ A, l+ c+ U8 b: B
$ M6 m6 k. M, F6 ^: M r& Z
经过这些步骤就可以保证
https
/
ssl
上下行数据不被监听并且加/解密速度也可以接受。
; q/ _* I4 @7 r1 ?) O
当我们设计自己的加密通信协议时完全可以照搬
https
/
ssl
这种方式,有时还可以简化掉证书的传递步骤。
另外
https
/
ssl
还支持客户端身份验证,这时就需要将客户端证书上传到服务器,但这个证书并不用来加密下行数据。