📄 204002.htm
字号:
<html><body><span id=Layer1><a name=204002><font color=#3e70d7 face=arial size=5><b>在Windows 2000中管理公开金钥技术</span><span id=Layer2></b></font><p><font size=2 color=#3c3c3c face=arial>了解公开金钥的基本概念无疑是一件很重要的事,不过这只是成功条件的其中一个。需要公开金钥技术(20年前发行的)的其中一个理由已慢慢地蔓延开来:建立必要的基础架构并能够有效地使用要花很大的努力。Windows 2000代表了Microsoft的第一个尝试,将这个受广泛支援的技术内建到作业系统。本章其馀小节将描述Windows 2000支援的主要元件。</span><span id=Layer3></font></p><font color=#3e72d7 face=arial size=4><b>CryptoAPI</span><span id=Layer4></b></font><p><font size=2 color=#3c3c3c face=arial>和Windows 2000透过单一的Security Support Provider介面(SSPI) 显露出的分散式安全性服务相似的方法,它同样将加密服务隐藏在公用的API,称做CryptoAPI。这个介面允许存取任何安装在系统上的密码编译服务提供者(Cryptographic Service Provider,CSP)。CSP类似和SSPI一起使用的Security Service Providers (SSPs),不过它们并不是用来封装分散式安全性服务,而是用来封装密码编译服务(cryptographic service)。</span><span id=Layer5></font></p><p><font size=2 color=#3c3c3c face=arial>密码编译服务提供者可透过CryptoAPI存取</span><span id=Layer6></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>密码编译服务提供者可透过CryptoAPI存取</span><span id=Layer7></font></p><hr><p><font size=2 color=#3c3c3c face=arial>将加密的细节从使用它的应用程式中隐藏起来是个好主意,理由如下:第一,将应用程式与加密技术保持独立可让这些应用程式更有弹性,因为CryptoAPI允许为不同的目的来安装并使用不同的密码编译提供者。第二,这个解决方案让程式设计师的生活更为简单,他们希望尽可能不要了解加密的细节。第叁,因为许多国家的政府已立法来控制输入、输出以及使用许多坚固的加密软体,模组化在加密技术中特别地有用。</span><span id=Layer8></font></p><p><font size=2 color=#3c3c3c face=arial>CryptoAPI协助应用程式更有弹性地使用安全性技术</span><span id=Layer9></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>CryptoAPI协助应用程式更有弹性地使用安全性技术</span><span id=Layer10></font></p><hr><p><font size=2 color=#3c3c3c face=arial>若使用CryptoAPI,应用程式便可以跟使用的加密技术独立开来。不必绑死在特定的演算法,应用程式可以直接呼叫标准的CryptoAPI呼叫。依赖於系统可用的CSP,应用程式可以取得任一等级的安全性机制。如此可允许使用加密技术的应用程式开发者在建立软体时,不须受汇出控制的支配。CryptoAPI架构将应用程式汇出的问题从应用程式开发者转移到CSP开发者的身上。</span><span id=Layer11></font></p><p><font size=2 color=#3c3c3c face=arial>CryptoAPI透过一组C的函数呼叫显露它的服务,如图4-9所示,它被应用在许多Windows 2000应用程式之中。这个API允许应用程式建立金钥配对、加密资料与解密资料,建立杂凑(也称为检查码,或讯息摘要) 以及数位签章,并验证这些数位签章等等。CryptoAPI的使用者包含Windows 2000 SSL的实作以及Microsoft Certificate Services。CryptoAPI不仅仅只有允许对CSP的存取,它也提供程式码以支援其它重要的服务,如建立一个凭证链。</span><span id=Layer12></font></p><p><font size=2 color=#3c3c3c face=arial>应用程式使用CryptoAPI来建立金钥配对,并能跟数位签章一起运作</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>应用程式使用CryptoAPI来建立金钥配对,并能跟数位签章一起运作</span><span id=Layer14></font></p><hr><p><font size=2 color=#3c3c3c face=arial>Windows 2000包含许多CSP</span><span id=Layer15></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>Windows 2000包含许多CSP</span><span id=Layer16></font></p><hr><p><font size=2 color=#3c3c3c face=arial>Kerberos,Windows 2000核心的分散式安全性协定,它并没有显示在图4-9中,因为Kerberos并不使用CryptoAPI。Kerberos SSP自行包含一份Microsoft DES与RC4实作的复本。</span><span id=Layer17></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b>附注 </b></font><p><font size=2 color=#3c3c3c face=arial>Kerberos,Windows 2000核心的分散式安全性协定,它并没有显示在图4-9中,因为Kerberos并不使用CryptoAPI。Kerberos SSP自行包含一份Microsoft DES与RC4实作的复本。</span><span id=Layer18></font></p><hr><br><center><a target=_new href=imagesh/4-9.gif><img border=0 src='imagesl/4-9.gif'></a></center></span><span id=Layer19><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b> 图4-9</span><span id=Layer20> </b></font>SSP可透过CryptoAPI存取加密服务。</span><span id=Layer21></td></table></font></center><p><font size=2 color=#3c3c3c face=arial>Windows 2000内含许多不同的CSP。依赖於你使用的系统,Windows 2000系统可能包含:</span><span id=Layer22></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> 基本的RSA CSP</span><span id=Layer23> </b></font>实作1024位元的RSA金钥,以及56位元的RC2与RC4金钥。因为它们的长度相当地短,这个CSP不需任何外销授权便可以使用。它同样也实作了MD5与SHA-1以产生讯息摘要(message digests)。</span><span id=Layer24></li><br></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b> 增强的RSA CSP</span><span id=Layer25> </b></font>实作了16k位元组的RSA(虽然长度很长,但效率很慢)、以及128位元的RC2与RC4金钥,和DES与Triple-DES。这些演算法提供有效、难以破解的安全性(DES则有一些例外)。增强的RSA CSP只有在北美地区才没有外销授权问题。</span><span id=Layer26></li><br></font></ul></font><br><font size=2 color=#3c3c3c face=arial><p><font size=2 color=#3c3c3c face=arial>美国外销法律在本书出版时可能会改变,这个叙述在你阅读此书时可能不再为真。</span><span id=Layer27></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=Layer28></font></p><hr></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b> Diffie-Hellman/DSS CSP</span><span id=Layer29> </b></font>实作Diffie-Hellman演算法以进行金钥交换,以及美国政府的数位签章标准(Digital Signature Standard,DSS)。</span><span id=Layer30></li><br></font><p><font size=2 color=#3c3c3c face=arial>第叁协力厂商提供其它的CSP。举例来说,一个智慧卡的供应商必须实作一个适当的CSP以便配合卡片一起使用。不过CSP本身也有很敏感的议题。记住,加密软体很难取悦政府。因为这个因素,在Windows 2000中每个CSP执行档都必须由Microsoft签署数位签章。这个签章将在CSP载入时验证,以避免其它加密软体任意地介入。即使存取CSP软体开发工具(software development kit (SDK))已受控制,它并无法自由地从Microsoft的网站上下载。这表示骇客便没有办法撰写一个CSP,把它安装到Windows 2000,然後意外拥有内建存取加密的能力。虽然在技术上做得到,但政府机构一般来说不会对这麽容易存取的加密机制感到高兴,因此Windows 2000限定了哪些CSP可以使用。</span><span id=Layer31></font></p><p><font size=2 color=#3c3c3c face=arial>CSP必需由Microsoft进行数位签章的动作</span><span id=Layer32></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>CSP必需由Microsoft进行数位签章的动作</span><span id=Layer33></font></p><hr><font color=#3e72d7 face=arial size=4><b>储存私密金钥与凭证</span><span id=Layer34></b></font><p><font size=2 color=#3c3c3c face=arial>我们已经看过,CSP实作公开金钥与秘密金钥(有时候)的加密演算法。不过典型上CSP同样也需要某些机制以储存资讯。举例来说,特定工作站的使用者可能会拥有一对金钥,代表使用者的私密金钥与凭证(包含对应的公开金钥)都可在此台机器上存取。在其他的情况下,只有凭证才需要储存,不需相关的私密金钥以便进行追踪。举例来说,当一个应用程式使用CSP来验证数位签章,此应用程式必需展示一个附签章的凭证链。若要验证这个签章,CSP需要存取凭证链中每一个凭证,不过并不需要对应到这些凭证的任一把私密金钥。</span><span id=Layer35></font></p><p><font size=2 color=#3c3c3c face=arial>CSP需要储存资料的地方</span><span id=Layer36></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>CSP需要储存资料的地方</span><span id=Layer37></font></p><hr><p><font size=2 color=#3c3c3c face=arial>对於智慧卡CSP来说,每一个使用者的私密金钥与凭证都是储存在使用者卡片上的硬体中。然而,对於软体CSP,私密金钥与凭证必须储存在使用者机器上的硬碟中。每个CSP可能都会定义自己的架构描述(schema)来储存私密金钥,不过Windows 2000同样提供了一些标准。对於凭证而言,Windows 2000定义许多不同的凭证存放区,包含:</span><span id=Layer38></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=Layer39> </b></font>(</span><span id=Layer40><font size=2 face=arial color=#3e80d7><b> Personal store</span><span id=Layer41> </b></font>) 储存一台机器或特定电脑上个别使用者终端实体(end-entity)的凭证。这些使用者通常都需要建立一个数位签章,一个需要私密金钥的操作,因此这些凭证储存时必须参考到它相关的私密金钥。</span><span id=Layer42></li><br></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b> 信任的根CA存放区</span><span id=Layer43> </b></font>(</span><span id=Layer44><font size=2 face=arial color=#3e80d7><b> Trusted Root CA Store</span><span id=Layer45> </b></font>) 包含某些凭证阶层中信任的根CA所发行的凭证。Windows 2000出货时附上许多自行签署的根凭证,这些凭证是由商业上的CA载入到凭证存放区中,其馀的可透过管理工具新增。所有储存在此的凭证都是自行签署的。</span><span id=Layer46></li><br></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b> 中继CA存放区</span><span id=Layer47> </b></font>(</span><span id=Layer48><font size=2 face=arial color=#3e80d7><b> Intermediate CA Sore</span><span id=Layer49> </b></font>) 包含用来建构凭证链的凭证。这些凭证一向都是由中继CA发行的,中继CA是阶层中的一部份,但不是根CA。</span><span id=Layer50></li><br></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b> 企业信任存放区</span><span id=Layer51> </b></font>(</span><span id=Layer52><font size=2 face=arial color=#3e80d7><b> Enterprise Trust Store</span><span id=Layer53> </b></font>) 这个存放区不直接储存凭证,它储存凭证信任清单(Certificate Trust List(CTL))。什麽是CTS,以及如何使用CTL将於文後描述。</span><span id=Layer54></li><br></font></ul></font><p><font size=2 color=#3c3c3c face=arial>用做不同目的的凭证储存在不同的凭证存放区</span><span id=Layer55></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=Layer56></font></p><hr><p><font size=2 color=#3c3c3c face=arial>对於这些所有的选项,凭证真正是储存在系统登录中,当有需要验证数位签章时,可透过CryptoAPI存取。在图4-10的范例中,个人存放区只包含使用者A的凭证。这个凭证是由CA 2发行的,这个CA所属的阶层展示在</span><span id=Layer57> <a href="#4-7" target=_new>图4-7</span><span id=Layer58></a> ,因此它已被其它凭证机构签署了。因为这是储存凭证资讯的电脑上之特定使用者,因此个人存放区也包含一个参考,指向关联到这个凭证的私密金钥。中继CA存放区包含CA 1到CA 2的凭证,这两者都是前述CA阶层的一部份,而CA 8则属於不同的CA阶层。CA 2的凭证是由CA 1发行的,因此携带了CA 1的数位签章。CA 1的凭证是由根CA X发行的,而CA 8的凭证是由不同的根CA,CA Y发行的。最後,信任的根CA存放区包含自我签署的根凭证,从CA X到CA Y。若系统上的CryptoAPI以及凭证存放区(展示於图4-10)被要求要验证某些使用者A签署的东西,所有验证所需的凭证(以及一些不需要的)都已在手上:一个为CA X自行签署的根凭证,CA 1与CA 2的中间凭证,还有使用者A的终端实体凭证。</span><span id=Layer59></font></p><p><font size=2 color=#3c3c3c face=arial>CryptoAPI可以存取任一种凭证存放区</span><span id=Layer60></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>CryptoAPI可以存取任一种凭证存放区</span><span id=Layer61></font></p><hr><p><font size=2 color=#3c3c3c face=arial>凭证也可以储存在Active Directory之中。任何目录中的使用者物件(代表一些使用者的帐号)都可以为这个使用者包含一个或多个凭证(在userCertificate型态的属性上)。如此可让每个人都有正确的权限以存取这些凭证,使得凭证能容易地在分散式环境中使用。</span><span id=Layer62></font></p><p><font size=2 color=#3c3c3c face=arial>Active Directory也可以储存凭证</span><span id=Layer63></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>Active Directory也可以储存凭证</span><span id=Layer64></font></p><hr><p><font size=2 color=#3c3c3c face=arial>虽然Windows 2000提供公用存放区区域来储存凭证,并可让任何应用程式存取,但每个CSP可能会提供自己的容器(container)以储存私密金钥。对於智慧卡CSP,容器以及它包含的私密金钥实际上都储存在卡上。对於基本的RSA与增强的RSA,私密金钥的容器都是储存在Windows 2000 Application Data目录中,为使用者设定档(user profile)资讯的一部份(它们并非和Windows NT 4一样储存在系统登录中)。储存的私密金钥是加密过的,所使用的加密演算法是依赖於master金钥。这把金钥是使用使用者的密码来加密的。</span><span id=Layer65></font></p><p><font size=2 color=#3c3c3c face=arial>CSP可以将私密金钥储存在许多地方</span><span id=Layer66></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>CSP可以将私密金钥储存在许多地方</span><span id=Layer67></font></p><hr><br><center><a target=_new href=imagesh/4-10.gif><img border=0 src='imagesl/4-10.gif'></a></center></span><span id=Layer68><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b> 图4-10</span><span id=Layer69> </b></font>逻辑上,Windows 2000拥有许多的凭证存放区。</span><span id=Layer70></td></table></font></center><p><font size=2 color=#3c3c3c face=arial>预设一个使用者的私密金钥是存放於CSP的金钥贮藏库(key storage),通常代表建立金钥的机器上之硬碟中。若启动了漫游使用者设定档(roaming user profile)选项,当使用者登出时,使用者私密金钥的复本便会上载到档案伺服器。当使用者从其它的系统登入时,登入的过程中将会取得一张存取档案服务的票根(ticket),它包含在使用者设定档所在的机器,然後下载私密金钥以及其它设定档的资讯到使用者的系统,如图4-11所示。因为私密金钥已使用master秘密金钥加密,所以在网路上共享的档案伺服器上储存私密金钥是一件很合理、安全的事。</span><span id=Layer71></font></p><p><font size=2 color=#3c3c3c face=arial>私密金钥可以储存在单机或在使用者登入时从其它机器下载</span><span id=Layer72></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=Layer73></font></p><hr><br><center><a target=_new href=imagesh/4-11.gif><img border=0 src='imagesl/4-11.gif'></a></center></span><span id=Layer74><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b> 图4-11</span><span id=Layer75> </b></font>若启动了漫游使用者设定档选项,使用者的秘密金钥将会储存在档案伺服器上,在使用者登入时下载到使用者的工作站。</span><span id=Layer76></td></table></font></center><font color=#3e72d7 face=arial size=4><b>Microsoft Certificate Services</span><span id=Layer77></b></font><p><font size=2 color=#3c3c3c face=arial>凭证是公开金钥基础架构非常重要的一部份。理论上,虽然一家外部的公司,如VeriSign可以提供一家公司所需的所有凭证,但若能自行产生凭证将会方便许多。(也比较便宜,因为这些公司每发出一张凭证都要收费。)即使是以产生凭证为生的第叁协力厂商也需要一些建立凭证的机制。Microsoft Certificate Services,Windows 2000标准的一部份,提供了这个机制。它可以让想成为公开CA的公司使用,或者让需要自行产生凭证的公司组织使用。无论是属於哪一类公司,Certificate Services提供建立并管理X.509凭证的智慧。最後,Certificate Services依赖於某些CSP提供的服务,并能透过CryptoAPI存取。</span><span id=Layer78></font></p><p><font size=2 color=#3c3c3c face=arial>Microsoft Certificate Services可以发行并管理凭证</span><span id=Layer79></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>Microsoft Certificate Services可以发行并管理凭证</span><span id=Layer80></font></p><hr><p><font size=2 color=#3c3c3c face=arial>客户端可以使用很多种方式从Certificate Services要求凭证,包含透过Hypertext Transfer Protocol (HTTP)、DCOM,或从一个档案中读取。传送的要求本身是使用标准的PKCS #10格式。它必须指定欲使用的凭证之目的。举例来说,凭证发行的目的如:验证客户端、验证伺服器、传送电子邮件、签署执行档程式码...等等。要求的结果是一个X.509v3凭证,并以PKCS #7标准格式回传。</span><span id=Layer81></font></p><p><font size=2 color=#3c3c3c face=arial>你可以使用许多方式来要求凭证</span><span id=Layer82></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=Layer83></font></p><hr><p><font size=2 color=#3c3c3c face=arial>「PKCS」代表Public Key Cryptography Standards,这一群标准的名称可用在许多不同的公开金钥技术上。PKCS #10定义要求凭证的一个标准格式。</span><span id=Layer84></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b>附注 </b></font><p><font size=2 color=#3c3c3c face=arial>「PKCS」代表Public Key Cryptography Standards,这一群标准的名称可用在许多不同的公开金钥技术上。PKCS #10定义要求凭证的一个标准格式。</span><span id=Layer85></font></p><hr><p><font size=2 color=#3c3c3c face=arial>为了要更容易地建立要求,系统管理者可以使用凭证范本(certificate templates),其中包含特定要求类型的基本参数。个别的要求只要插入它要求的使用者专属值。Windows 2000包含许多事先定义的范本以让一般类型的要求使用,因此系统管理者可以只使用已存在的。Certificate Services也允许新增自订的原则(policy)以及exit模组,以实行公司认为重要的规则。举例来说,在某些公司的CA可能会使用policy模组在公司目前全职工作的员工清单中,寻找每个使用者要求的凭证,然後只发行凭证给在清单上的使用者。</span><span id=Layer86></font></p><p><font size=2 color=#3c3c3c face=arial>Certificate Service可以使用policy模组自订</span><span id=Layer87></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>Certificate Service可以使用policy模组自订</span><span id=Layer88></font></p><hr><p><font size=2 color=#3c3c3c face=arial>一家公司有可能只有一个CA,建立一个多层次的CA可拥有较佳的安全性。这是因为在高阶层的CA可以在安全的地方保持离线的状态,让它们更不易被骇客存取。不管选择哪一种,使用Windows 2000 Certificate Services实作的CA必须设定成两种类型:企业CA与独立CA。这两者最重要的不同点在於:企业CA可与网域中的安全性服务和目录服务整合在一起,当它接收到网域中使用者的验证要求时,能够自动地发行一个凭证。对照上,独立CA一般在要求凭证时,需要明确地由系统管理者或其它方法审核通过。</span><span id=Layer89></font></p><p><font size=2 color=#3c3c3c face=arial>Certificate Services支援企业CA与独立CA</span><span id=Layer90></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>Certificate Services支援企业CA与独立CA</span><span id=Layer91></font></p><hr><p><font size=2 color=#3c3c3c face=arial>实际上,企业CA只能够部署为Windows 2000网域的一部份,它需要Active Directory。在发行一个凭证到使用者之前,企业CA在Active Directory中查看使用者,是否满足这项要求:这个使用者真的存在此网域中,同时这个使用者被允许取得这类凭证。若是如此,要求的凭证便自动地发行,不需人为的介入。同样地,企业CA也可以组态来发行他们产生的凭证,以及Active Directory中的CRL。</span><span id=Layer92></font></p><p><font size=2 color=#3c3c3c face=arial>当使用者要求凭证时,企业CA可以自动地发行凭证</span><span id=Layer93></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=Layer94></font></p><hr><p><font size=2 color=#3c3c3c face=arial>相形之下,独立CA并不需要存取Active Directory,因此它不必是Windows 2000网域中的一部份。很有可能独立CA不属於一个网域,然而若为网域的一部份,它可以将资讯发行到Active Directory,就像是企业CA一样。不过独立CA并不会自动地验证Active Directory中的使用者,而且若没有人为的介入,它们也不会自动地发行凭证。</span><span id=Layer95></font></p><p><font size=2 color=#3c3c3c face=arial>独立CA通常需要人为的介入才能发行一张凭证</span><span id=Layer96></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=Layer97></font></p><hr><p><font size=2 color=#3c3c3c face=arial>在大部份的公司中,绝大多数的CA都是企业CA,不过有一些情况下独立CA才是正确的选择。举例来说,想像一下一个商务的CA,如VeriSign,可能使用这类的软体。当使用者要求凭证时能自动地发行(类似企业CA一样)可能意义不大,一个商务的CA通常会离线以执行使用者识别码的验证工作。在发行凭证之前需要人为介入的独立CA恰好符合这类情况的要求。独立CA对於自行产生CA阶层的公司也是很有用的。因此在阶层中的CA大部份是企业CA,则根CA应该是独立CA。</span><span id=Layer98></font></p><p><font size=2 color=#3c3c3c face=arial>独立CA在某些情况下是很有用的</span><span id=Layer99></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=Layer100></font></p><hr><p><font size=2 color=#3c3c3c face=arial>回顾一下根CA只发行凭证给它阶层中下一层的CA,而非发行给终端使用者。虽然使用独立CA发行凭证给使用者可能会不太方便,让企业CA使用Active Directory验证使用者的存在比较好,然後再发行凭证,相对地直接在根之下的CA数量很少。更重要的是颁发凭证给根CA之下的新CA是很要紧的事,若使用有使用者介入的独立CA可能是一件好事。最後,在阶层的根使用独立CA允许保护CA执行所在的机器,它不一定要上线。</span><span id=Layer101></font></p><p><font size=2 color=#3c3c3c face=arial>依赖於CA的类型以及存在於阶层中的位置,一个使用Windows 2000 Certificate Services的CA实例可以组态成下面四种类型:</span><span id=Layer102></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> 企业根CA</span><span id=Layer103> </b></font>扮演阶层中最上层的CA角色。企业根CA只发行凭证给其它的CA使用,它们不直接发行凭证给使用者。因为它们位於CA阶层中的根,每个企业根CA都拥有一个自行签署的凭证。</span><span id=Layer104></li><br></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b> 企业次级CA</span><span id=Layer105> </b></font>在某些企业的阶层中非根的CA。它的凭证是由其它CA发行的,如企业根CA或其它的企业次级CA。</span><span id=Layer106></li><br></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b> 独立根CA</span><span id=Layer107> </b></font>类似一个独立根CA,不过若没有人为的介入并不会发行凭证。</span><span id=Layer108></li><br></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b> 独立次级CA</span><span id=Layer109> </b></font>类似一个企业次级CA,不过若没有人为的介入并不会发行凭证。</span><span id=Layer110></li><br></font></ul></font><p><font size=2 color=#3c3c3c face=arial>Certificate Service支援根与次级CA</span><span id=Layer111></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>Certificate Service支援根与次级CA</span><span id=Layer112></font></p><hr><p><font size=2 color=#3c3c3c face=arial>为了要管理以Windows 2000为基础,使用Certificate Services的CA,系统管理者可以使用凭证授权单位MMC嵌入单元 (Certification Authority Microsoft Management Console (MMC) snap-in)。这个工具允许执行基本的工作,如备份和还原CA的资料,以及更进阶的功能,如废止凭证、审核要求,以及在Active Directory中明确地为企业CA发行一个新CRL。</span><span id=Layer113></font></p><font color=#3e72d7 face=arial size=4><b>取得金钥与凭证</span><span id=Layer114></b></font><p><font size=2 color=#3c3c3c face=arial>每一个要使用公开金钥技术来进行验证的principal首先都要先获得一份金钥配对,以及一个包含有公开金钥的凭证。取得并安装这对金钥和凭证的过程,称作enrollment。在Windows 2000中,enrollment过程是依赖於CryptoAPI、Microsoft Certificate Services...等等。</span><span id=Layer115></font></p><p><font size=2 color=#3c3c3c face=arial>使用者透过enrollment 取得金钥配对和凭证</span><span id=Layer116></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>使用者透过enrollment 取得金钥配对和凭证</span><span id=Layer117></font></p><hr><p><font size=2 color=#3c3c3c face=arial>Windows 2000提供两种不同的使用者介面以进行enrollment:Certificates嵌入式管理单元,只有企业CA才能使用,以及一个简单的Web管理介面,可让其它类型的CA使用。Enrollment真正的工作都是透过一个COM元件完成的,称Certificate Enrollment Control。一开始,如图4-12,一个使用者以某些方式存取这个控制项。实际上,这通常是指使用者存取到一个网页,然後再呼叫到enrollment控制项服务,或者使用Certificates嵌入式管理单元中的Certificate Request精灵来做同样的事 。不管是如何存取的,控制项依赖於CryptoAPI以产生新的公开金钥配对,真正运作的过程则决定於使用的CSP。举例来说,基本的RSA CSP使用软体产生金钥配对,而智慧卡CSP可能依赖於卡上的硬体来产生金钥配对(虽然可能很慢)。不过不管如何产生的,不管使用的CSP是哪一种,新产生的金钥之私密金钥已被放到金钥存放区。对於基本的RSA CSP,私密金钥则储存在使用者电脑上的硬碟中,而智慧卡CSP则将私密金钥储存在卡片上。</span><span id=Layer118></font></p><p><font size=2 color=#3c3c3c face=arial>Enrollment依赖於一个COM元件</span><span id=Layer119></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>Enrollment依赖於一个COM元件</span><span id=Layer120></font></p><hr><br><center><a target=_new href=imagesh/4-12.gif><img border=0 src='imagesl/4-12.gif'></a></center></span><span id=Layer121><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b> 图4-12</span><span id=Layer122> </b></font>注册一个使用者需要产生一份金钥配对,建立一个包含公开金钥的凭证,然後将principal的私密金钥和凭证储存适当的地方。</span><span id=Layer123></td></table></font></center><p><font size=2 color=#3c3c3c face=arial>公开金钥将会回传到enrollment控制项,将principal的名称与其它资讯包装成PKCS #10讯息。接着这个讯息将使用要求者的私密金钥签署,然後传送到Certificate Services。Certificate Services使用要求中的资讯建立一个凭证,然後以PKCS #7讯息传回。伺服器也可能在Active Directory的使用者物件上发行一个新凭证。一旦凭证回传到发出要求的系统,enrollment控制项便将它储存在适当的地方,如客户端机器的个人存放区(以及私密金钥的参考),或(若使用智慧卡)同时储存在个人存放区,以及卡片上。现在每样东西都可以使用了。注意在这个过程中,使用者的私密金钥不会被跨网路传送,因此不会有金钥被盗取的情况发生。</span><span id=Layer124></font></p><p><font size=2 color=#3c3c3c face=arial>enrollment过程中建立金钥配对与凭证,然後将它们储存在适当的地方</span><span id=Layer125></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>enrollment过程中建立金钥配对与凭证,然後将它们储存在适当的地方</span><span id=Layer126></font></p><hr><p><font size=2 color=#3c3c3c face=arial>另一点值得提及的是,对於某些应用程式,如使用Internet Protocol(IP)等级安全性的应用程式,电脑本身就必须要有金钥配对与凭证。使用群组原则(Group Policy)有可能会导致网域中所有的电脑、组织单位(organizational unit,OU)或站台自动地要求enrollment。当金钥与凭证是每台电脑都需要时,使用这个自动凭证要求的特性能让系统管理者的生活更简单。</span><span id=Layer127></font></p><font color=#3e72d7 face=arial size=4><b>管理凭证废止清单(Certificate Revocation List)</span><span id=Layer128></b></font><p><font size=2 color=#3c3c3c face=arial>Windows 2000 Certificate Services可在Active Directory发行CRL。这也就是说,将它们储存成一个目录物件,以便让客户端存取。当一个身为Windows 2000网域中的新企业CA建立时,这个CA会在Active Directory中为它的CRL建立一个项目。系统管理者可以使用凭证授权单位嵌入式单元,新增一个凭证到CA的CRL。预设每星期会发行新版本的CRL到Active Directory一次,不过这个时间可以使用凭证授权单位嵌入单元更改之。</span><span id=Layer129></font></p><p><font size=2 color=#3c3c3c face=arial>CRL可以储存在Active Directory</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>CRL可以储存在Active Directory</span><span id=Layer131></font></p><hr><p><font size=2 color=#3c3c3c face=arial>对於一个使用凭证的系统来说,若要判断凭证是否已被废止,必须使用某些方法来找寻发行凭证的CA之CRL。为了达到这的目的,每个Windows 2000 CA产生的凭证包含一个延伸的属性栏位,称为CRL分送点 (CRL Distribution Point,也称为CDP)。这个栏位包含了Active Directory项目的名称,以LDAP URL表示,它包含了这个CA的CRL。若为了特定的凭证来检查CRL,则只要读取这个栏位,存取Active Directory中的CRL,然後看看凭证是否存在於此清单上。若存在於清单上,表示凭证已不再有效了。</span><span id=Layer132></font></p><p><font size=2 color=#3c3c3c face=arial>凭证中可以包含CA的CRL位址</span><span id=Layer133></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=Layer134></font></p><hr><p><font size=2 color=#3c3c3c face=arial>凭证可以使用其它方式发行,这也就是说,不使用Windows 2000 Certificate Services发行,同样也可以包含一个CDP属性。若是如此,则这个栏位中的URL便可以存取以便找寻适当的CRL。CRL有一个标准的格式,且由许多供应商所支援,因此它可以让许多的厂商使用。若要进行存取,则可能会使用到HTTP或LDAP协定,以存取内部网路或跨Internet存取。</span><span id=Layer135></font></p><font color=#3e72d7 face=arial size=4><b>控制凭证信任</span><span id=Layer136></b></font><p><font size=2 color=#3c3c3c face=arial>在Windows 2000网域中的每台电脑都有自己的凭证存放区。若一台电脑拥有某些CA发行的凭证,并储存在「信任的根目录凭证授权」凭证存放区(Trusted Root CA store),这说明了两件关於信任的事。第一,这部机器(延伸说法,执行在机器上的软体)信任这个根CA。第二,这部机器同时信任CA阶层中,这个根CA之下的每一个CA(除了被废止凭证的CA,或凭证过期了)。这就是说根CA凭证找到前往「信任的根目录凭证授权」凭证存放区的途径是极其重要的。若误信了不当的根CA,严重的後果将接踵而至。</span><span id=Layer137></font></p><p><font size=2 color=#3c3c3c face=arial>在「信任的根目录凭证授权」凭证存放区中,拥有自行签署凭证的CA将会和根CA信任</span><span id=Layer138></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=Layer139></font></p><hr><p><font size=2 color=#3c3c3c face=arial>判断你信任哪一个根CA需要人力完成,而不是技术上的问题。就之前所提及,Windows 2000自动地从许多商业CA安装凭证到机器的「信任的根目录凭证授权」凭证存放区。有可能某台机器的使用者也会在他自己的机器上安装根CA的凭证到「信任的根目录凭证授权」凭证存放区。不过这些凭证只有信任他,而非信任此台机器上的所有使用者。在典型的网域中,最佳的方案将是让系统管理者来判断要信任哪一个根CA。</span><span id=Layer140></font></p><p><font size=2 color=#3c3c3c face=arial>允许每一位终端使用者来决定该信任哪一个CA通常并不是个好主意,因为大部份的终端使用者对使用哪一种标准并没有什麽主意。当然,系统管理者也可以多花一些功夫来判断哪一个CA值得信任,不过这类的工作是值得付出的。</span><span id=Layer141></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=Layer142></font></p><hr><p><font size=2 color=#3c3c3c face=arial>一旦下定决策後,必需要有某种方式以便集中实施这项决定。Windows 2000提供许多方法以达到这个目的。第一种,也是最简单的选择便是:在一个Windows 2000的网域中,所有的根CA都是使用Windows 2000 Certificate Services实作的,当根CA安装时,这些根CA自行签署的凭证都自动地放在网域中所有机器的「信任的根目录凭证授权」凭证存放区。这是有意义的,因为网域中大概所有的机器与使用者都应该信任它的根CA所发行的凭证。</span><span id=Layer143></font></p><p><font size=2 color=#3c3c3c face=arial>某些CA凭证会自动地放到「信任的根目录凭证授权」凭证存放区</span><span id=Layer144></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=Layer145></font></p><hr><p><font size=2 color=#3c3c3c face=arial>第二个选择对一家拥有自己的根CA的公司,而这些CA并非执行在Windows 2000的机器上来说是最有用的。在这个情况下,便可以使用群组原则(Group Policy)将这些根CA的凭证写到「信任的根目录凭证授权」凭证存放区。使用群组原则选项,称为信任的根目录凭证授权(trusted root certification authority),系统管理者便可以指定哪一个CA凭证该放到一个站台中、一个网域中,或一个组织单位中所有Windows 2000电脑的「信任的根目录凭证授权」凭证存放区。</span><span id=Layer146></font></p><p><font size=2 color=#3c3c3c face=arial>某些CA凭证是使用群组原则放在「信任的根目录凭证授权」凭证存放区</span><span id=Layer147></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=Layer148></font></p><hr><p><font size=2 color=#3c3c3c face=arial>最後,一家公司可以使用Windows 2000的一个特性,称为企业信任原则(enterprise trust policy)。在这个情况下,系统管理者建立某些凭证信任清单(Certificate Trust List,也称为CTL),并签署数位签章。一个CTL包含一或多个外来的根凭证,不在自己网域中的CA阶层之根CA所发行的凭证。每一个CTL必须使用私密金钥签章,而此金钥所关联的凭证链以包含在「信任的根目录凭证授权」凭证存放区中的根凭证终结,例如管理员的私密金钥。杂凑这些根CA的CTL可以指出哪些外部根CA所发行的凭证是可信任的。例如,某些只被信任发行安全电子邮件的凭证(secure e-mail),而其他的可以被信任发行更多目的的凭证。这额外的特色是网域管理员可能选择使用CTL而不是只是增加更多的凭证到「信任的根目录凭证授权」凭证存放区中的原因之一。一旦定义好了,CTL可以经由群组原则发布到一个站台、一个网域,或一个组织单位中所有的机器电脑。然後它所包含的CA凭证将会自动加到企业信任存放区里。当一个凭证链被查证但结束的根凭证并不在「信任的根目录凭证授权」凭证存放区中时,企业信任存放区接着被寻找来看看这个根凭证有否包含在合法的CTL内。如果答案是肯定的,而且这个凭证的使用也合乎发行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><font color=#3e72d7 face=arial size=4><b>拼凑所有碎片:验证数位签章</span><span id=Layer152></b></font><p><font size=2 color=#3c3c3c face=arial>若要了解如何将这些东西拼凑在一起,则说明数位签章真正运作的过程是很有用的。牵涉到的部份显示於图4-13。困难的工作已经被CryptoAPI隐藏起来了,不过了解运作的过程还是很有用的。</span><span id=Layer153></font></p><p><font size=2 color=#3c3c3c face=arial>一开始,假设某些应用程式已取得一个数位签章,同时也取得建立这个签章的principal之终端凭证(end-entity certificate)或完整的凭证链。举例来说,这个应用程式可能是一台IIS伺服器,刚接收到某些客户端传送而来的资讯。假设这个资讯是由SSL交换提供的,SSL SSP将会依赖CryptoAPI来验证签章。目标是判断客户端的身份。</span><span id=Layer154></font></p><br><center><a target=_new href=imagesh/4-13.gif><img border=0 src='imagesl/4-13.gif'></a></center></span><span id=Layer155><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b> 图4-13</span><span id=Layer156> </b></font>验证一个数位签章可能需要找到凭证、检查CRL等等。</span><span id=Layer157></td></table></font></center><p><font size=2 color=#3c3c3c face=arial>在Windows 2000的环境中,验证一个数位签章需要很多东西。第一,验证的程序必须能够建构一个凭证链(由终端凭证到根CA),而凭证链包含的必须是有效、未过期的凭证。在这个简单的案例中,将被验证数位签章的principal将会提供一个完整的凭证链。即使principal只提供一个终端凭证,验证的程序也必须能建构一个适当的凭证链。同样地,凭证链中根CA的凭证必需存在於「信任的根目录凭证授权」凭证存放区,这代表IIS伺服器执行所在的机器信任根CA,以及阶层中其下的CA。当然,凭证链中所有凭证上的所有签章都必须正确地核对,以确保凭证本身的完整性与可信赖性。最後,principal的数位签章本身必须正确,证明它是使用principal的私密金钥建构的。</span><span id=Layer158></font></p><p><font size=2 color=#3c3c3c face=arial>验证数位签章要找寻凭证、检查CTL...等等</span><span id=Layer159></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>验证数位签章要找寻凭证、检查CTL...等等</span><span id=Layer160></font></p><hr><p><font size=2 color=#3c3c3c face=arial>在图4-13的范例中,只有提供一个签章和终端凭证,而SSL SSP将这两个东西传到适当的CryptoAPI呼叫。现在CryptoAPI必须获得建构完整凭证链所需的凭证,直到根CA。这个过程开始於它企图找寻发行终端凭证的CA之凭证。这个凭证必须已经储存在这台机器上的某 个凭证存放区中,因此CryptoAPI会先检查这个地方。若找不到,CryptoAPI便查询终端凭证中延伸的属性栏位,这个栏位称为授权资讯存取(Authority Information Access)。这个栏位包含一个URL,告诉CryptoAPI到哪儿去找签署这个凭证的CA之凭证。透过这个URL,CryptoAPI便可以取得CA的凭证。若这个凭证是由根CA而来的,也就是说凭证是自行签署的,则这个程序就停止了。若这个凭证不是来自根CA,CryptoAPI接下来便得要找寻签署这个凭证的CA之凭证。就像前面一样,它会先搜寻本机机器的凭证存放区以找寻凭证,若找不到,CryptoAPI会再度从获得凭证的URL萃取直到CryptoAPI建构了完整的凭证链,这个程序才会继续往下进行。</span><span id=Layer161></font></p><p><font size=2 color=#3c3c3c face=arial>CryptoAPI 并不会进行签章验证的动作</span><span id=Layer162></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>CryptoAPI 并不会进行签章验证的动作</span><span id=Layer163></font></p><hr><p><font size=2 color=#3c3c3c face=arial>当CryptoAPI建构凭证链时,它会验证每一个连结都是有效的,如</span><span id=Layer164> <a href=" #4-8" target=_new>图4-8</span><span id=Layer165></a> 所示。若应用程式要求,CryptoAPI也可以找到每个凭证所在的URL,然後检查凭证是否被废止了。若凭证链的任何凭证被废止了,验证数位签章的过程就会失败。而在取得凭证链中凭证的过程中,新取得的凭证是放在这台机器上的中继CA存放区。若这些凭证在未来还有需要,它们可以透过网路来寻找。</span><span id=Layer166></font></p><p><font size=2 color=#3c3c3c face=arial>新找到的根凭证并不会自动地加入「信任的根目录凭证授权」凭证存放区。</span><span id=Layer167></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=Layer168></font></p><hr><p><font size=2 color=#3c3c3c face=arial>一旦这些工作都完成了,CryptoAPI便企图验证这个签章。若运作的良好,同时若凭证链上方的凭证是在「信任的根目录凭证授权」凭证存放区找到的,或者它是有效的CTL之一部份,这个签章便已验证了,这个呼叫将会成功的回传。若发生错误,CryptoAPI呼叫将会回传验证失败给呼叫它的应用程式。</span><span id=Layer169></font></p><p><font size=2 color=#3c3c3c face=arial>基於数位签章与凭证的验证动作是很复杂的过程。特别是考虑到在整个PKI庞大架构时,CA阶层、智慧卡等等。当然复杂性大多隐藏起来了,因此使用者或程式设计师是看不到的。也因为它的功能如此强大,也能广泛使用,使得公开金钥技术更能深入更多的应用程式之中。</span><span id=Layer170></font></p><p><font size=2 color=#3c3c3c face=arial>公开金钥技术已被广泛使用</span><span id=Layer171></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>公开金钥技术已被广泛使用</span>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -