数字证书

看过很多次数字证书的知识,总是看了忘,忘了再看,看了又忘,是时候好好总结一下了。
感谢敏捷的水大哥,讲得很生动很透彻。但我觉得也有不足的地方,那就是对指纹,指纹算法,签名,签名算法这几个概念没有梳理得很透彻。

签名与加密
在这里,首先要说一下签名和加密的知识。这里主要解释一下签名,签名就是在信息的后面再加上一段内容,可以证明信息没有被修改过,怎么样可以达到这个效果呢?一般是对信息做一个hash计算得到一个hash值,注意,这个过程是不可逆的,也就是说无法通过hash值得出原来的信息内容。在把信息发送出去时,把这个hash值加密后做为一个签名和信息一起发出去。 接收方在收到信息后,会重新计算信息的hash值,并和信息所附带的hash值(解密后)进行对比,如果一致,就说明信息的内容没有被修改过,因为这里hash计算可以保证不同的内容一定会得到不同的hash值,所以只要内容一被修改,根据信息内容计算的hash值就会变化。一般来说,我们的项目里面就是这么做的。

先让我们来考虑一个问题?假如不怀好意的人修改信息内容的同时也修改hash值,从而让它们可以相匹配。为了防止这种情况发生,我们可以做到的就是为我们的签名做升级,那就是对签名加密,然后连同我们的信息一起发送。

中间人攻击
先来看看中间人攻击的概念。假如刘冬和黄丽之间要互换小情书,总要有一个信使,那就是张叔叔。这个人可能就是中间人,对所加密对内容进行攻击。下面来看看步骤:

  1. 张叔叔自己生成一个公私钥,和冬冬以及丽丽交换
  2. 张叔叔冒充丽丽把自己的公钥发给冬冬
  3. 冬冬用张叔叔的公钥对信件加密
  4. 张叔叔用自己的私钥解密就可以看到冬冬给丽丽的邮件
  5. 张叔叔冒充冬冬把自己的公钥发给丽丽
  6. 丽丽用王叔叔的公钥对信件加密
  7. 张叔叔用自己的私钥解密就可以看到丽丽给冬冬内容

数字证书
那么张叔叔要让冬冬相信他给的公钥就是丽丽的公钥,那么他可以开一个证明,比如找权威机构“小陈”给开个介绍信,介绍信上给加个公章。那么这里的介绍信就是数字证书, 公章就是数字签名, 那么”小陈”就是颁发证书的机构CA(Certificate Authority),也就是证书授权中心。

CA: CA 是“Certificate Authority”的缩写,也叫“证书授权中心”。
它是负责管理和签发证书的第三方机构,就好比例子里面的“小陈”。一般来说,CA 必须是大家都信任的、认可的。因此它必须具有足够的权威性。只有冬冬和丽丽都信任的人才能来证明。

CA证书: CA 证书,就是CA颁发的证书。

证书之间的信任关系: 用一个证书来证明另一个证书是真实可信。

证书信任链: 证书之间的信任关系,是可以嵌套的。比如,A 信任 A1,A1 信任 A2,A2 信任 A3……,这就是证书的信任链。只要你信任链上的第一个证书,那后续的证书,都是可以信任的。

根证书(Root Certificate): 下图,处于最顶上的树根位置的那个证书,就是“根证书”。除了根证书,其它证书都要依靠上一级的证书来证明自己。那谁来证明“根证书”?根证书自己证明自己,这时候我们用户就需要自己选择是否相信某个根证书。根证书是整个证书体系安全的根本。如果某个证书体系中,根证书不再可信了,那么所有被根证书所信任的其它证书,也就不再可信了。

这里写图片描述

证书内容

我们来看看国内百度的证书,点击绿色浏览器绿色的锁就可以看到证书。
这里写图片描述
然后我们需要解释一这个证书的内容:

1 . 组织 (证书的发布机构)
指出是什么机构发布的这个证书,也就是指明这个证书是哪个公司创建的(只是创建证书,不是指证书的使用者)。对于上面的这个证书来说,就是指”GlobalSign nv-sa”这个机构。

2 . Public key (公钥)
首先,我们先给出自己论断,公钥就是用来对消息进行加密的,但是公钥在数字证书里面充当什么角色呢?这里的公钥通俗一点说留给冬冬和丽丽之间通信用的,跟我们的数字证书认证关联不大。
这里写图片描述

3 . Thumbprint, Thumbprint algorithm (指纹以及指纹算法)
这个是用来保证证书的完整性的,也就是说确保证书没有被修改过,其原理就是在发布证书时,发布者根据指纹算法(一个hash算法)计算整个证书的hash值(指纹)并和证书放在一起,这个hash值就是我们在上面所说的hash串。使用者在打开证书时,自己也根据指纹算法计算一下证书的hash值(指纹),如果两者一致,就说明证书没有被修改过,因为证书的内容被修改后,根据证书的内容计算的出的hash值(指纹)是会变化的。 注意,这个指纹会使用CA这个证书机构的私钥用签名算法(Signature algorithm)加密后和证书放在一起,只有用CA的公钥才能解开这个签名。

所以在这里,要非常明确指纹和指纹算法的区别。指纹算法是指一种hash的方法,是一种加密的算法(我们一般使用MD5或者SHA1,而且一般没有秘钥,所以是不可逆的。指纹是指数字证书内容的一个摘要。这两样东西合起来的效果是保证证书内容不被修改。

数字证书保证身份认证的过程
首先是申请证书:
1. baidu.com 向GlobalSign nv-sa) 申请证书
2. GlobalSign nv-sa 生成一对公钥A(上文所说的Public key,给客户用的)和私钥B(留给baidu)。
3. GlobalSign nv-sa有自己的公钥C和私钥D
4. GlobalSign nv-sa 把Issuer, 公钥A, Subject(一般是网站的域名),Valid from,Valid to等信息以明文的形式写到证书里面,然后用一个指纹算法(SHA1或者MD5)计算出这些数字证书内容的一个指纹(摘要),并把指纹和指纹算法用自己的私钥D进行加密,然后和证书的内容一起发给baidu.com

用户使用证书
1. 用户访问baidu.com 这个网站
2. baidu.com 把证书发给用户
3. 浏览器读取证书, 浏览器发现证书机构是GlobalSign nv-sa,然后会在操作系统中受信任的发布机构的证书中去找GlobalSign nv-sa的证书,如果找不到,那说明证书的发布机构是个假的,或者不是被权威机构认证的,证书可能有问题,程序会给出一个错误信息
4. 如果在系统中找到了GlobalSign nv-sa的证书,那么应用程序就会从证书中取出GlobalSign nv-sa的公钥C,然后对baidu.com公司的证书里面的指纹和指纹算法用这个公钥C进行解密,然后使用这个指纹算法计算baidu.com证书的指纹,将这个计算的指纹与放在证书中的指纹对比,如果一致,说明baidu.com的证书肯定没有被修改过并且证书是GlobalSign nv-sa发布的,证书中的公钥肯定是baidu.com的公钥A, 然后我们就可以用这个公钥A和baidu.com进行通信,因为只有baidu.com 有私钥B, 所以只有baidu.com才能解开信息。

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页