12.2.2 安全连接.htm
来自「Windows2000后台服务程序开发手册」· HTM 代码 · 共 387 行 · 第 1/3 页
HTM
387 行
<A href="javascript:fontColor('ArticleBody')"><IMG alt=字体颜色
src="12.2.2 安全连接.files/fgcolor.gif" align=absMiddle
border=0></A>]</DIV></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=5 cellPadding=0 width="100%" align=center border=0>
<TBODY>
<TR>
<TD vAlign=top>
<TABLE cellSpacing=0 cellPadding=10 align=left border=0>
<TBODY>
<TR>
<TD></TD></TR></TBODY></TABLE>
<DIV class=content id=ArticleBody
style="PADDING-RIGHT: 10px; DISPLAY: block; PADDING-LEFT: 10px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px">
<P class=content>
<TABLE border=0>
<TBODY style="LINE-HEIGHT: 25px">
<TR>
<TD align=middle><FONT style="LINE-HEIGHT: 25px" face=arial
color=#000000 size=2><FONT style="LINE-HEIGHT: 25px"
face=arial color=#3e80d7 size=2><B
style="LINE-HEIGHT: 25px"> 图12-6 </B></FONT>SSPIChat范例应用程序的使用者介面</FONT></TD></TR></TBODY></TABLE>
<CENTER></CENTER>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>使用这个范例时,您应该连线到网路的同一台机器或不同机器上执行一次以上。这个范例应用程序使用TCP/IP通讯的方式。您可以在初始会谈之前选择要使用的安全性提供者,也可以选择是否要执行彼此验证、加密或委派的动作。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>委派的特色使服务器建立了第二个假定为客户端身分识别的交谈视窗。然后新的视窗可以被用来对将它看做原始客户端的第叁个服务器扮演客户端(假如服务器机器未被委派信任,这个特色将会失败)。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>由于通讯层独立的精神,使这个范例应用程序中的通讯功能被抽象化为CTransport类别,它包括了SendData及ReceiveData函数。这两个函数非常像我在本章的程序代码片段中使用的虚拟函数。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>在此强烈地建议您在试图使用SSL(在本章稍后讨论)编写SSPI程序代码前,先熟悉这个应用程序的范例程序代码。SSPI程序设计模组是很复杂的,而它也带来了少数的说明。所以适应全部的方法将会使SSL令人感到更愉快。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#3e72d7
size=4><B style="LINE-HEIGHT: 25px">CryptoAPI<BR
style="LINE-HEIGHT: 25px"> </B></FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>CryptoAPI或者CAPI,产生用来加解密资料的金钥和输出金钥并安全地分享它们,它提供了一组完整的函数。CryptoAPI也包括完全支援凭证及凭证管理的部份。CryptoAPI提供的密码学及凭证函数被定义在WinCrypt.h中;您的程序代码应该包含这个标头文件。您也应该确实连结Crypt32.lib程序库文件。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>CryptoAPI提供如此丰富的特色,使您可以用它的函数来为不安全网路环境上的通讯实作您自己的安全通讯协定。然而,SSPI已经为我们免费做了这些工作。事实上,SSPI因为实作密码需求而使用CryptoAPI。假如您对建立自己的安全通讯协定有兴趣的话,即可以使用CryptoAPI。然而,对于大部分的专案来说,您应该使用SSPI所支援的通讯协定。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>在两个情况下,使用CryptoAPI是有效的,因为SSPI不能为您做这个工作。说明如下:</FONT></P><FONT
style="LINE-HEIGHT: 25px" face=arial color=#000000 size=2>
<UL style="LINE-HEIGHT: 25px">
<LI style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
face=arial color=#3e80d7 size=2><B
style="LINE-HEIGHT: 25px"> 非工作阶段相关的密码学 </B></FONT>包括文件密码学或任何其他不会在工作阶段导向环境中被传输的加密持续资料。<BR
style="LINE-HEIGHT: 25px">
<LI style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
face=arial color=#3e80d7 size=2><B
style="LINE-HEIGHT: 25px"> 凭证管理 </B></FONT>当我们使用SSPI讨论SSL时,您将看到通讯协定之关键性凭证的内容。凭证管理由CryptoAPI套件执行。<BR
style="LINE-HEIGHT: 25px"> </LI></UL></FONT>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>持续资料的加密并非常见的需求,而且因为Windows 2000的加密文件系统(Encrypted File
System,EFS)已经完全地支援它,所以我们不在此处说明这个特殊的CryptoAPI用法。假如您对使用这个CryptoAPI加密的类型有兴趣的话,可以在《Platform
SDK》文件中找到完整叙述。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>然而,凭证管理是SSL安全性通讯协定不可或缺的部分。事实上,在我们开始讨论SSL之前,必须花些时间讨论使用CryptoAPI之凭证管理的部份。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#3e74d7
size=3><B style="LINE-HEIGHT: 25px">凭证存放档<BR
style="LINE-HEIGHT: 25px"> </B></FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>Windows在<FONT style="LINE-HEIGHT: 25px" face=arial
color=#3e80d7 size=2><B
style="LINE-HEIGHT: 25px"> 存放档(stores) </B></FONT>中管理凭证。CryptoAPI可让您管理许多不同种类的存放档、单一使用者的个人存放档、机器的存放档,以及只存在于内存中的暂时存放档。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>当您在建立存放档时,可以指定为它预留的媒介。或是它根本不必预留。存放档中包含凭证,如您所知的,凭证是为了验证、签章及加密时而使用的。然而在处理SSL时,除了机器的存放档(用它来储存服务器凭证)或者是个人存放档(被用来储存客户端凭证)以外,您不太可能会需要处理任何的存放档。现在我要叙述几个方案。</FONT></P><FONT
style="LINE-HEIGHT: 25px" face=arial color=#000000 size=2>
<UL style="LINE-HEIGHT: 25px">
<LI style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
face=arial color=#3e80d7 size=2><B
style="LINE-HEIGHT: 25px"> 方案一 </B></FONT>您设计了一个使用SSL通讯的服务,它使用本机帐户在机器上执行。此时客户端将验证服务器,但是服务器并不验证客户端。您可能会为这个服务建立一个凭证(及相配的私密金钥),并把它们储存在您主机系统中的机器存放档里。服务器经由它常见的名称得知它的凭证是哪个。当服务连结到客户端时,会使用CryptoAPI查询它的凭证,然后再使用这个凭证初始使用SSPI及SSL的通讯工作阶段。在这个情况下,服务器知道要在机器存放档里查询凭证。<BR
style="LINE-HEIGHT: 25px"> </LI></UL></FONT>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>经过验证之后,客户端即拥有线上传输的凭证副本。尽管客户端不传回凭证,它仍然必须将凭证中的资讯解开,以找出它是否有连结到寻找的服务器。使用Windows
2000时,SSL会对照客户端信任的CA而自动地验证凭证链,也会在服务器名称(客户端要求的)及服务器凭证上的常见名称间作对照。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>然而,您的客户端可以选择使用CryptoAPI函数开启凭证,取出常见的名称,并且对照预期接收之公开凭证所知的常见名称。假如名称不相符,客户端可以选择关闭连线,因为服务器可能已经被恶意的第叁者欺骗。尽管Windows
2000会为您执行这个测试动作,但是早期的Windows版本并不这样做,所以它是个应该被熟悉的好技术。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>您必须确信CA不会使用相同的名称发行凭证给多方,因此从这个凭证提供者到下一个的区域原则是可以改变的。</FONT></P>
<HR style="LINE-HEIGHT: 25px">
<P><FONT style="LINE-HEIGHT: 25px" face=Arial color=#3e77d7 size=3
Black><B style="LINE-HEIGHT: 25px">说明</B></FONT> </P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>凭证的常见名称是个简单的文字字串,不过请记得使用凭证授权单位的私密金钥来对凭证做签章。这表示当您使用CA的公开金钥开启凭证时,凭证上的资讯并没有被改变。浏览器软件使用凭证的常见名称执行对凭证及浏览器连结的URL做字元对字元的比较。假如名称不相符,浏览器会认为安全性已经被破坏。</FONT></P>
<HR style="LINE-HEIGHT: 25px">
<FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 size=2>
<UL style="LINE-HEIGHT: 25px">
<LI style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
face=arial color=#3e80d7 size=2><B
style="LINE-HEIGHT: 25px"> 方案二 </B></FONT>除了服务器并非使用本机帐户执行,而是用只为服务建立的特殊帐户执行以外,一切都与方案一所述相同。就凭证而言,唯一的主要差别即是您(服务器的管理者)要将凭证储存在服务器帐户的个人存放档档中。这是因为服务器的帐户可能不是主控机器的管理者,这样一来将无法存取机器凭证存放档。所以您必须知道如何存取个人帐户。<BR
style="LINE-HEIGHT: 25px">
<LI style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
face=arial color=#3e80d7 size=2><B
style="LINE-HEIGHT: 25px"> 方案叁 </B></FONT>不管您的服务器是否存取机器帐户或个人帐户,皆必须考虑到第叁个方案。假如您的服务器从您的客户端要求凭证,则您的客户端跟服务器一样,必须采用类似的凭证寻找方法。<BR
style="LINE-HEIGHT: 25px"> </LI></UL></FONT>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>当连线成功时,您的客户端将在它的机器上查询凭证,并使用那个凭证初始SSL会谈。因为大部分的客户端软件会在互动式使用者帐户下执行,您的客户端软件可能必须知道如何经由常见的名称而从个人存放档中寻找凭证,然后再跨越线路传送它。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>假如您将要编写处理任何一个方案的软件,这里是您必须能够用CryptoAPI执行的工作:</FONT></P><FONT
style="LINE-HEIGHT: 25px" face=arial color=#000000 size=2>
<OL style="LINE-HEIGHT: 25px">
<LI style="LINE-HEIGHT: 25px">开启凭证存放档。
<LI style="LINE-HEIGHT: 25px">经由常见的名称查询凭证。
<LI style="LINE-HEIGHT: 25px">将凭证解密(传递给您的)。
<LI style="LINE-HEIGHT: 25px">查询解密凭证的常见名称(与所知的名称作比较)。
</LI></OL></FONT>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>您可以使用CryptoAPI执行所有工作。然而,有一个没有提到的必要工作-取得凭证。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#3e74d7
size=3><B style="LINE-HEIGHT: 25px">取得凭证<BR
style="LINE-HEIGHT: 25px"> </B></FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>取得凭证是个复杂的主题,主要是因为它可以使用不同的方法执行。此处我将给您一些开始的要点,但是您必须研究您的选择,并决定哪个方式对您最好。以下有两个主要的方法:</FONT></P><FONT
style="LINE-HEIGHT: 25px" face=arial color=#000000 size=2>
<OL style="LINE-HEIGHT: 25px">
<LI style="LINE-HEIGHT: 25px">从公开凭证授权单位购买凭证。
<LI style="LINE-HEIGHT: 25px">使用Microsoft凭证服务执行您自己的凭证授权单位。
</LI></OL></FONT>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>第一个方法牵涉到与第叁方的互动,例如VeriSign或Thawte等等,为您的服务器软件取得凭证。这些第叁方将储存有关您的公司及凭证用途的资讯,然后它们将给您一个经由它们签章过的凭证,这是免费的。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>这个方案的好处是已知的凭证授权单位大部份预设被操作系统所信任。所以客户端软件(或使用者)在识别您服务器的凭证时,不会有任何额外的麻烦。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>某些公开的凭证授权单位很乐意发给您经授权单位签章的测试用凭证,您可以用它来测试他们所提供的各项服务。某些公司可以免费提供这些暂时的凭证。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>第二个方法则需要执行Microsoft的凭证服务。这个方法很好,只是您必须确定让您的客户端软件信任经您设定的凭证授权单位。如果您的客户端及服务器在相同的企业环境中执行,则您可能会想采用这个方法。假如您的客户端及服务器在Internet环境中执行时,您仍然可以采用这个方法,但是您的客户端软件必须知道如何帮助使用者经由您的CA建立信任关系。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>一旦拥有凭证后就可以使用Microsoft管理主控台(MMC)的凭证嵌入式管理单元从某个系统管理凭证或将它移到另一个系统中。这可让您在不同的情形下,使用单一的凭证来测试运作情形。例如,您可以建立一个服务器凭证,把它拖拉到机器的Personal凭证资料夹中,然后在机器帐户下测试您的服务器。以后当您决定在使用者帐户下执行您的服务器程序时,您便可以在使用者嵌入式管理单元中把凭证移到该使用者帐户下的Personal凭证资料夹中。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#3e74d7
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?