使用RSA算法的SSL握手图以下:html
Client端请求https链接,发送client_random和支持的加密方式算法
返回证书和server_random(通过Server端私钥加密)windows
验证证书,使用证书中公钥加密permaster_secret(permaster_secret是一个随机数)dom
Client端发送permaster_sercret至Server端,server端经过私钥解密加密
Client端和Server端分别根据client_random、server_random和permaster_secret生成master secretspa
防止攻击者拦截Client端请求,假装成服务端。即防止出现以下状况:操作系统
由于私钥和公钥谁都能生成,于是Client端没法确认公钥是否属于Server端。数字证书则能够解决这个问题。server
证书包含的主要内容:htm
证书信息:发布机构、过时时间和序列号blog
全部者信息
全部者公钥
数字证书由CA(certificate authority)颁发,其做用是保证数字证书里的公钥确实是这个证书的全部者。但数字证书一样是能够伪造的,如何保证这一点呢?这时就须要引入数字签名。
客户端验证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值相同,则数据未被修改。