📄 204001.htm
字号:
<html><body><span id=Layer1><p><font size=2 color=#3c3c3c face=arial>公开金钥技术是二十世纪最伟大的主意。优雅、功能强大、很有用,同时也普遍地存在。今天公开金钥解决方案存在於爆炸的Internet商务的世界之下,这项技术也可以套用到其它的领域。若要有效地使用这个技术,便须建立公开金钥基础架构(public key infrastructure,PKI),提供必要支援的服务。若没有这个架构的话,这个核心技术的美妙主意就没那麽有用了。</span><span id=Layer2></font></p><p><font size=2 color=#3c3c3c face=arial>公开金钥技术依赖於公开金钥基础架构 (PKI)</span><span id=Layer3></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>公开金钥技术依赖於公开金钥基础架构 (PKI)</span><span id=Layer4></font></p><hr><p><font size=2 color=#3c3c3c face=arial>在Microsoft Windows 2000,每一个网域都会使用Kerberos 它是分散式安全性的核心协定。相形之下,如果Windows 2000完全地忽略对公开金钥技术的支援,一家公司便不可能成功地使用Windows 2000。大部份的公司可能不希望这麽做,因此不用太讶异,Windows 2000提供许多对公开金钥内建的支援。本章描述支援的部份,一开始我们将介绍公开金钥技术的基本概念。然後描述Windows 2000提供的PKI特性,最後再以安全通讯端阶层(Secure Sockets Layer (SSL) 今日最广泛使用的以公开金钥为基础的安全性协定做为结束,并简短解释公开金钥技术如何用在Kerberos上。</span><span id=Layer5></font></p><a name=204001><font color=#3e70d7 face=arial size=5><b>了解公开金钥技术</span><span id=Layer6></b></font><p><font size=2 color=#3c3c3c face=arial>了解公开金钥(public key)技术如何运作以及管理公开金钥环境中必要的东西,对程式设计师与系统管理者两者来说是很重要的。当这项技术被更广泛使用时,它的术语与概念更与分散式环境的许多观点契合。虽然今日使用许多的公开金钥加密演算法,这一节中只介绍常用的选择,在Windows 2000与其它地方:Rivest-Shamir-Adelman (RSA)演算法,以叁名创作者的名字来命名。</span><span id=Layer7></font></p><font color=#3e72d7 face=arial size=4><b>金钥与加密</span><span id=Layer8></b></font><p><font size=2 color=#3c3c3c face=arial>在一个安全性的演算法中,如Data Encryption Standard (DES)或RC4,使用相同的金钥来对资料加密与解密。为了安全地沟通,两个沟通者都需要知道这个金钥。就如同在最後一章中所描述,这不可避免地会造成金钥分布的问题 一旦建立後,这个秘密金钥如何传送到需要知道它的人的身上? Kerberos提供一个方法来安全地分布金钥,这个解决方案假设牵涉到安全沟通的所有的principal共享(直接或间接)信任的Key Distribution Centers (KDCs),同时这些沟通者共享KDC中其中一把金钥。</span><span id=Layer9></font></p><p><font size=2 color=#3c3c3c face=arial> 密金钥技术需要两个principal都知道相同的金钥</span><span id=Layer10></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial> 密金钥技术需要两个principal都知道相同的金钥</span><span id=Layer11></font></p><hr><p><font size=2 color=#3c3c3c face=arial>公开金钥技术则采用截然不同的方案。不采取在两个或多个principal之间共享一把钥匙的方法,公开金钥技术指派两个不同的金钥,通常称为金钥配对(key pair),给每个principal。其中一把钥匙是私人保存的,只有沟通的人才知道。另一把钥匙则是完全公开的,因此每个人都可以取得。这些私密与公开的金钥相互之间是有关系的,它们并非是由乱数产生的号码。当然,得知一个principal的公开金钥并不能判断出principal的私密金钥。Windows 2000提供产生配对金钥的技术,不过现在真正有趣的是这两把钥匙:任何东西透过这对钥匙的其中一把转换过後,可以由另一把钥匙还原成原来的状态。</span><span id=Layer12></font></p><p><font size=2 color=#3c3c3c face=arial>在公开金钥技术,每个沟通者都拥有公开金钥与私密金钥</span><span id=Layer13></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>在公开金钥技术,每个沟通者都拥有公开金钥与私密金钥</span><span id=Layer14></font></p><hr><p><font size=2 color=#3c3c3c face=arial>假设你要传送给我一个讯息,通知我QwickBank已被卖掉了。不过你并不要任何人知道这个资讯。透过秘密金钥(secret key)的加密,你和我两者都需要知道用来加密这个讯息的秘密金钥,并产生金钥散布的问题。不过使用公开金钥加密,金钥的散布就再也不是个问题了。理论上你唯一要做的事便是取得我的公开金钥,然後使用它来进行加密,如图4-1。这把金钥的定义不是个秘密,因此我可以把它以任何我喜欢的方式传送给你,如透过电子邮件。也因为使用我的公开金钥加密的所有东西只能够透过我的私密金钥(private key)解密,这把金钥只有我知道,只有我可以读取这个加密的讯息。若我希望传送一个回应,我可以取得你的公开金钥,然後使用它来加密只有你可以读取的讯息。透过公开金钥加密,金钥交换的问题便让使用秘密金钥加密的使用者之痛苦消失了。</span><span id=Layer15></font></p><p><font size=2 color=#3c3c3c face=arial>一个principal可以使用它的公开金钥来加密资料</span><span id=Layer16></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>一个principal可以使用它的公开金钥来加密资料</span><span id=Layer17></font></p><hr><br><center><a target=_new href=imagesh/4-1.gif><img border=0 src='imagesl/4-1.gif'></a></center></span><span id=Layer18><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b> 图4-1</span><span id=Layer19> </b></font>在公开金钥加密中,唯一解密的方法即为principal私密金钥。</span><span id=Layer20></td></table></font></center><p><font size=2 color=#3c3c3c face=arial>再者,就因为每样东西都是使用我的公开金钥转换,只可以使用我的私密金钥还原,任何使用我的私密金钥转换的东西只可以使用我的公开金钥还原成原始的状态。因为每个人都可以知道我的公开金钥,使用我的私密金钥来加密资料并没有什麽意义。不过,我可以使用我的私密金钥产生一个数位签章(digital signature)来证明我的身份。</span><span id=Layer21></font></p><p><font size=2 color=#3c3c3c face=arial>一个principal可以使用它的公开金钥来加密资料</span><span id=Layer22></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>一个principal可以使用它的公开金钥来加密资料</span><span id=Layer23></font></p><hr><p><font size=2 color=#3c3c3c face=arial>数位签章真正运作的过程将描述於下一节,不过一般的概念是:假设我要传送一个讯息通知你QwickBank已被卖掉了,而我想要你确认这个讯息是从我这边发出的。如图4-2所示,我可以使用我的私密金钥对这个讯息进行签名,产生一个数位签章,然後将这个签章随着讯息传送。然後你可以使用我的公开金钥来验证你收到的签章。因为只有我知道我的私密金钥,只有我可以为这个讯息签名,因此讯息一定是我送的。由於我知道自己的私密金钥,因此我可以自我验证。</span><span id=Layer24></font></p><p><font size=2 color=#3c3c3c face=arial>一个principal的公开金钥可以用来验证数位签章</span><span id=Layer25></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>一个principal的公开金钥可以用来验证数位签章</span><span id=Layer26></font></p><hr><br><center><a target=_new href=imagesh/4-2.gif><img border=0 src='imagesl/4-2.gif'></a></center></span><span id=Layer27><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b> 图4-2</span><span id=Layer28> </b></font>使用一个principal的私密金钥签章过的资讯,只可以使用这个principal的公开金钥验证。</span><span id=Layer29></td></table></font></center><p><font size=2 color=#3c3c3c face=arial>公开金钥加密是一项伟大的技术,不过它也有一些缺点。其中一个,金钥的长度可能会很长。和8位元组DES金钥,或5、7、16位元组的RC4不同,RSA金钥通常为512位元(64位元组)、1024位元(128位元组),或更长。此外,并非任何配对的字串都可以当做公开金钥与私密金钥。而是这两个值必须拥有一个定义良好的关系,这代表了你无法单纯地选择你的名称与地址当成你的私密金钥。这个概念与秘密金钥的演算法不同,秘密金钥的长度太短,可能来自於你的密码,在公开金钥技术中使用的钥匙基本上是人类无法记忆的。</span><span id=Layer30></font></p><p><font size=2 color=#3c3c3c face=arial>公开金钥演算法典型上需要长度很长的金钥</span><span id=Layer31></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>公开金钥演算法典型上需要长度很长的金钥</span><span id=Layer32></font></p><hr><p><font size=2 color=#3c3c3c face=arial>对公开金钥来说这并不是什麽严重的问题。因为它们的值不一定要视为机密,它们可以储存在任何地方。不过储存私密金钥却是个更棘手的问题。它们的长度太长以致於不容易记忆,不过它们必须以某种方式储存起来以防骇客存取。Windows 2000如何解决这个问题将会在本章中详细地描述,不过基本上,它提供两个不同的解决方案:将私密金钥储存在硬碟的某个地方,使用其它的金钥加密,或者将它储存在智慧卡(smart card)上。智慧卡是一个类似信用卡大小的装置,包含处理能力与记忆体,它是一个制作在塑胶上的小型电脑。智慧卡的记忆体包含你的私密金钥与其它的资讯,而处理器能够进行公开金钥加密,并使用这把金钥进行解密。有了智慧卡,你的私密金钥便不会离开卡片,所有的操作都是在卡片上完成。为了要避免骇客透过偷取你的智慧卡而得到你的识别码,每张卡片上同样也拥有个人的识别码(PIN),你必须输入PIN才可以使用智慧卡。</span><span id=Layer33></font></p><p><font size=2 color=#3c3c3c face=arial>私密金钥可以加密後储存在硬碟上或智慧卡</span><span id=Layer34></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>私密金钥可以加密後储存在硬碟上或智慧卡</span><span id=Layer35></font></p><hr><p><font size=2 color=#3c3c3c face=arial>智慧卡需要智慧卡读取器。Windows 2000提供支援智慧卡驱动程式的标准软体,不过要让智慧卡广为流行也需要让智慧卡读取器成为流行。我们可以预测智慧卡与智慧卡读取器在未来几年内广受使用,不过直到那时之前,在Windows 2000网域中大部份公开金钥技术的使用者会将他们的私密金钥加密後储存在硬碟。</span><span id=Layer36></font></p><p><font size=2 color=#3c3c3c face=arial>公开金钥技术发展上通常比秘密金钥技术还要慢。使用RSA加密与解密的速度可能比使用DES对应的操作要慢上100到1000倍。这样的结果使得公开金钥技术较不常使用来加密使用者传送的真正资料。更常见的解决方案是让传送者使用接收者的公开金钥来加密秘密金钥,如一个DES或RC4金钥,或能更用来建立 密金钥的资讯。只有接收者可以解密秘密金钥,因为只有它知道它的私密金钥。一旦完成这个动作,传送者与接收者现在就可以共享秘密金钥,它可用来有效地加密它们交换的资料。使用公开金钥技术来交换资料,从中取得秘密金钥,然後使用秘密金钥加密以传输资料,这就是SSL所做的事,将在本章稍後描述。</span><span id=Layer37></font></p><p><font size=2 color=#3c3c3c face=arial>公开金钥与秘密金钥技术经常一起使用</span><span id=Layer38></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>公开金钥与秘密金钥技术经常一起使用</span><span id=Layer39></font></p><hr><p><font size=2 color=#3c3c3c face=arial>注意贯穿本书,秘密金钥是使用秘密金钥演算法,如DES,或RC4,而私密金钥与公开金钥则使用公开金钥演算法,如RSA。</span><span id=Layer40></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b>附注 </b></font><p><font size=2 color=#3c3c3c face=arial>注意贯穿本书,秘密金钥是使用秘密金钥演算法,如DES,或RC4,而私密金钥与公开金钥则使用公开金钥演算法,如RSA。</span><span id=Layer41></font></p><hr><p><font size=2 color=#3c3c3c face=arial>公开金钥的缓慢相对地也威胁了它其中一个最大的利益,也就是验证使用者的能力。若使用私密金钥加密整个讯息的动作太慢难以实际化,那麽一个principal如何能使用公开金钥技术来证明它的识别码呢?答案将在稍後描述。</span><span id=Layer42></font></p><font color=#3e72d7 face=arial size=4><b>数位签章(Digital Signature)</span><span id=Layer43></b></font><p><font size=2 color=#3c3c3c face=arial>传送端不使用私密金钥加密整个欲传送的讯息,而可以建立一个数位签章并随讯息传送之。建立数位签章的过程如图4-3。一开始,传送的系统从讯息本身计算一个杂凑值(hash,也称为讯息摘要(message digest)或检查码(checksum))就像Kerberos一样,这个值是讯息本身的一个函数;更动讯息中的一个位元都会(很有可能)造成杂凑值的变动。对於SHA-1 (Secure Hash Algorithm-1),一个常被使用的杂凑演算法,得到的结果是20位元组长。传送者使用它的秘密金钥加密这个相对来讲较为简短的结果,这个操作的速度比起加密整个讯息要来得快一些。结果的加密杂凑值便是讯息的数位签章。</span><span id=Layer44></font></p><p><font size=2 color=#3c3c3c face=arial>使用传送者的私密金钥加密一个讯息的杂凑後会产生一个数位签章</span><span id=Layer45></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>使用传送者的私密金钥加密一个讯息的杂凑後会产生一个数位签章</span><span id=Layer46></font></p><hr><br><center><a target=_new href=imagesh/4-3.gif><img border=0 src='imagesl/4-3.gif'></a></center></span><span id=Layer47><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b> 图4-3</span><span id=Layer48> </b></font>若要建立一个数位签章,传送端使用它的私密金钥来加密讯息的杂凑值。</span><span id=Layer49></td></table></font></center><p><font size=2 color=#3c3c3c face=arial>当讯息到达时,它的接收者必须验证这个数位签章是正确的,过程展示於图4-4。为了达到这的目的,它套用传送端所使用的演算法,计算接收到的讯息之杂凑值。然後使用传送者的公开金钥来对随同讯息而来的数位签章解密,然後比较它们的结果。若新计算出来的杂凑值符合解密後的杂凑值,则这个数位签章便是有效的,而接收者便可以确定传送者的识别码。若它们不符合,可能是因为讯息在传送的过程中被修改了,或它不是由传送者签章的,传送端的公开金钥是用来验证这个签章的。</span><span id=Layer50></font></p><p><font size=2 color=#3c3c3c face=arial>接收者使用传送端的公开金钥来验证数位签章</span><span id=Layer51></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>接收者使用传送端的公开金钥来验证数位签章</span><span id=Layer52></font></p><hr><br><center><a target=_new href=imagesh/4-4.gif><img border=0 src='imagesl/4-4.gif'></a></center></span><span id=Layer53><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b> 图4-4</span><span id=Layer54> </b></font>若要验证一个数位签章,讯息的接收者计算出杂凑值,使用传送者的公开金钥解密收到的签章,然後比较结果。</span><span id=Layer55></td></table></font></center><p><font size=2 color=#3c3c3c face=arial>数位签章同时提供验证(authentication)与资料完整性。若必须防范偷窥的眼睛窥视讯息的内容,它本身必须加密,仅仅对讯息签章并不足够。</span><span id=Layer56></font></p><p><font size=2 color=#3c3c3c face=arial>不过对於依赖数位签章的接收者而言,若要验证传送者的讯息,则接收者必须拥有一个可靠的方式以得知传送端的公开金钥。在某些情况下,这并不是个问题。举例来说,若传送者与接收者是朋友,接收者可能早就知道传送者的公开金钥,或者他们可能相互信任以传送正确的公开金钥。不过当传送者与接收者是完全的陌生人时,数位签章应该同样是可靠的。在这个情况下,可靠地读取传送者的公开金钥是一个挑战,不过它是使用数位签章得解决的一个问题,也是非常有用的。</span><span id=Layer57></font></p><p><font size=2 color=#3c3c3c face=arial>验证一个数位签章需要可靠地取得签名者之公开金钥</span><span id=Layer58></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>验证一个数位签章需要可靠地取得签名者之公开金钥</span><span id=Layer59></font></p><hr><p><font size=2 color=#3c3c3c face=arial>其中一个解决方案是让传送者在它传送的每个已签章讯息中包含它的公开金钥。听起来很吸引人,但这是不够的。若要知道为什麽,假设一个骇客使用自己的私密金钥产生一个经数位签章过的讯息,然後将这个讯息与自己的公开金钥传送到一个不在预期之内的接收者。此骇客可以变成任何人,假设为美国总统。接收者要怎样侦侧传送者在说谎呢?毕竟随讯息传送的公开金钥将会正确地解密讯息的数位签章。若要侦测到这个骗局,接收者必须能够辨别假冒的总统公开金钥。不过接收者要怎样做呢?简单地说,接收者要如何知道哪一把特殊的公开金钥真正是属於谁的?</span><span id=Layer60></font></p><p><font size=2 color=#3c3c3c face=arial>有了公开金钥,需要有某种方式以确定金钥的拥有者</span><span id=Layer61></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>有了公开金钥,需要有某种方式以确定金钥的拥有者</span><span id=Layer62></font></p><hr><p><font size=2 color=#3c3c3c face=arial>若要解决这个问题,以及让数位签章成为验证真正有效的方法,得要有某些方式让讯息的接收者可靠地将公开金钥以及指明金钥所有权的principal识别码关联在一起。一定要有一个机制将principal的公开金钥与名称系结在一起, 如此接收者将会相信这把金钥真正是属於那一个principal。幸运地,有一种方式可以达成这个目的:使用凭证(certificate)。</span><span id=Layer63></font></p><font color=#3e72d7 face=arial size=4><b>凭证(Certificate)</span><span id=Layer64></b></font><p><font size=2 color=#3c3c3c face=arial>一个凭证,通常被鉴赏家称为「cert」,它是一个位元组字串,而且切割成许多不同的栏位。今天大部份的凭证都遵守International Telecommunications Union (ITU) X.509标准3.0版中的格式定义(Internet Engineering Task Force [IETF]已生产一个更亲切地描述,目前是[RFC] 2459的Request for Comments阶段。)一个稍为简化的X.509v3凭证版本展示於图4-5。它包含如下的栏位:</span><span id=Layer65></font></p><font size=2 color=#3c3c3c face=arial><ul><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b> 版本</span><span id=Layer66> </b></font>(</span><span id=Layer67><font size=2 face=arial color=#3e80d7><b> Version</span><span id=Layer68> </b></font>) 指明这个凭证遵循X.509标准的版本号码。</span><span id=Layer69></li><br></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b> 序号</span><span id=Layer70> </b></font>(</span><span id=Layer71><font size=2 face=arial color=#3e80d7><b> Serial number</span><span id=Layer72> </b></font>) 包含凭证的唯一识别码。这个号码可以用来废止凭证,将於本章稍後描述。</span><span id=Layer73></li><br></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b> 签章演算法</span><span id=Layer74> </b></font>(</span><span id=Layer75><font size=2 face=arial color=#3e80d7><b> Signature algorithm</span><span id=Layer76> </b></font>) 指明用来产生这个凭证拥有的数位签章之演算法。</span><span id=Layer77></li><br></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b> 发行者</span><span id=Layer78> </b></font>(</span><span id=Layer79><font size=2 face=arial color=#3e80d7><b> Issuer</span><span id=Layer80> </b></font>) 包含发行这个凭证的公司组织名称。</span><span id=Layer81></li><br></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b> 凭证生效日期</span><span id=Layer82> </b></font>(</span><span id=Layer83><font size=2 face=arial color=#3e80d7><b> Valid from</span><span id=Layer84> </b></font>) 与凭证截止日期(valid to) 指明凭证的有效期间(也就是说,凭证开始生效的时间到凭证过期的时间。)</span><span id=Layer85></li><br></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b> 主题</span><span id=Layer86> </b></font>(</span><span id=Layer87><font size=2 face=arial color=#3e80d7><b> Subject</span><span id=Layer88> </b></font>) principal的名字,它的公开金钥被包含在这个凭证中。</span><span id=Layer89></li><br></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b> 公开金钥</span><span id=Layer90> </b></font>(</span><span id=Layer91><font size=2 face=arial color=#3e80d7><b> Public key</span><span id=Layer92> </b></font>) principal的公开金钥。</span><span id=Layer93></li><br></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b> 许多的其它栏位</span><span id=Layer94> </b></font>(</span><span id=Layer95><font size=2 face=arial color=#3e80d7><b> Various other fields</span><span id=Layer96> </b></font>) 有些栏位被视为延伸的属性栏位。有些延伸的属性是标准的,有些则可能由专属厂商定义的。Windows 2000中这些最重要的栏位将会在稍後描述。</span><span id=Layer97></li><br></font></ul></font><p><font size=2 color=#3c3c3c face=arial>一个凭证包含principal的名称,公开金钥等等</span><span id=Layer98></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>一个凭证包含principal的名称,公开金钥等等</span><span id=Layer99></font></p><hr><br><center><a target=_new href=imagesh/4-5.gif><img border=0 src='imagesl/4-5.gif'></a></center></span><span id=Layer100><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b> 图4-5</span><span id=Layer101> </b></font>一个凭证包含主题名称、公开金钥与其它资讯,全部被发行者进行数位签名。</span><span id=Layer102></td></table></font></center><p><font size=2 color=#3c3c3c face=arial>每个凭证都以发行者的数位签章做为结尾。就像所有的数位签章一样,一个凭证的签章是使用发行者(通常是某些公司)的私密金钥产生的,同时它可以使用发行者的公开金钥验证。凭证是没有加密的,在其中的东西没有可称得上秘密的。不过因为它包含了发行者的数位签章,任何人得到这个凭证都可以验证它是否真的由签章者建立的。</span><span id=Layer103></font></p><p><font size=2 color=#3c3c3c face=arial>每个凭证都是由它的发行者经数位签章过的</span><span id=Layer104></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>每个凭证都是由它的发行者经数位签章过的</span><span id=Layer105></font></p><hr><p><font size=2 color=#3c3c3c face=arial>若要知道凭证是如何解决这个问题:可靠地学习某个人的公开金钥,那就得看看它们是如何建立的。凭证的发行者通常称做凭证授权单位(certification authority,CA),若我希望取得自己的凭证,首先必须找到一个适当的CA给我一个凭证(成为「适当CA」的要素稍後将简短描述。)一旦选择一个CA後,便可以使用我的名称以及公开金钥来展示凭证了。有时我必须向CA证明我是谁,以及我真正的公开金钥。该怎麽做则依赖於CA。若这个CA是一个我工作所在的公司,我可能需要证明我是这家公司的员工。若CA是一个外部的组织,它可能需要我的驾照或护照或其它能证明我身份的东西,或者是验证我的信用卡以证明我的存在。重点是我得向CA证明我的识别码与我的公开金钥。然後CA会发行一个验证包含这两样东西,再加上上述的其它资讯。对凭证签章後,CA便相信我的身份以及确信这把公开金钥是属於我。</span><span id=Layer106></font></p><p><font size=2 color=#3c3c3c face=arial>凭证是由凭证机构(CA)发行的</span><span id=Layer107></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>凭证是由凭证机构(CA)发行的</span><span id=Layer108></font></p><hr><p><font size=2 color=#3c3c3c face=arial>上述都是在假设没有骇客得到CA的私密金钥条件下成立的。事实上,若要让整个公开金钥技术正常地运作,每个principal必须将他们的私密金钥放在绝对安全的地方 只有他们才知道。若有任何人知道我的私密金钥或你的,或更糟的知道CA的,问题就会发生了。</span><span id=Layer109></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b>附注 </b></font><p><font size=2 color=#3c3c3c face=arial>上述都是在假设没有骇客得到CA的私密金钥条件下成立的。事实上,若要让整个公开金钥技术正常地运作,每个principal必须将他们的私密金钥放在绝对安全的地方 只有他们才知道。若有任何人知道我的私密金钥或你的,或更糟的知道CA的,问题就会发生了。</span><span id=Layer110></font></p><hr><p><font size=2 color=#3c3c3c face=arial>现在,当我传送给你一份已签章过的讯息时,我不仅仅可以随讯息传送我的公开金钥,还可以将公开金钥包装在一个凭证中。然後你便可以使用发行凭证给我的CA之公开金钥来验证凭证上的数位签章。若这个数位签章是有效的,你便可以从凭证中萃取出我的名字与公开金钥,并得知这真的是我的公开金钥。现在你便可以安全地使用我的公开金钥来验证我讯息上的数位签章,因此证明我就是讯息的传送者。这个过程如图4-6所示。</span><span id=Layer111></font></p><p><font size=2 color=#3c3c3c face=arial>一个凭证可以和签章过的讯息一起传送</span><span id=Layer112></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>一个凭证可以和签章过的讯息一起传送</span><span id=Layer113></font></p><hr><br><center><a target=_new href=imagesh/4-6.gif><img border=0 src='imagesl/4-6.gif'></a></center></span><span id=Layer114><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b> 图4-6</span><span id=Layer115> </b></font>签章过的讯息之接收者以及凭证可以验证凭证的签章,从凭证中萃取传送者的公开金钥,然後使用它来验证讯息的数位签章。</span><span id=Layer116></td></table></font></center><p><font size=2 color=#3c3c3c face=arial>若要成为CA需要拥有一些软体或硬体以便能够产生凭证。为了要执行这个功能,Windows 2000中包含了Microsoft Certificate Services。本章将会详细地描述Certification services,不过现在要知道的是 Windows 2000确实提供一个方法以便产生、管理凭证。</span><span id=Layer117></font></p><p><font size=2 color=#3c3c3c face=arial>Windows 2000包含可产生并管理凭证的软体</span><span id=Layer118></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>Windows 2000包含可产生并管理凭证的软体</span><span id=Layer119></font></p><hr><p><font size=2 color=#3c3c3c face=arial><font size=2 face=arial color=#3e80d7><b> 凭证阶层</span><span id=Layer120> </b></font>(</span><span id=Layer121><font size=2 face=arial color=#3e80d7><b> Certification Hierarchies</span><span id=Layer122> </b></font>) 如果你还在阅读,你可能已经注意到一些潜在的问题。因为验证一个凭证的数位签章需要得知发行这个凭证的CA之公开金钥,要如何才能够可靠地获得这个公开金钥呢?最常见的解决方案便是使用取得其它公开金钥一样的方式来取得:从一个凭证中。CA自己也有凭证,因此便可以从它自己的凭证萃取出CA的公开金钥。但是谁发行了CA的凭证呢?凭证拥有的是谁的数位签章呢?</span><span id=Layer123></font></p><p><font size=2 color=#3c3c3c face=arial>一个CA的公开金钥可从凭证中粹取出来</span><span id=Layer124></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>一个CA的公开金钥可从凭证中粹取出来</span><span id=Layer125></font></p><hr><p><font size=2 color=#3c3c3c face=arial>在此有许多可能的答案。若这个CA是所谓的根CA(root CA),它的凭证是自己签署的。也就是说,CA在它的凭证上使用自己的私密金钥签章。验证自行签署的凭证之签章需要安全地获得CA的公开金钥,或许是从CA的网站上下载,或以其它可靠的方式完成,然後使用公开金钥来验证凭证上的数位签章。决定信任的CA,然後签署他们的凭证(哪一个CA是你愿意接受成为根CA)是一个很严肃的问题,而Windows 2000如何进行控制将於本章描述。</span><span id=Layer126></font></p><p><font size=2 color=#3c3c3c face=arial>根CA拥有自己签署的凭证</span><span id=Layer127></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>根CA拥有自己签署的凭证</span><span id=Layer128></font></p><hr><p><font size=2 color=#3c3c3c face=arial>另一个选择是CA的凭证是由另一个CA发行的。在这个情况下,检查CA凭证上的数位签章需要得知发行此凭证的CA之公开金钥。将CA组成阶层是很平常的,最上层是根CA,它拥有自己签署的凭证,然後还有一些中间阶层的CA(也称为次级CA)。这些CA则由阶层中上层的CA进行签署。看起来如图4-7所示。</span><span id=Layer129></font></p><p><font size=2 color=#3c3c3c face=arial>中间层的CA的凭证是由上层的CA签署的</span><span id=Layer130></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>中间层的CA的凭证是由上层的CA签署的</span><span id=Layer131></font></p><hr><a name="4-7"></span><span id=Layer132><br><center><a target=_new href=imagesh/4-7.gif><img border=0 src='imagesl/4-7.gif'></a></center></span><span id=Layer133><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b> 图4-7</span><span id=Layer134> </b></font>建立CA组织阶层,在根CA下有一或多个等级的中间阶层CA。</span><span id=Layer135></td></table></font></center><p><font size=2 color=#3c3c3c face=arial>就图4-7的联想,一个常见的惯例是让根CA只发行阶层中位於它下层的CA凭证,然後对於下层的CA再发行凭证给它次一层的CA,依此类推。CA阶层中有多少等级是多变的。一个简单的结构中可能只有一个单一的CA直接发行凭证给principal,而较为复杂的结构可能牵涉到许多等级。举例来说,一家大公司可能不是从一家CA中取得凭证,将所有取得凭证的要求转送到一台伺服器可能不切实际,因此某些类型的分散式凭证阶层就有必要了。同样地,可因不同的目的来发行不同的凭证,传送安全性的电子邮件、稽核一个网域等等。因此不同的CA可以用来建立不同类型的凭证。</span><span id=Layer136></font></p><p><font size=2 color=#3c3c3c face=arial>较高等级的CA通常只发行凭证给其它CA</span><span id=Layer137></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>较高等级的CA通常只发行凭证给其它CA</span><span id=Layer138></font></p><hr><p><font size=2 color=#3c3c3c face=arial>思考一会儿,在这个情况下,关於验证一个principal的数位签章必要的东西是什麽。在一个阶层式的CA中,不仅仅只有principal的凭证需要验证,阶层中所有principal之上每个CA的凭证都需要验证。为了要能让你验证我的数位签章,我可能不仅需要提供给你我的凭证,也要提供整系列的凭证。这一群凭证通常称做为一个凭证链(certification chain,或有时称为凭证路径,certification path)。这个凭证链中包含凭证的清单,除最後一个凭证之外,所有的凭证都包含CA阶层中次级CA的公开金钥。只有最後的凭证,通常称之为末端实体(end-entity)凭证,真正包含了principal的公开金钥。这个概念是来自於每个凭证签署者之公开金钥可以事先从凭证链中的凭证萃取出来,然後用来验证凭证的签章。</span><span id=Layer139></font></p><p><font size=2 color=#3c3c3c face=arial>验证一个数位签章可能要一个凭证链(certification chain)</span><span id=Layer140></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>验证一个数位签章可能要一个凭证链(certification chain)</span><span id=Layer141></font></p><hr><p><font size=2 color=#3c3c3c face=arial>图4-8展示一个由图4-7的CA阶层所产生的凭证链。凭证链中最下层的凭证是用来验证principal的数位签章的。这也就是说,它是将要被验证的principal的末端实体(end-entity)凭证。在它和根凭证之间有两个中间凭证,这两个都是由阶层中适当的中间CA发行的。最上面则是自行签署的根凭证,当验证凭证链的动作开始执行时,便从根萃取出最高阶层的公开金钥。</span><span id=Layer142></font></p><a name="4-8"></span><span id=Layer143><br><center><a target=_new href=imagesh/4-8.gif><img border=0 src='imagesl/4-8.gif'></a></center></span><span id=Layer144><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b> 图4-8</span><span id=Layer145> </b></font>在凭证链,每个CA的公开金钥是由阶层中上层的CA所发行的凭证萃取出来的。根CA拥有自行签署的凭证。</span><span id=Layer146></td></table></font></center><p><font size=2 color=#3c3c3c face=arial><font size=2 face=arial color=#3e80d7><b> 控制欲信任的CA</span><span id=Layer147> </b></font>公开金钥加密的概念是很简单很美妙的,不过就表面上看来,要套用它还需要一些工作。我们现在仍有一些概念要讨论。</span><span id=Layer148></font></p><p><font size=2 color=#3c3c3c face=arial>假设我传送给你一个签章过的讯息,以及某个CA发出的凭证。若你使用CA的公开金钥来验证凭证上的数位签章,然後从凭证中萃取出我的名字与公开金钥,你可以确定的是CA确认那是我的公开金钥。一个你不信任的CA(譬如说你主要竞争者开的CA)可能会发出假的凭证。若你不信任发行凭证的CA,便无法信任包含在凭证中的公开金钥是真正属於凭证上面的名字指的那个principal。换句话说,若我传送给你一份已签章过的讯息以及一个凭证,只有在你信任发行凭证的CA时才能用来验证我。</span><span id=Layer149></font></p><p><font size=2 color=#3c3c3c face=arial>信任一个凭证需要信任发行凭证的CA</span><span id=Layer150></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>信任一个凭证需要信任发行凭证的CA</span><span id=Layer151></font></p><hr><p><font size=2 color=#3c3c3c face=arial>CA阶层让事情变得更为有趣了。在一个阶层中,信任根CA代表的含意是你相信他并没有发行不可靠的凭证给它下层的CA。若你相信一个特定的根CA可能发行一个凭证给下层的CA,而下层的CA可能会发行假造的凭证,你就不应该信任这个根CA。</span><span id=Layer152></font></p><p><font size=2 color=#3c3c3c face=arial>选择信任哪一个CA是个重要的决定</span><span id=Layer153></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>选择信任哪一个CA是个重要的决定</span><span id=Layer154></font></p><hr><p><font size=2 color=#3c3c3c face=arial>该信任哪一个CA呢?一般来说,许多公司会自动地希望信任他们自己的CA。举例来说,若你工作的公司已建立自己内部的凭证阶层,你可能愿意信任这些CA不会发行假造的凭证。不过如果你要使用数位签章来验证与其它公司交换的资讯时该如何呢?为了这个问题的诉求,今日已有许多商业公司扮演着受信任的CA(trusted CA)的角色。较着名的有VeriSign、Thawte,以及Belsign,还有很多。依赖於所要求的凭证真正的类型,这些公司伤很多脑筋来验证一个principal是否真的就是他宣称的那一个人。</span><span id=Layer155></font></p><p><font size=2 color=#3c3c3c face=arial>不过在一个特殊的Windows 2000网域中,谁该决定该信任哪一个CA?需要每个使用者来做决定是个差劲的主意。较好的方案是允许系统管理者指定信任此网域中的CA,然後使用某些方法来实施这个选择。</span><span id=Layer156></font></p><p><font size=2 color=#3c3c3c face=arial>Windows 2000允许集中控制该信任哪一个CA</span><span id=Layer157></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>Windows 2000允许集中控制该信任哪一个CA</span><span id=Layer158></font></p><hr><p><font size=2 color=#3c3c3c face=arial>说得更清楚一些,该信任特定网域中哪一个CA的概念是与</span><span id=Layer159> <a target='_new' href=203.htm#>第叁章</span><span id=Layer160></a> 描述的跨网域信任独立的。在Windows 2000网域中的信任是基於Kerberos,一个以秘密金钥为基础的技术。CA信任只在使用以公开金钥为基础的技术才有关。)这也就是Windows 2000采取的方案,如何完成这个动作的方法将於下描述。</span><span id=Layer161></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b>附注 </b></font><p><font size=2 color=#3c3c3c face=arial>说得更清楚一些,该信任特定网域中哪一个CA的概念是与</span><span id=Layer162> <a target='_new' href=203.htm#>第叁章</span><span id=Layer163></a> 描述的跨网域信任独立的。在Windows 2000网域中的信任是基於Kerberos,一个以秘密金钥为基础的技术。CA信任只在使用以公开金钥为基础的技术才有关。)这也就是Windows 2000采取的方案,如何完成这个动作的方法将於下描述。</span><span id=Layer164></font></p><hr><p><font size=2 color=#3c3c3c face=arial><font size=2 face=arial color=#3e80d7><b> 凭证废止清单</span><span id=Layer165> </b></font>(</span><span id=Layer166><font size=2 face=arial color=#3e80d7><b> Certificate Revocation Lists</span><span id=Layer167> </b></font>) 假设我加入一家公司,而此公司的CA发行给我一个凭证。然後我便可以使用这个凭证,和我的公开金钥,来向每个信任我公司的CA不会发行假冒凭证的人证明我的身份。不过假设我离职了,或更糟糕的,因为做错事而被炒鱿鱼了。现在我前任的雇主不再愿意担保我的身份,不过我还是拥有他们给我组成凭证的这些位元组。或者假设有人偷窃了我的私密金钥,因此我不再是唯一能产生证明我身份之数位签章的人。我的凭证已不再能用来证明我。在上述两种情况下,底层的问题都是一样的:一旦凭证发行後,如何废止呢?</span><span id=Layer168></font></p><p><font size=2 color=#3c3c3c face=arial>有时凭证得废止</span><span id=Layer169></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>有时凭证得废止</span><span id=Layer170></font></p><hr><p><font size=2 color=#3c3c3c face=arial>其中一个答案是等待。每一个凭证都有有效期限,一旦过期,凭证就不再有用了。凭证的生命周期通常都是以年为单位计算,因此较折衷的解决方案(不愿等待太久的方法)还是必要的。凭证废止清单(Certificate revocation lists,CRLs)提供这个解决方案。每个CA都可以维护一个CRL,并让CRL指明哪一个已发行的凭证已被废止。每个废止的凭证是由它的序号(serial number)识别的,它包含在所有凭证的一个栏位中。每当一个凭证被使用後,如在验证数位签章的过程中,发行这个凭证的CA之CRL就可以用来检验,以确保这个凭证并没有被废止。</span><span id=Layer171></font></p><p><font size=2 color=#3c3c3c face=arial>一个CA的废止凭证包含在凭证废止清单(CRL)中。</span><span id=Layer172></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>一个CA的废止凭证包含在凭证废止清单(CRL)中。</span><span id=Layer173></font></p><hr><p><font size=2 color=#3c3c3c face=arial>CRL同样在判断该信任哪一个网域时扮演一个重要的角色。毕竟信任一个CA代表的意思是相信它产生的所有凭证都是有效的。若要被信任,一个CA必须固定发行一个更新的CRL,以便让凭证的使用者判断凭证是否已被废止。而CRL本身也有有效期限,它让使用者知道何时该撷取新版本了。</span>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -