zoukankan      html  css  js  c++  java
  • PKI相关知识简述

    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会用自己的私钥加密这个证书的特征码,形成数字签名;放在证书最后;
    收到证书之后的检验流程:

    1. 检查证书的签发者CA;
    2. 使用CA的公钥解密CA的签名,得出特征码;如果能解密则说明证书的来源可靠;
    3. 使用同样的算法计算出CA的特征码,和解压出来的特征码对比,如果一致表示证书的完整性可靠;
    4. 检查证书有效期;
    5. 验证主体名称是否为对方的名称;
    6. 检查证书是否被吊销;
    7. 查看证书是否过期;

    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:

    1. 支持的协议版本,比如TLS 1.2;
    2. 客户端生成一个随机数,稍后用于生成“会话密钥”
    3. 支持的加密算法,比如对称加密算法AES、3DES、非对称加密算法RSA;
    4. 支持的压缩算法;

    第二阶段:ServerHello

    1. 确认加密通信协议版本,比如TLS 1.2;
    2. 服务器端生成一个随机数,稍后用于生成“会话密钥”
    3. 确认使用的加密方法;
    4. 发送服务器证书;
    5. 索要客户端证书(如果还要确认客户端身份,就要求客户端发送证书,一般服务器端都不验证);

    第三阶段:

    1. 验证服务器证书,在确认无误后使用信任CA的公钥解密数字证书获得Server的公钥;
    2. 发送以下信息给服务器端:
      (1). 生成一个新的46字节随机数:(称为预备主密钥Pre-master secret),使用Server的公钥加密预备主密钥发给Server。
      (2). 编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送;
      (3). 客户端握手结束通知;

    第四阶段:

    1. 收到客户端发来的Pre-master secret后,客户端和服务器都具有了(客户端随机数+服务端随机数+预备主密钥),它们两者都根据约定的加密方法,使用这三个随机数生成对称密钥——主密钥(也称为对话密钥session key),用来加密接下来的整个对话过程。计算生成本次会话所有到的“会话密钥”;
    2. 向客户端发送如下信息:
      (1). 编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送;
      (2). 服务端握手结束通知;

    注意:

    服务器和客户端通信,服务器把数字证书发给客户端,最关键的一点是客户端要保证证书的有效性,通过查看证书状态并去CA的吊销列表查看服务器的证书是否被吊销。只有服务器的证书可用了,才保证了第一环节的安全性。
    
    可以看出,使用SSL比前文介绍的“数字签名+加密”简便多了,将身份验证和密钥生成在会话的开始就完成了,而不需要每次的数据传输过程中都进行,这就是https等使用ssl加密机制的握手通信过程。
    
    例如:访问的是https://www.taobao.com服务器,那客户端收到的服务器发来的证书中的主体名称要与服访问的www.taobao.com名称必须要保持一致,否则验证不通过,拒绝访问;因此,服务器证书中的主体名称必须与服务器名称保持一致;
    
  • 相关阅读:
    009-Python-面向对象
    008-Python-模块
    007-Python函数-装饰器
    006-Python函数
    005-Python字典
    003-python列表
    PyCharm之python书写规范--消去提示波浪线
    001-python基础
    Java基础总结(一)
    High ASCII字符从bat文件到dos控制台的转化问题
  • 原文地址:https://www.cnblogs.com/jzbgltb/p/9967032.html
Copyright © 2011-2022 走看看