1. 公钥泄露导致中间人攻击
有A、B、C三个人,如果C把自己的公钥提供给了AB双方,C伪装成B,让A认为C就B,这样A就把自己的公钥发送给C,C再伪装成A,让B认为C就A,B就把自己的公钥也发送给了C;这样AB双方的每次通信,都是经过中间的C看过一遍了,这叫做中间人攻击;因为AB双方无法相互确认对方的身份;
中间人攻击是因为公钥获取环节出了问题,为了解决这一问题,就诞生了CA,通过CA实现可靠的获取对方的公钥;
2. 什么是CA
CA就是双方都认可的第三方可信机构;
A把自己的公钥提请给CA,由CA对这个公钥做一些特殊防伪技术处理后即称为证书,再发给A;以后任何人与A通信,A就把着这个经过CA加工过的公钥发给对方;
如B向A要公钥时,A就把证书(公钥)发给B,B收到后,会对证书进行验证(B本地要事先有CA的公钥),如果验证通过则代表对方是A;
证书里包括了拥有者的公钥,还包括拥有者各种信息;此时C要想冒充伪装成A或B,则不能成功,所以说找到信任的CA是重要的;
3. 如何验证CA
证书中包括:拥有者名称、公钥、证书有效期,最重要的是CA会用自己的私钥加密这个证书的特征码,形成数字签名;放在证书最后;
收到证书之后的检验流程:
- 检查证书的签发者CA;
- 使用CA的公钥解密CA的签名,得出特征码;如果能解密则说明证书的来源可靠;
- 使用同样的算法计算出CA的特征码,和解压出来的特征码对比,如果一致表示证书的完整性可靠;
- 检查证书有效期;
- 验证主体名称是否为对方的名称;
- 检查证书是否被吊销;
- 查看证书是否过期;
4. 如何可靠地获取CA
CA为了让别人能验证它所发的证书是CA所发的,所以CA把自己的公钥提请给每一个信任它的人;为了使得整个法则是完整的,所以CA就先给自己签发一个证书(包括CA的信息和CA的公钥);因此,只有拿到CA的证书才能获得CA的公钥,才能解密CA的签名,才能验证CA发给它人的证书;
因为数据在网络传输的过程中存在风险,所以只有当面交易CA的证书才可靠;
CA在全球有很多从属关系,是有信任关系可传递的;有根CA,下面有很多派出CA信任关系可传递;
CA的证书通过非常可靠的手段给了微软,微软在操作系统上直接安装了证书;而在linux系统没有内置证书,只能手动获得;
CA是让通信双方能够可靠的获取到对方公钥的一种基础保证机制;如果有人私钥丢失,可以向CA申请吊销证书作废;
5. PKI:Public Key Infrastructure
公钥基础设施:包括四部分
签证机构:CA
注册机构:RA
证书吊销列表:CRL
证书存储库:CR
5. SSL和TLS
SSL是网警公司发布的,属于私有协议;TLS是IETF发布的,属于公有协议;SSL和TLS一般统称为SSL协议;有多种程序可以实现这两种协议,其中OpenSSL是著名的开源实现;
6. SSL Handshake
第一阶段:ClientHello:
- 支持的协议版本,比如TLS 1.2;
- 客户端生成一个随机数,稍后用于生成“会话密钥”
- 支持的加密算法,比如对称加密算法AES、3DES、非对称加密算法RSA;
- 支持的压缩算法;
第二阶段:ServerHello
- 确认加密通信协议版本,比如TLS 1.2;
- 服务器端生成一个随机数,稍后用于生成“会话密钥”
- 确认使用的加密方法;
- 发送服务器证书;
- 索要客户端证书(如果还要确认客户端身份,就要求客户端发送证书,一般服务器端都不验证);
第三阶段:
- 验证服务器证书,在确认无误后使用信任CA的公钥解密数字证书获得Server的公钥;
- 发送以下信息给服务器端:
(1). 生成一个新的46字节随机数:(称为预备主密钥Pre-master secret),使用Server的公钥加密预备主密钥发给Server。
(2). 编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送;
(3). 客户端握手结束通知;
第四阶段:
- 收到客户端发来的Pre-master secret后,客户端和服务器都具有了(客户端随机数+服务端随机数+预备主密钥),它们两者都根据约定的加密方法,使用这三个随机数生成对称密钥——主密钥(也称为对话密钥session key),用来加密接下来的整个对话过程。计算生成本次会话所有到的“会话密钥”;
- 向客户端发送如下信息:
(1). 编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送;
(2). 服务端握手结束通知;
注意:
服务器和客户端通信,服务器把数字证书发给客户端,最关键的一点是客户端要保证证书的有效性,通过查看证书状态并去CA的吊销列表查看服务器的证书是否被吊销。只有服务器的证书可用了,才保证了第一环节的安全性。
可以看出,使用SSL比前文介绍的“数字签名+加密”简便多了,将身份验证和密钥生成在会话的开始就完成了,而不需要每次的数据传输过程中都进行,这就是https等使用ssl加密机制的握手通信过程。
例如:访问的是https://www.taobao.com服务器,那客户端收到的服务器发来的证书中的主体名称要与服访问的www.taobao.com名称必须要保持一致,否则验证不通过,拒绝访问;因此,服务器证书中的主体名称必须与服务器名称保持一致;