密码技术(十)之证书

证书

  ——为公钥上数字签名

什么是证书

 要开车得先考驾照,驾照上面有本人的照片、姓名、出生日期等个人信息,以及有效期,及准驾车辆等信息。
公钥证书(Public-Key Certificate,PKC)其实和驾照很相似,里面记有姓名、组织、邮箱地址等个人信息,以及属于此人的公钥,并由认证机构(Certification Authority、Certifying Authority,CA)施加数字签名。只要看到公钥证书,我们就可以知道认证机构认定该公钥的确属于此人。公钥证书也称为证书(certificate)。

证书应用场景

Alice利用认证机构Trent向Bob发送密文的示例.png

 认证机构必须是可信的,对于“可信的第三方”,会使用Trent这个名词。

  1. Bob生成密钥对
  2. Bob在认证机构Trent注册资金的公钥
  3. 认证机构Trent用自己的私钥对Bob的公钥施加数字签名并生成证书
  4. Alice得到带有认证机构Trent的数字签名的Bob的公钥(证书)
  5. Alice使用认证机构Trent的公钥验证数字签名,确认Bob的公钥的合法性
  6. Alice用Bob的公钥加密消息并发送给Bob
  7. Bob用自己的私钥解密密文得到哦Alice的消息

公钥基础设施(PKI)

 公钥基础设施(Public-Key Infrastucture)是为了能够更有效地运用公钥而制定的一系列的规范和规格的总称。公钥基础设施一般简称PKI。
 PKI只是一个总称,而并非指某一个单独的规范或规格。例如,RSA公司所制定的PKCS(Public-Key Ctyptography Standards,公钥密码标准)系列规范也是PKI的一种,而互联网规格RFC(Request for Comments)中也有很多与PKI相关的文档。在开发PKI程序时所使用的由各个公司公司编写的API和规格设计书也可以算是PKI的相关规格。
 因此,根据具体所采用的的规格,PKI也会有很多变种,这也是很多人难以整体理解PKI的原因之一。

PKI的组成要素

 PKI的组成要素主要有以下3个:

  • 用户-使用PKI的人
  • 认证机构-颁布证书的人
  • 仓库-保存证书的数据库
     由于PKI中用户和认证机构不仅限于“人”(也可能是计算机),因此我们可以给他们命名为实体。实体就是进行证书和密钥相关处理的行为主体。
    PKI的组成要素.png

用户

  用户就是像Alice、Bob这样使用PKI的人,用户包括两种:一种是系统是用PKI注册自己的公钥的人,另一种是系统使用已注册的公钥的人。一般两种用户所需要进行的操作。
[注册公钥的用户所进行的操作]

  • 生成密钥对(也可以由认证机构生成)
  • 在认证机构注册公钥
  • 向认证机构注册公钥
  • 向认证机构申请证书
  • 根据需要申请作废已注册的公钥
  • 解密接收到的密文
  • 对消息进行数字签名

[使用已注册公钥的用户所进行的操作]

  • 将消息加密后发送给接收者
  • 验证数字签名

认证机构(CA)

 认证机构(Certification Authority,CA)是对证书进行管理的人(Trent)。认证机构具体所进行的操作如下:

  • 生成密钥对(也可由用户生成)
  • 在注册公钥时对本人身份进行认证
  • 生成并颁发证书
  • 作废证书
     认证机构的工作中,公钥注册和本人身份证这一部分可以由注册机构来分担,这样一来,认证机构就可以将经理集中到颁发证书上,从而减轻了认证机构的负担,不过,引入注册机构也有弊端,比如说认证机构需要对注册机构本身进行认证,而且随着组成要素的增加,沟通过程也会变得复杂,容易遭受攻击的点也会增加。

仓库

 仓库是一个保存证书的数据库,PKI用户在需要的时候可以从中获取证书,它的作用优点像打电话时使用的电话本。Alice获取Bob的证书时,就可以使用仓库。仓库也叫作证书目录

认证机构的工作

生成密钥对

  生成密钥对有两种方式:一种是由PKI用户自行生成,一种是由认证机构来生成。在认证机构生成密钥对的情况下,认证机构需要将私钥发送给用户。

注册证书

 在用户自行生成密钥对的情况下,用户会请求认证机构生成证书。申请证书时所使用的规范是由RFC2986等定义的。
 认证机构根据其认证业务准则(Certification Practice Statement,CPS)对用户的身份进行认证,并生成证书。在生成证书时,需要使用认证机构的私钥来进行数字签名。生成证书格式是由X.509定义的。

作废证书与CRL

 当用户的私钥丢失,被盗时,认证机构需要对证书进行作废 。此外,即便私钥安然无恙,有时候也需要作废证书,例如用户从公司离职导致其时区私钥的使用权限,或是名称变更导致和证书中记载的内容不一致等情况。
 纸质证书只要撕毁就可以作废了,但这里的证书时数字信息,即便从仓库中删除也无法作废,因为用户会保存证书的副本,但人在机构又不能入侵用户的电脑将副本删除。
 要作废证书,人在机构需要制作一张证书作废清单,简称CRL。
 CRL是认证机构宣布作废证书的一览表,具体来说,是一张已作废证书序列号的清单,并由认证机构加上数字签名。证书序列号是认证机构在颁发证书时所赋予的编号,在证书中都会记载。
 PKI用户需要从认证机构获取最新CRL,并查询自己要用于验证签名的公钥证书是否已经作废。
 假设我们手上有Bob的证书,该证书有合法的认证机构签名,而且也在有效期内,但仅凭这些还不能说明该证书一定是有效地,还需要查询认证机构最新的CRL,并确认该证书是否有效。一般来说,这个检查不是用户自身来完成的,而是应该由处理该证书的软件来完成,但由很多软件并没有及时更新CRL。

证书的层级结构

 对于用来验证数字签名的认证机构的公钥,怎样才能判断它是否合法呢?对于认证机构的公钥,可以由其他认证机构施加数字签名,从而对认证机构的公钥进行验证,即生成一张认证机构的公钥证书
 一个认证机构来验证另一个认证机构,这样的关系可以迭代好几层。这样一种认证机构之间的层级关系,我们可以用公司内容部PKI来类比:

认证机构用公司内部PKI类比.png

 假设Bob是札幌办事处的一名员工,札幌办事处员工的公钥都是由札幌办事处认证机构颁发的。
 对于札幌办事处认证机构的公钥,则由北海道分公司认证机构颁发证书,而对于北海道分公司认证机构的公钥,则由东京公司的认证机构颁发的,以此类推。不过这个链条不能无限延伸,总要有一个终点,如果这个终点就是东京总公司认证机构的话,该机构一般称为根CA(Root CA)。而对于东京总公司认证机构,则由东京总公司认证机构自己来颁发证书,这种对自己的公钥进行数字签名的行为称为自签名(self-signature)
Root CA.png

 现在我们假设Alice要验证札幌办事处员工Bob的数字签名,那么Alice需要执行如下步骤:
认证机构的层级.png

图所示,就是Alice对Bob的签名进行验证的整个过程。当然,如此复杂的验证链条不会是由人来操作的,而是由电子邮件或浏览器等软件自动完成的。

各种各样的PKI

 认证机构只要对公钥进行数字签名就可以了,因此任何人都可以成为认证机构,实际上世界上已经有无数个认证机构了。
 国家、地方政府、医院、图书馆等公共组织和团体可以成立认证机构来实现PKI,公司也可以出于业务需要在内部实现PKI,甚至你和你的朋友也可以以实验的为目的来构建PKI。

对证书的攻击

在公钥注册之前进行攻击

 证书是认证机构对公钥及其持有者的信息加上数字签名的产物,由于加上数字签名之后会非常难以攻击,因此我们可以考虑对施加数字签名之前的公钥进行攻击。
 假设Bob生成了密钥对,并准备在认证机构注册自己的公钥。在认证机构进行数字签名之前,主动攻击者Mallory将公钥换成了自己的。这样一来,认证机构就会对“Bob的个人信息”和“Mallory的公钥”这个组合进行数字签名。
  要防止这种攻击,我们可以采用下面的做法,例如Bob可以在将公钥发送给认证机构进行注册时,使用认证机构的公钥对Bob的公钥进行加密。此外,认证机构在确认Bob的身份时,也可以将公钥的指纹一并发送给Bob请他进行确认。


基于ID的密码.png

注册相似人名进行攻击

 证书认证机构对公钥及其持有者的信息加上数字签名的产物,对于一些相似的身份证信息,计算机可以进行区别,但是人类往往很容易认错,而就可以被用来进行攻击。
例如,假设Bob的用户信息中名字的部分:
Name = Bob (首字母大写)
而Mallory用另外一个类似的用户信息:
Name = BOB (全部大写)
注册了另一个不同的公钥。这个工哟的名字叫做BOB,但实际上却是Mallory的公钥。
随后,Mallory 伪装成Bob,将
Name = BOB
的公钥发送给Alice。Alice看到证书中的用户信息,很可能就会将BOB误认为是自己要发送消息的对象Bob。
 要防止这种攻击,认证机构必须确认证书中所包含的信息是否真的是其持有人的个人信息,当本人身份全肉失败时则不向其颁发证书。认证机构的认证业务规则中就规定了这样的方针。

窃取认证机构的私钥进行攻击

 主动攻击者Mallory想出了一个大胆的攻击方式,那就是窃取认证机构的私钥。如果得到认证机构的私钥,那么任何人都可以以该认证机构的身份颁发证书了。
 一般来说,当发现主动攻击者Mallory利用认证机构的私钥签发证书时,就可以断定认证机构的私钥被窃取了,由于认证机构记录了自己签发的证书的序列号,因此能判断某个证书是不是该认证机构自己签发的。
 如果认证机构的私钥被窃取,认证机构就需要养私钥泄露一事通过CRL通知用户

攻击者伪装成认证机构进行攻击

 主动攻击者Mallory又想出一个更大胆的方法,那就是Mallory自己伪装成为认证机构的攻击。
 所以说,如果认证机构本身不可信,即便证书核发,其中的公钥也不能使用。要防范这种攻击却需要Alice自己多加留心才行,她必须要注意自己所得到的证书是哪个认证机构颁发的,这个机构是否可信。

钻CRL的孔子进行攻击(1)

  从公钥失效到Alice收到证书作废清单(CRL)需要经过一段时间,主动攻击者Mallory可以利用CRL发布的时间差来发动攻击。
 要防御这样利用CRL发布的时间差所发动的攻击是非常困难的。因此,对于这种攻击的对策是:

  • 当公钥失效时尽快通知认证机构
  • 尽快发布CRL
  • 及时根系CRL
    此外我们还需要做到:
  • 在使用公钥之前,再次确认公钥是否已经失效

钻CRL的孔子进行攻击(2)

 虽然数字签名能够防止否认,但通过钻CRL的空子,就有可能失效否认,这种方法实际上是“钻CRL的空子进行攻击(1)”的另一种用法。
 假设Bob是一个坏人,他设想一个从Alice手上骗钱的计划。
 首先,Bob用假名字舍利一个账户X-5897,然后他写了一封邮件给Alice,请她像这个账号转账。邮件使用Bob(自己)的私钥进行数字签名。

xxx.png

 Bob将这封邮件发送给Alice之后,又向认证机构Trent发送了一封邮件告知自己的公钥已经失效。
xxx.png

 在从Trent处收到的新的CRL之前,Alice已经验证了签名并执行了转账。
 Bob赶快从自己用假名字开设的账户X-5879中把钱取出来。
收到Trent的CRL之后,Alice大为震惊,于是它尝试联系Bob。
xxx.png

 Bob装作不知道这件事,给Alice回信。
xxx.png

 Bob实际上就是在否认这件事。
 要完全防止这种攻击是很困难的。尽管我们可以将签名的时间和发送公钥作废的请求的时间进行对比,但是私钥泄露之后很久才发现也是很正常的,因此中对比也没有什么意义。
 在这个事件中,通过公钥、证书等技术无法识别出Bob的犯罪行为,必须要依靠刑事侦查才行。
 为了快速确认证书是否已经失效,人们设计了一种名为OCSP的协议,详情请参见RFC2560。

关于证书的Q&A

疑问:
 我不理解证书的必要性。通过认证机构的证书来获取公钥,和直接获取公钥到底有什么不一样呢?
回答:
 在通过不可信的途径获取公钥时,可能遭到前面提到的中间人攻击。Alice本来想要获取的是Bob的公钥,但实际上得到的却是主动攻击者Mallory的公钥。
 如果从认证机构获取公钥,就可以降低遭到中间人攻击的风险。因为带有证书的公钥是经过认证机构进行数字签名的,事实上无法被篡改。但现在问题是,我们又该如何获取认证机构本身的公钥呢?
 如果将上面的这个问题替换成“我自己现在所持有的公钥中,哪一个最可信”这样一个问题,也许更容易理解。例如,如果Alice和Bob本人见面,Bob直接将自己的公钥交给Alice的话,就不需要认证机构了,这是因为Alice可以确信自己所得到的就是Bob的公钥。
 然后在Alice和Bob无法见面的情况下,或者是即便直接见面Alice也无法确信对方就是Bob本人的情况下,认证机构和证书的存在就有意义了。因为Alice得到带有认证机构数字签名的Bob的公钥,就表示将Bob本人身份确认这项工作委托给了认证机构。认证机构则将认可该公钥确实属于Bob的这一事实通过证书传送给Alice。
总结一下:
 如果能欧取得可信的公钥,则不需要认证机构
 当持有可信的认证机构的公钥,并相信认证机构所进行的身 份确认情况下,则可以信任该认证机构颁发的证书以及通过该途径取得的公钥。


疑问:
 无论是证书的格式还是PKI,使用公开的技术总觉得不放心,我觉得使用公开的技术就等于攻击者提供了用于攻击的信息,相比之下,还是使用公司开发的保密认证方法更安全吧?
回答:
 不,这样是错误的。
 自己开发的保密的认证方法是犯了典型的隐藏安全错误。本书中已措辞强调,私下开发安全相关的技术是非常危险的。仅靠一家公司的力量无法开发出足以抵御攻击的安全技术,这一点不仅限于密码技术,对于数字签名和证书等认证技术也同样适用。
 使用公开的技术的确会为攻击者提供用于攻击的信息,但与此同时,全世界的安全专家也在为这些公开的技术寻找漏洞。
 请注意,使用公开的技术和把自己的公司采用的技术公开是两码事。
 采用已经公开的,并积累大量成果的技术是正确的决定,然而并不需要将自己公司所采用的技术的细节公开出来。我们拿员工访问公司内部往来的方法为例。验证员工的合法身份以采用公开的,积累了大量成果的技术,但是我们并不需要讲这些细节公开出来,而是只要告知相关的员工就可以了。这样我们就可以将风险控制到最小,万一有人恶意将技术的详细信息公开出来,也不会产生严重的问题,因为我们所使用的技术原本就是公开的。
 反过来说,如果我们使用的技术是依靠对细节的保密来保证安全的,那么一旦有人恶意泄露技术细节,就会造成严重的问题。
靠隐蔽来保证安全是错误的——切记,因为尽快这个观点和人们直觉相悖,但却是非常重要的。


疑问:
 我已经明白了认证机构的作用了,但是我总觉得这件事说来说去还是一个死循环。为了相信公钥,就必须相信为改公钥颁发证书的认证机构,但是我为什么要相信这个认证机构呢?就算另一个认证机构为它做证明,那我为什么又要相信那个“另一个认证机构”呢?
回答:
 这个问题关系到“信任是如何产生的”这一本质问题。为什么我们要把钱存进银行呢?为什么我们钱包里的钞票能够在商店里使用呢?为什么我们相信饭店里提供的食物是安全的呢?我们每天的生活还会遇到很多这样的“某种程度上可信”的例子,那么这种“可信”的感觉到底是怎样产生的呢?
 一言以蔽之,就是“感觉貌似是可信的”,“从经验上看是可信的”这一类理由。我们之所以信任某家银行,是因为电视和报纸等众多媒体上都能看到它的名字和评价,才会让人产生可信的感觉。
 认证机构是否让人感到可信,和银行也是一样的。如果各种媒体都报道过某家认证机构,而且说这家认证机构的业务非常正规,那么这家认证机构就会让人觉得可信。对于公司内部的认证机构,只要公司发出过官方通知,而且你的上司也跟你说“这个就是我们公司的认证机构”,那么它对就是可信的。如果一个陌生人通过邮件发给你一个地址,就算上面写着“这个还是某公司的认证机构”,我们也不能相信。
 在能够处理政事的电子邮件软件和Web浏览器中,已经包含了一些有名的认证机构的证书,我们在平常使用时也不会再自行检查那些软件中已经内置的证书,这是因为我们信任这个软件的作者,我们会认为有名的软件应该不会嵌入一些恶意认证机构的证书。
 通过上面的思考我们可以看出,即便认证技术是具有层级结构的,但实际上支撑“信任”关系的也并不只是单纯的层级关系而已。不管证书的链条是否具有层级结构,我们只所以信任某个认证机构,是因为那是我们基于多个可信的情报源所组做出的判断。


该系列的主要内容来自《图解密码技术第三版》
我只是知识的搬运工
文章中的插图来源于原著

你可能感兴趣的:(密码技术(十)之证书)