12.1.2 安全连接.htm
来自「Windows2000后台服务程序开发手册」· HTM 代码 · 共 569 行 · 第 1/3 页
HTM
569 行
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 style="LINE-HEIGHT: 25px">较低的效率及可伸缩性,与Kerberos比 较。<BR
style="LINE-HEIGHT: 25px"> </LI></UL></FONT></TD></TR>
<TR>
<TD><FONT style="LINE-HEIGHT: 25px" size=2>Secure Sockets
Layer/Transport Layer Security(SSL/TLS)</FONT></TD>
<TD><FONT style="LINE-HEIGHT: 25px" size=2>Windows 2000、<BR
style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
face=arial color=#000000 size=2>Windows NT</FONT></FONT></TD>
<TD><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>
<UL style="LINE-HEIGHT: 25px">
<LI style="LINE-HEIGHT: 25px">使用凭证及公开金钥基础建设(PKI)验证。<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 style="LINE-HEIGHT: 25px">好的可伸缩性。<BR
style="LINE-HEIGHT: 25px"> </LI></UL></FONT></TD></TR>
<TR>
<TD><FONT style="LINE-HEIGHT: 25px"
size=2>协商(Negotiate)</FONT></TD>
<TD><FONT style="LINE-HEIGHT: 25px" size=2>Windows 2000、<BR
style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
face=arial color=#000000 size=2>Windows NT</FONT>、<BR
style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
face=arial color=#000000 size=2>Windows 95/98</FONT></FONT></TD>
<TD><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>
<UL style="LINE-HEIGHT: 25px">
<LI style="LINE-HEIGHT: 25px">这个特殊通讯协定可让客户端及服务器
协商最适合使用的通讯协定。客户端应 该不要使用协商的功能,但是应该选择 它所支援之最好的通讯协定。服务器可
以使用协商通讯协定,不管客户端选择的 通讯协定是什么。<BR style="LINE-HEIGHT: 25px">
</LI></UL></FONT></TD></TR></TBODY></TABLE></CENTER>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>如同您在表12-1所看到的,在开发安全的服务器时,您可以有数个选择。对于企业软件,您可以在客户端及服务器软件间选择使用Kerberos、NTLM或协商通讯。至于Internet服务器软件,则有些原因使得必须使用SSL,这些部份将在稍后讨论。</FONT></P></A><A
style="LINE-HEIGHT: 25px" name=212004>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#3e70d7
size=5><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>SSPI提供了一组常见的函数,可以被用来验证客户端及服务器,并且在您软件的通讯中保证资料的私密性及完整性。SSPI被设计为Windows支援之多种SSPs所建立的一般介面,而且它做到了极大的范围。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>这一节我们要讨论如何经由Kerberos及NTLM通讯协定使用SSPI初始客户端及服务器之间的通讯。SSPI以相同的程序代码做些稍微的修改,就可被用来利用Kerberos及NTLM的方式。因为种种的安全性通讯协定,使得某些SSPs会使您的SSPI程序代码大大地偏离其他通讯协定的SSPI程序代码。SSL是此类SSP的例子,因此,我们将在本章稍后以单独一节讨论SSL的内容。</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>SSPI函数组在Windows 95/98、Windows NT及Windows
2000上皆可取得。在您的服务器及客户端软件应该都会使用到SSPI,因此在所有平台上都可得到SSPI函数是非常有帮助的。从这个平台到下一个,基本上这些函数的使用是相同的,但是也有某些细节是不同的。
本书着重在Windows
2000的软件开发,并且包含这个平台所使用的SSPI。本章讨论的观念可以在其他平台上执行时,作为您的SSPI程序代码的指导指南。有关平台之间的差异,请查阅《Platform
SDK》文件。</FONT></P>
<HR style="LINE-HEIGHT: 25px">
<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>假如您要在程序代码中使用SSPI函数,应该要确定您的原始程序代码中有包含Security.h标头档。此外,您必须将Secur32.lib与您的应用程序连结。</FONT></P>
<HR style="LINE-HEIGHT: 25px">
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#3e72d7
size=4><B style="LINE-HEIGHT: 25px">凭证(Credentials)、内容(Contexts)<BR
style="LINE-HEIGHT: 25px"> </B></FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#3e72d7
size=4><B style="LINE-HEIGHT: 25px">及二进制大型物件 (Blobs)<BR
style="LINE-HEIGHT: 25px"> </B></FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>SSPI依据两种您非常熟悉的资料所建构,分别是<FONT style="LINE-HEIGHT: 25px"
face=arial color=#3e80d7 size=2><B
style="LINE-HEIGHT: 25px"> 凭证 </B></FONT>及<FONT
style="LINE-HEIGHT: 25px" face=arial color=#3e80d7 size=2><B
style="LINE-HEIGHT: 25px"> 内容 </B></FONT>。凭证是允许验证的资料,这个资料可以是使用者名称及密码,或使用公开金钥基础建设(PKI)的签章资讯。您将看到的任何SSPI交换,其客户端及服务器都将建立它们在交换中想要使用的凭证。凭证本身存在于SSPI的外部,而您将使用SSPI来撷取凭证的handle。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>SSPI函数将使用您的客户端或服务器软件所建立的凭证来产生使用者内容。客户端及服务器软件将互相传递它们的内容,并提供验证。服务器软件也能够模拟客户端传送给它的使用者内容。内容中不包含凭证资讯,但却包含来自凭证以及在通讯工作阶段中使用的资讯。这些资讯可以包括工作阶段金钥、Kerberos许可证及其他有关安全性的资料。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>您的软件将会维持由SSPI管理的凭证handles及内容的handles。同样地,您的软件将传递内容资讯到它的副本中,以使它能够在会谈的另一端建立内容资讯。服务器以SSPI所产生的安全性Blob形式传送内容到它的客户端(反之亦然)。当您的软件从SSPI接收Blob时,它应该要透过线路来传递。当您的软件从线路中接收Blob时,它会传递Blob到SSPI函数中。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>使用SSPI时,您将看到会谈的验证阶段转变成连续传送及接收Blobs的过程,它使SSPI为每一端建立使用者内容。因为完成验证的责任在服务器及客户端之间完全地分摊,所以逻辑的流程可能会令人感到困惑。但是它有助于了解相关元件及函数的内容。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>首先我将介绍服务器所使用的SSPI函数,然后再介绍客户端使用的函数,我们也将讨论它们互相影响的情形。最后我们将看看呼叫这些函数的细节。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#3e74d7
size=3><B style="LINE-HEIGHT: 25px">服务器及SSPI<BR
style="LINE-HEIGHT: 25px"> </B></FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>使用SSPI为安全连线的服务器时,最有可能这样做,达到下列的一或多个目标:</FONT></P><FONT
style="LINE-HEIGHT: 25px" face=arial color=#000000 size=2>
<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 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>表12-2显示您的服务器所使用的函数,帮助执行的工作分类。</FONT></P>
<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"> 表12-2 </B></FONT>服务器的SSPI函数</FONT></TD></TR></TBODY></TABLE></CENTER>
<CENTER style="LINE-HEIGHT: 25px">
<TABLE border=1>
<TBODY style="LINE-HEIGHT: 25px">
<TR>
<TH style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
size=2>工作</FONT> </TH>
<TH style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
size=2>函数</FONT> </TH>
<TH style="LINE-HEIGHT: 25px"><FONT style="LINE-HEIGHT: 25px"
size=2>说明</FONT></TH></TR>
<TR>
<TD rowSpan=2><FONT style="LINE-HEIGHT: 25px"
size=2>初始验证/工作阶段</FONT></TD>
<TD><FONT style="LINE-HEIGHT: 25px"
size=2>AcquireCredentialsHandle</FONT></TD>
<TD><FONT style="LINE-HEIGHT: 25px" size=2>用来撷取象徵凭证的初始化handle。
一个或多个客户端环境可以与一个凭 证handle关联,同时选择您所使用的 安全性通讯协定。</FONT></TD></TR>
<TR>
<TD><FONT style="LINE-HEIGHT: 25px"
size=2>AcceptSecurityContext</FONT></TD>
<TD><FONT style="LINE-HEIGHT: 25px" size=2>重覆地呼叫。Blobs从被传递到
AcceptSecurityContext的客户端函数InitializeSecurityContext传回,反之亦
然,直到环境已经完整为止。</FONT></TD></TR>
<TR>
<TD><FONT style="LINE-HEIGHT: 25px" size=2>模拟</FONT></TD>
<TD><FONT style="LINE-HEIGHT: 25px"
size=2>ImpersonateSecurityContext</FONT></TD>
<TD><FONT style="LINE-HEIGHT: 25px"
size=2>您的现行线程模拟的完整环境。</FONT></TD></TR>
<TR>
<TD><FONT style="LINE-HEIGHT: 25px" size=2>资料私密性/加密</FONT></TD>
<TD><FONT style="LINE-HEIGHT: 25px" size=2>EncryptMessage
DecryptMessage</FONT></TD>
<TD><FONT style="LINE-HEIGHT: 25px" size=2>传递加密资料及Blobs的建立。
取得由EncryptMessage建立的 Blobs,并传回解密的资料。</FONT></TD></TR>
<TR>
<TD rowSpan=2><FONT style="LINE-HEIGHT: 25px"
size=2>资料完整性及讯息签章</FONT></TD>
<TD><FONT style="LINE-HEIGHT: 25px"
size=2>MakeSignature</FONT></TD>
<TD><FONT style="LINE-HEIGHT: 25px" size=2>签章应用程序提供的资料及建立通讯
用的Blobs。</FONT></TD></TR>
<TR>
<TD><FONT style="LINE-HEIGHT: 25px"
size=2>VerifySignature</FONT></TD>
<TD><FONT style="LINE-HEIGHT: 25px"
size=2>取得从MakeSignature传回的Blobs及
检查包含在Blobs里的讯息签章。</FONT></TD></TR>
<TR>
<TD><FONT style="LINE-HEIGHT: 25px" size=2>清除</FONT></TD>
<TD><FONT style="LINE-HEIGHT: 25px"
size=2>DeleteSecurityContext FreeCredentialsHandle</FONT></TD>
<TD><FONT style="LINE-HEIGHT: 25px" size=2>当您使用完时,用来清除
handles。</FONT></TD></TR></TBODY></TABLE></CENTER>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>表12-2中的函数是您的服务器使用SSPI交谈的工具。大部分的时间,您的服务器将从这些必须透过线路与客户端通讯的函数中收到Blobs。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>其他的时间里,您的服务器将会等待来自客户端的Blobs。图12-3的流程图从服务器的观点说明会谈的一般范例。</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>在这个图解中,我在本章中皆会提到称为SendData及ReceiveData的函数,您应该把它看成通讯函数(例如ReadFile及WriteFile,或是WSARecv及WSASend)的替代符号(PlaceHolders)。这样做是为了强调SSPI是传输层的论点—即是独立的。</FONT></P>
<HR style="LINE-HEIGHT: 25px">
</A>
<CENTER style="LINE-HEIGHT: 25px">
<P><INPUT id=2 style="LINE-HEIGHT: 25px" type=image height=595
width=650 src="12.1.2 安全连接.files/12-3.gif" border=0
onclick="imgclick"> </P></CENTER>
<CENTER style="LINE-HEIGHT: 25px">
<TABLE border=0>
<TBODY style="LINE-HEIGHT: 25px">
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?