使用RSA算法的SSL握手图如下:
步骤如下
Client端请求https连接,发送client_random和支持的加密方式
返回证书和server_random(经过Server端私钥加密)
验证证书,使用证书中公钥加密permaster_secret(permaster_secret是一个随机数)
Client端发送permaster_sercret至Server端,server端通过私钥解密
Client端和Server端分别根据client_random、server_random和permaster_secret生成master secret
要点1: 第二步中Server端为何传证书,不直接传公钥
防止攻击者拦截Client端请求,伪装成服务端。即防止出现如下情况:
因为私钥和公钥谁都能生成,因而Client端无法确认公钥是否属于Server端。数字证书则可以解决这个问题。
要点2:数字证书
证书包含的主要内容:
证书信息:发布机构、过期时间和序列号
所有者信息
所有者公钥
数字证书由CA(certificate authority)颁发,其作用是保证数字证书里的公钥确实是这个证书的所有者。但数字证书同样是可以伪造的,如何保证这一点呢?这时就需要引入数字签名。
要点3:数字签名
客户端验证CA签名过程如下:
这个过程的第二步,CA的公钥从何而来呢?答案是从操作系统中来。CA的数量并不多,因而可以内置在操作系统中。事实上操作系统中存储的是CA的根证书,根证书中会有CA的公钥,以https协议通信时,Server端会发送证书链给Client端。即CA也分层级,下一级CA的真实性由上一级CA来保证(使用上一级CA的私钥签名)。而根CA的真实性由谁保证?答案显然是操作系统。Windows发行版会内置世界上几个大的根证书机构的证书,即使用正版windows,理论上就已经获得了可信的根证书。
此时Client端、Server端、CA之间的关系如下:
Client信任CA,CA信任Server(不然就不颁发证书了),使得Client信任Server,此时信任链形成。
最后还有一个问题,如果黑客只是想捣乱,把每次Client端发来的数据修改一遍再转发给Server端,或是把Server端发来的数据修改一遍再回给Client端,该如何处理?
解决的方法跟数字签名很像,即对发送的信息内容做hash得到hash值,然后将信息内容和hash值一起加密发送。对端在解密后,对收到的信息内容以同样的hash算法做hash计算,如果得到的hash值相同,则数据未被修改。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。