12.1.1 安全连接.htm

来自「Windows2000后台服务程序开发手册」· HTM 代码 · 共 734 行 · 第 1/5 页

HTM
734
字号
            size=2><FONT style="LINE-HEIGHT: 25px" face=arial color=#3e80d7 
            size=2><B 
            style="LINE-HEIGHT: 25px">&nbsp;许可证(Ticket) 许可证&nbsp;</B></FONT>是个资讯封包,该资讯的内容由客户端持有,包含可让服务器验证之客户端资讯。这个封包被命名为许可证,因为它的资讯是客户端「使用」服务器的「许可证」。</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>
            <UL style="LINE-HEIGHT: 25px">
              <LI style="LINE-HEIGHT: 25px">持有许可证的客户端身分识别。这是使用者名称及Windows 
              2000的网域资讯。<BR style="LINE-HEIGHT: 25px">  
              <LI 
              style="LINE-HEIGHT: 25px">用服务器的密码将工作阶段金钥加密。这个私密金钥用来加密及解密任何客户端及服务器间通讯的资料<BR 
              style="LINE-HEIGHT: 25px">  
              <LI style="LINE-HEIGHT: 25px">建立时间及到期时间。<BR 
              style="LINE-HEIGHT: 25px">  
              <LI style="LINE-HEIGHT: 25px">附加的资讯及标记。<BR 
              style="LINE-HEIGHT: 25px">  </LI></UL></FONT>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>许可证由金钥发行中心或KDC产生。在许可证内找到的秘密工作阶段金钥适用于服务器的密码加密,只有KDC及服务器知道这个密码。尽管KDC将许可证授予客户端,但是许可证的加密部分对客户端来说并非透明的,而且只由要求的服务器使用。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>客户端要求与特定服务器使用的许可证,然后KDC会授予这些许可证。与服务器的验证通讯可以使用及重复使用许可证,直到时间届满为止,那时候,就必须从KDC授予客户端新的许可证。</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>许可证的有效期间定义了与服务器的工作阶段。这个工作阶段会持续到许可证届期或客户端丢弃此许可证为止。服务器不会储存这个许可证,所以验证(从服务器的观点)并没有状态(Stateless)。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>现在我要叙述一个非常重要的工作阶段,即是客户端与KDC的工作阶段。这也是客户端必须通过叁个阶段中的第一个阶段,用来向服务器验证它自己。图12-2中显示了使用Kerberos通讯协定之开始到结束的整个验证程序。</FONT></P></A>
            <CENTER style="LINE-HEIGHT: 25px">
            <P><INPUT id=1 style="LINE-HEIGHT: 25px" type=image height=488 
            width=700 src="12.1.1 安全连接.files/12-2.gif" border=0 
            &#111nclick="imgclick"> </P></CENTER>
            <CENTER style="LINE-HEIGHT: 25px">
            <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">&nbsp;图12-2&nbsp;</B></FONT>Kerberos协定验证程序</FONT></TD></TR></TBODY></TABLE></CENTER>
            <P><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">&nbsp;ticket-granting 
            ticket(第一阶段)&nbsp;</B></FONT>如前所述,KDC建立许可证并把它们传递到要求的客户端中。然而,KDC本身是个服务器,而客户端必须维持一个与KDC一起使用的许可证。因为客户端会使用KDC撷取与系统中其他服务器一起使用的许可证,所以客户端与KDC一起使用的许可证被称为ticket-granting 
            ticket或TGT。这是客户端从KDC要求的第一个许可证,而且它定义了一个与KDC一起的工作阶段。以下是取得TGT的步骤:</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">&nbsp;步骤一&nbsp;</B></FONT>客户端传送一个ticket-granting 
              ticket要求给KDC(Microsoft已经定义事先向KDC要求验证使用者的额外资料。这个资讯不是Kerberos定义的一部分,而且它对我们的讨论并不重要)。<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">&nbsp;步骤二&nbsp;</B></FONT>KDC传送带有经由客户端密码加密之私密金钥的ticket-granting 
              ticket到客户端。这个私密金钥是未来与KDC通讯的工作阶段金钥。<BR style="LINE-HEIGHT: 25px">  
              </LI></UL></FONT>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>现在客户端已经持有工作阶段金钥及许可证,它可以在未来对许可证的要求中与KDC一起使用。传回客户端的工作阶段金钥已使用客户端的密码加密过。假如客户端在它的身分识别上作假,则它将无法解开工作阶段金钥,而且ticket-granting 
            ticket对它来说是无用的。这是因为所有未来将与KDC的通讯中都会使用工作阶段金钥。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>跟所有的许可证一样,ticket-granting 
            ticket有一个经由服务器密码及到期资讯加密的工作阶段金钥。只要客户端持有KDC的未到期TGT,它就能参加服务器的工作阶段。</FONT></P>
            <P><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">&nbsp;要求一个许可证(第二阶段)&nbsp;</B></FONT>当客户端想要初始与服务器一起验证的工作阶段时,首先必须从KDC要求这个工作阶段的许可证。在它能这样做之前,必须持有与KDC一起使用的ticket-granting 
            ticket。这已经在第一阶段中建立。以下为客户端要求与服务器一起使用之许可证所采取的步骤:</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">&nbsp;步骤一&nbsp;</B></FONT>客户端传送请求许可证到KDC。这个请求包括以下资讯:<BR 
              style="LINE-HEIGHT: 25px">  
              <UL style="LINE-HEIGHT: 25px">
                <LI 
                style="LINE-HEIGHT: 25px">授权者(Authenticator)(客户端的身分识别及时戳),它被客户端为了要与KDC通讯而持有的工作阶段金钥所加密。<BR 
                style="LINE-HEIGHT: 25px">  
                <LI style="LINE-HEIGHT: 25px">ticket-granting ticket。<BR 
                style="LINE-HEIGHT: 25px">  
                <LI style="LINE-HEIGHT: 25px">客户端请求许可证的服务器。<BR 
                style="LINE-HEIGHT: 25px">  </LI></UL>
              <LI style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
              face=arial color=#3e80d7 size=2><B 
              style="LINE-HEIGHT: 25px">&nbsp;步骤二&nbsp;</B></FONT>KDC经由对内部持有之工作阶段金钥的解密而开启TGT(使用它自己的秘密密码)。KDC用这个工作阶段金钥对授权者解密。假如解密成功,表示客户端被KDC认证,然后KDC会为客户端建立所要求的许可证。<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">&nbsp;步骤叁&nbsp;</B></FONT>KDC传送所要求的许可证回到客户端(许可证包含只有KDC及服务器知道的密码所加密的工作阶段金钥副本)。KDC也传递经由与客户端TGT关联的秘密工作阶段金钥加密的工作阶段金钥(与服务器一起使用)到客户端。<BR 
              style="LINE-HEIGHT: 25px">  </LI></UL></FONT>
            <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 style="LINE-HEIGHT: 25px" face=arial color=#3e80d7 
            size=2><B 
            style="LINE-HEIGHT: 25px">&nbsp;与服务器一起验证(第叁阶段)&nbsp;</B></FONT>最后,只有客户端持有与服务器验证的许可证时,客户端才会开始与服务器通讯。这个许可证在第二阶段被授予。以下为客户端与服务器验证时所采取的步骤:</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">&nbsp;步骤一&nbsp;</B></FONT>客户端传送验证的请求到服务器,这个请求包括了以下的资讯:<BR 
              style="LINE-HEIGHT: 25px">  
              <UL style="LINE-HEIGHT: 25px">
                <LI 
                style="LINE-HEIGHT: 25px">授权者(客户端的身分识别及时戳),它被客户端为了这个工作阶段而持有的工作阶段金钥所加密。<BR 
                style="LINE-HEIGHT: 25px">  
                <LI style="LINE-HEIGHT: 25px">客户端为这个工作阶段所持有的许可证。<BR 
                style="LINE-HEIGHT: 25px">  </LI></UL>
              <LI style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px" 
              face=arial color=#3e80d7 size=2><B 
              style="LINE-HEIGHT: 25px">&nbsp;步骤二&nbsp;</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">&nbsp;步骤叁&nbsp;</B></FONT>假如客户端已经请求彼此验证,服务器会传送使用工作阶段金钥所加密的授权者到客户端。服务器不能对授权者做加密的动作,除非它持有工作阶段金钥,证明它就是所请求的服务器。<BR 
              style="LINE-HEIGHT: 25px">  </LI></UL></FONT>
            <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>跟KDC一样,服务器不储存它的许可证,而这样的使用方法即是没有状态的(Stateless)验证。这意味着客户端想要与服务器通讯的每个连续时间都需要执行第叁阶段。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>注意&nbsp;</FONT></A><FONT style="LINE-HEIGHT: 25px" face=arial 
            color=#000000 size=2><A style="LINE-HEIGHT: 25px" 
            href="http://www.acejoy.com/doc/serverside/12.htm#619_1" 
            target=_new>图12-2</A>&nbsp;的内容,与服务器的通讯直到第叁阶段才开始。服务器及KDC间从未通讯,这是现行NTLM验证方案值得注意及改进的地方。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>如前所述,Kerberos通讯协定涵盖的范围并不包含每个通讯协定的细节。然而,此叙述提供了一些观点,当我们开始讨论使用安全性通讯协定的程序设计时,您会发现它是很有帮助的。</FONT></P><A 
            style="LINE-HEIGHT: 25px" name=212003>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#3e70d7 
            size=5><B style="LINE-HEIGHT: 25px">Windows 2000开发人员服务<BR 
            style="LINE-HEIGHT: 25px">  </B></FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>在讨论程序代码之前,我想先提Windows 
            2000所提供用来帮助开发人员处理密码学、凭证及安全性通讯协定的特别APIs,或函数群组的部份。</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>从我们先前就密码学所进行的讨论中可以想像,使用加密的软件必须考虑一些细节。它至少必须能够建立及维持金钥。而且它也要能够使用这些金钥来对资料加密及解密。</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>幸运地是,CryptoAPI(也被称为CAPI)提供了所有管理金钥及凭证,和加密及解密资料所需的功能。假如您的客户端及服务器软件要使用您自己的安全性通讯协定时,CryptoAPI会很有帮助。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>在您要使用现有的安全性通讯协定,而不想担心密码学及金钥管理的细节时,应该感谢Security Support 
            Provider Interface(SSPI)。</FONT></P>
            <HR style="LINE-HEIGHT: 25px">

            <P><FONT style="LINE-HEIGHT: 25px" face=Arial color=#3e77d7 size=3 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?