数字证书浅析以及如何验证证书的可信/合法性

 转自http://www.cnblogs.com/hyddd/archive/2009/01/07/1371292.html

  最近看会Session hijack的东西,劫持现在已经实现,yahoo等一些没有用Https协议的邮箱被成功地劫持了(迟下发文章),由于对Https不熟悉,所以看了一下为什么Https的会话不能劫持。

  本文主要介绍的SSL中的涉及到的"数字证书"这个东东。

一.什么是数字证书?

  数字证书是一种权威性的电子文档。它提供了一种在Internet上验证您身份的方式,其作用类似于司机的驾驶执照或日常生活中的身份证。它是由一个由权威机构----CA证书授权(Certificate Authority)中心发行的,人们可以在互联网交往中用它来识别对方的身份。当然在数字证书认证的过程中,证书认证中心(CA)作为权威的、公正的、 可信赖的第三方,其作用是至关重要的。

  Ok,知道什么是数字证书后,先看看它长的什么样吧:>,文件缩略图如下:

  

  双击后打开如下:

  

二.CA认证机构/CA认证中心

  1.CA认证中心是什么?

  CA认证中心是负责签发管理认证数字证书的机构,是基于国际互联网平台建立的一个公正,权威,可信赖的第三方组织机构。

  2.世界上的CA认证中心不止一间,那他们之间的关系是什么(CA认证中心之间的关系)?

  嗯,回答这个问题之前可以先看看下图:

  

  从图中可以看到,CA认证中心之间是一个树状结构,根CA认证中心可以授权多个二级的CA认证中心,同理二级CA认证中心也可以授权多个3级的CA认证中心...如果你是数字证书申请人(比如说:交通银行),你可以向根CA认证中心,或者二级,三级的CA认证中心申请数字证书,这是没有限制的,当你成功申请后,你就称为了数字证书所有人。值得注意的是,根CA认证中心是有多个的,也就是说会有多棵这样的结构树。FireFox里面默认记录了一些根CA认证机构的信息,如图:

  

  看到这里,肯定有人会问,如果有现在新的根CA认证机构成立,FireFox肯定是没有这个CA认证中心的信息的(这些信息是用来验证子CA认证机构的,很重要,后面来会讲到),那怎么办呢?嗯~~确实,如果今天2009-1-8日突然在哪里成立一个新的CA认证中心,我FireFox里面肯定没有他的信息的!但解决办法还是有的,看上图,可以找到一个"Import"按钮,当我们遇到这样的倒霉事时,只有自己去下载并导入根CA认证中心信息了(其实这样做是不太安全的!),或者期望FireFox的升级会升级这些信息,但这个我是不确定的。

  3.为什么CA认证中心是权威的?

  其实搞清楚这个问题后,你也会真正了解“CA认证中心是如何授权子CA认证中心的?”,“为什么伪造的数字证书是无效的”,“为什么数字证书是一种权威性的电子文档”等等一系列的问题。并且SSL可以说是建立在CA认证中心的权威,公正,可信赖的基础上的,如果CA认证中心的信息可以被伪造的,那么SSL的一切就完了......

  首先,我们先来看看,在FireFox里记录的CA认证中心的信息到底是什么东西??见上图,单击某项,Export导出....你会看到导出的东西很面熟,原来就是数字证书!!

  实际上每个CA认证中心/数字证书所有人,他们都有一个数字证书,和属于自己的RSA公钥和密钥,这些是他们的父CA认证中心给他们颁发的,这里先大概解释一下RSA,RSA是一种非对称加密的算法,它的公钥和密钥是配对的,如果用公钥加密,用私钥解密就可以得到明文;如果用私钥加密,用公钥解密也可以得到原来的明文,这由RSA特性决定,他效果可以用下图概括:

  

  对于私钥:CA认证中心/数字证书所有人自己保存,不公开。

  对于公钥:CA认证中心/数字证书所有人会把公钥存在他的CA认证中心的数字证书内。

  (1).首先,CA认证中心/数字证书所有人,它在网络上的表现形式只能是一张数字证书!所以我们可以把某张数字证书等价于某个CA认证中心/数字证书所有人。这样的话,验证数字证书的合法性就可以确定CA认证中心/数字证书所有人是否是合法的!!!

  (2).数字证书使用数字签名作验证!这里简单说明一下数字签名的过程:你从Firefox/IE导出的数字证书包含3个部分:证书内容(F),加密算法(A),F加密密文(F‘) (数字证书结构会在第三部分详细介绍),在这里,A不是一个算法,而是两个,所以密文F‘是F两次加密后的结果。

  首先,F会被散列算法SHA1计算出hash值h1(称为128bit的摘要),然后h1会被发布这个数字签名的CA认证机构的用私钥进行RSA加密,注意:是发布这个数字签名的CA认证机构,如果现在被加密的数字证书是属于二级CA认证机构的,那么用来加密这个证书的私钥是根CA认证机构的私钥!!RAS加密完后,就形成密文F‘。

  当你要验证这个数字证书可信/合法性时,你需要找到你的上一层CA认证中心的数字证书,并且从中获取公钥,把数据证书中的密文F‘进行RSA解密,如果得出的值h2和h1比较(h1可以立即用数据证书中的F现场算出来),如果相等,则认为证书是可信的,合法的!由于你是不可能知道上一层CA认证中心的私钥,所以你无法伪造一个可以用上一层CA认证中心公钥解密的数字证书!!

  详细流程图如下:

  

   由于一个数字证书基于上层的数字证书作验证,那上层的数字证书又是否合法呢??这就会出现一直递归上去的现象,事实也是这样的,验证一个证书是否合法,需要验证到他的最顶层的根证书是否合法!从其他的文章弄来的这幅图很好地表达了这个思想:

   

  这里肯定又有人会问,那么最顶层的CA认证中心如何证明它的合法性呢?.......呵~这就是为什么FireFox要预先把一些最顶层(这里的"最顶层"和"根"是同一个概念)的CA认证中心的证书加入到权威信任列表中了,因为,最顶层CA认证中心没有办法证明,所以,最顶层的CA认证中心是总是受信任的!!而事实上,最顶层的CA认证中心在是世界上也是为数不多的。这里大家应该了解为什么我刚才说自己导入根CA证书是不太安全的,因为你无法验证。

三.数字证书的组成

  可以先看看我从Firefox的证书截图:

  

  1.Certificate(证书):

   (1).Common Name(证书所有人姓名,简称CN,其实就是证书的名字,如第一幅图看到的:ABA.ECOMRoot....)

   (2).Version(版本,现在一般是V3了)

   (3).Issuer(发证机关)

   (4).Validity(有效日期)

   (5).Subject(证书信息,你会发现它和Issuer里面的内容是一样的)

   (6).Subject‘s Public Key Info(证书所有人公钥,刚才所说的公钥就是这个!)

   (7).Extension(扩展信息)

   (8).Certificate Signature Algorithm(公钥加密算法)、

   以上这几项就是上面所说的证书内容(F)。 

  2.Certificate Signature Algorithm:

    这是描述证书的加密算法,就是上所说的加密算法(A),看它的Fireld Value,一般会写:PKCS #1 SHA-1 With RSA Encryption

  3.Certificate Signature Value:

   这记录的是证书被加密后的结果,相当于上面说讲的F‘。

四.数字证书的验证

  要回答数字证书是如何验证的,首先要知道数字证书是要验证些什么东西:>,数字证书的验证,上面已经讲了一些,这做一个总结:

  1.可信性验证/合法性验证:这个刚才已经说的很明白了吧:>

  2.完整性验证:在验证可信性的过程中,h1和h2的比较,其实已经顺便验证其完整性了。

  3.有效性验证:比如验证它的Vilidity值,看是否过期...

  先写这么多,其他以后补充!并且可能有些地方写得会比较乱,这个我稍后会改正:>~欢迎拍砖!

五.参考资料:

1.http://baike.baidu.com/view/204415.htm

2.http://finance.sina.com.cn/money/roll/20080401/00404692291.shtml

3.http://blog.csdn.net/sfdev/archive/2008/03/12/2174305.aspx

4.http://man.chinaunix.net/develop/rfc/RFC2313.txt

5.http://www.zhlmmc.com/diary/14554

时间: 2024-12-13 17:23:56

数字证书浅析以及如何验证证书的可信/合法性的相关文章

加密解密(2)*客户端,服务器,CA(Certificate Authority),公钥,私钥,证书,签名,验证

加密解密(2)*客户端,服务器,CA(Certificate Authority),公钥,私钥,证书,签名,验证 各角色比喻 客户端:通常为请求方,要验证服务器的身份. 服务器:通常为响应方,有时也要验证客户端的身份. C     A :全拼为Certificate Authority,就是第三方验证机构.客户端与服务器只有在CA申请了证书之后才能证明身份合法. 加   密 :客户端或服务器把数据放在箱子里,然后用钥匙(公钥或私钥)将箱子锁上,再放到网络上传输,只有有用钥匙的人才能打开箱子. 根

Nodejs后台发送https请求验证证书

项目中用到了很多第三方的库,这些库在生产环境使用的时候的都会发送https的请求出去,但是再发送请求的时候nodejs会验证证书,没有证书的时候都会无法通过,这里可以修改代码进行修改这个问题, 1.在发送https请求的时候添加如下代码: rejectUnauthorized: false, 如图,某个库: 2.还有就是全局设置. 启动程序的时候设置: process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

多域名SSL,comodo多域名SSL证书,、通配符SSL证书

本文由SSL盾小编整理发布,更对证书详情[www.ssldun.com]SSL证书有多种分类,按照域名数量来说可分成单域名SSL证书.多域名SSL证书和通配符SSL证书等.对于有多个网站的用户来说,申请多域名证书是一个不错的选择. SSL服务器证书是用户遵守SSL协议,由数字证书颁发机构CA在确认用户信息无误后进行颁发的一种数字证书SSL服务器证书拥有服务器身份验证和数据传输加密功能. SSL服务器证书通过在客户的浏览器和服务器之间建立一条安装通道,保障客户浏览安全.多域名SSL服务器证书是指一

SSL证书是什么?SSL证书怎么申请?

一.SSL证书是什么 SSL证书是数字证书的一种,由权威数字证书机构(CA)验证网站身份后颁发,可实现浏览器和网站服务器数据传输加密.网站安装SSL证书后会在浏览器显示安全锁标志,数据传输协议从http(传统协议) 升级为 https(加密协议). 二.SSL证书的作用 (1)浏览器绿色安全标志 各大主流浏览器的重视,对没有安装SSL证书的网站提示"不安全",安装了SSL证书的网站浏览器会显示绿色安全标志,表示连接安全. (2)网站数据加密传输 安装SSL证书之后,网站会从升级为 ht

使用PowerShell 遍历证书信息,查找对应证书

今天再来更新一篇博客,同样也是关于PowerShell的应用,熟练使用PowerShell对于平时的工作很多时候能够起到意想不到的效果,很多事情换个思路往往会发现能够少走很多弯路,今天介绍的其实主要是PowerShell在证书方面的一些简单应用,对应的也是平时工作中用到的一个场景,在我们的生产环境中有很多很多张证书,有一些自签名的,也有很多从第三方公司申请的公网证书,这些证书平时我们都备份在一个公共的文件夹中,以备不时之需,久而久之,文件夹里存放的证书就已经不下百张了,而且各种文件夹穿插着放一下

证书替换之连接服务器证书替换

当我们安装完连接服务器时,会默认分配一个VMware自带的证书,而这种证书在Web控制台登录的话,也是很尴尬的,看着总是让人那么不舒服,也许在某些企业会提出替换证书的需求. 根据上述情况,结合工作需要,今日我们将对连接服务器的证书替换进行简单的概述.希望能在工作之余,为大家起到参考学习的价值. 证书服务器安装,在AD服务器点添加角色和功能向导,在开始之前页面,点击下一步 在安装类型页面,选择基于角色或者基于功能的安装,并点击下一步 在服务器选择页面,选择从服务器池中选择服务器 在服务器角色选择A

申请HTTPS证书多少钱?https证书便宜吗?

怎么申请https证书?申请https证书是怎么收费的?https证书需要多少钱?https证书的价格其实与证书品牌以及SSL证书验证方式以及域名数量有关系,接下来我们具体的看看https证书申请的费用. https证书申请费用和品牌有关 1.不同的SSL证书品牌价格不同,比如说:国际知名品牌Symantec.Geotrust.Comodo.Thawte以及RapidSSL, 其中Symantec.Geotrust证书价格最贵,最便宜的都要上千元, 而Comodo.Thawte以及RapidSS

便宜SSL证书怎么申请?SSL证书多少钱?

网站加了SSL证书就等于给网站做了加密处理,有效防止dns劫持域名,以及防止网站重要信息被窃取等很多实用的功能,即便100多元的证书也能实现这些,同时浏览器提示安全,网址变成https,浏览器地址栏会显示绿色小锁.ssl证书多少钱 ?这是很多人比较关心的一个问题.最便宜的SSL证书当然是免费SSL证书,但是免费的SSL证书不稳定,比较容易掉.SSL证书分根据品牌,域名数量,类型的不一样,价格也是不一样的,从几百到几万元都是不等的SSL证书的种类有哪些?DV型SSL证书:这种证书只是显示一个绿色小

继续坑坑坑(关于购买的证书 若不添加中级证书 安卓出现无法发起请求)

前言:  作为一个运维人员不背锅,谁背呢! 正文: 虽然也是使用小程序发现的,但是之前在app开发组也发现了这个问题,因为我们购买的是GlobalSign的证书,有一个中级证书的概论,之前直接把签名的证书 和私钥 放nginx  和阿里云的cdn  一直觉得没问题也就没管,但是安卓手机就不一样了~ 现象为手机无法请求数据(数据包都没有发起请求),使用浏览器直接访问接口 现象为 弹出证书不信任..这个问题是因为购买的证书 一定要在crt 后边追加中级证书 (值得注意的是 中级证书放下边 自己的放上