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名称必须要保持一致,否则验证不通过,拒绝访问;因此,服务器证书中的主体名称必须与服务器名称保持一致;

PKI相关知识简述的更多相关文章

  1. 加密解密(7)*PKI基础知识(完整)

    PKI 基础知识 摘要 本白皮书介绍了加密和公钥基本结构(PKI)的概念和使用 Microsoft Windows 2000 Server 操作系统中的证书服务的基础知识.如果您还不熟悉加密和公钥技术 ...

  2. 微信小程序必知相关知识

    微信小程序必知相关知识 1 请谈谈微信小程序主要目录和文件的作用? project.config.json 项目配置文件,用得最多的就是配置是否开启https校验: App.js 设置一些全局的基础数 ...

  3. 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸

    类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...

  4. 移动WEB像素相关知识

    了解移动web像素的知识,主要是为了切图时心中有数.本文主要围绕一个问题:怎样根据设备厂商提供的屏幕尺寸和物理像素得到我们切图需要的逻辑像素?围绕这个问题以iphone5为例讲解涉及到的web像素相关 ...

  5. listener监听器的相关知识

    从别人的博客上我学习了listener的相关知识现在分享给大家 1.概念: 监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上 ...

  6. UIViewController相关知识

    title: UIViewController 相关知识date: 2015-12-13 11:50categories: IOS tags: UIViewController 小小程序猿我的博客:h ...

  7. 【转】java NIO 相关知识

    原文地址:http://www.iteye.com/magazines/132-Java-NIO Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的 ...

  8. NSString使用stringWithFormat拼接的相关知识

    NSString使用stringWithFormat拼接的相关知识 保留2位小数点 1 2 3 4 //.2代表小数点后面保留2位(2代表保留的数量) NSString *string = [NSSt ...

  9. iOS网络相关知识总结

    iOS网络相关知识总结 1.关于请求NSURLRequest? 我们经常讲的GET/POST/PUT等请求是指我们要向服务器发出的NSMutableURLRequest的类型; 我们可以设置Reque ...

随机推荐

  1. ubuntu14安装docker-ce

    先卸载旧的docker sudo apt-get remove docker docker-engine docker.io docker-ce 通过HTTPS使用存储库(repository) su ...

  2. Java 泛型 四 基本用法与类型擦除

    简介 Java 在 1.5 引入了泛型机制,泛型本质是参数化类型,也就是说变量的类型是一个参数,在使用时再指定为具体类型.泛型可以用于类.接口.方法,通过使用泛型可以使代码更简单.安全.然而 Java ...

  3. 昆石VOS3000_2.1.2.4完整安装包及安装脚本

    安装包下载地址:http://www.51voip.org/post/56.html 安装教程: 上传安装包 ·给整个目录授权 chmod 777 /root/vosintsall `核实 关闭sel ...

  4. 云服务器装teamviewer

    [int32] EulaAccepted = 1 [int32] EulaAcceptedRevision = 6

  5. [Swift]圆周率π

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  6. java程序死锁,3种方式快速找到死锁代码

    java程序中出现死锁问题,如果不了解排查方法,是束手无策的,今天咱们用三种方法找到死锁问题. 运行下面代码 package com.jvm.visualvm; /** * <a href=&q ...

  7. JavaScript--userAgent

    userAgent 返回用户代理头的字符串表示(就是包括浏览器版本信息等的字符串) 语法 navigator.userAgent 几种浏览的user_agent.,像360的兼容模式用的是IE.极速模 ...

  8. C#命名空间 using的用法

    using的用法: 1. using指令:引入命名空间 这是最常见的用法,例如: using System; using Namespace1.SubNameSpace; 2. using stati ...

  9. 递推DP HDOJ 5389 Zero Escape

    题目传送门 /* 题意:把N个数分成两组,一组加起来是A,一组加起来是B,1<=A,B<=9,也可以全分到同一组.其中加是按照他给的规则加,就是一位一位加,超过一位数了再拆分成一位一位加. ...

  10. 最大流增广路(KM算法) HDOJ 1533 Going Home

    题目传送门 /* 最小费用流:KM算法是求最大流,只要w = -w就可以了,很经典的方法 */ #include <cstdio> #include <cmath> #incl ...