WCF NetTcpBinding Transport安全模式(4) ClientCredentialType证书验证模式----基本配置
在Transport安全模式下,客户端凭据支持三种类型:None、Windows、Certificate。默认情况下采用Windows凭据类型。前面几个小节的示例中一直在使用Windows凭据类型,本小节主要探讨Certificate凭据。
使用Certificate凭据,首先需要准备服务端和客户端证书。创建证书的命令如图11-10所示。
图11-10 创建证书
执行图11-10的命令,分别创建名为“XuanhunServer”和“XuanhunClient”的两个证书,用于服务端和客户端,存储区为“CurrentUser”。
有了证书文件之后,需要修改相关的配置启用证书验证。在服务端的添加如代码清单11-19所示的behaviors配置节,在behaviors配置节中配置服务端证书。
代码清单11-19 配置服务器端证书
<behaviors>
<serviceBehaviors>
<behavior name="validateBehavior">
<serviceCredentials>
<serviceCertificate
x509FindType="FindBySubjectName"
storeLocation="CurrentUser"
storeName="My"
findValue=" XuanhunServer"
/>
<clientCertificate >
<authentication certificateValidationMode="None" trustedStoreLocation="CurrentUser" />
<certificate />
</clientCertificate>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
在以上代码中,serviceCredentials节用来添加服务端证书配置,该节包含多个serviceCertificate节,用来指定具体的服务端证书实例。serviceCredentials配置节可配置的凭据信息参看11.1.3节。
serviceCertificate基本语法如代码清单11-20所示。
代码清单11-20 serviceCertificate基本语法
<serviceCertificate findValue="String"
storeLocation="LocalMachine/CurrentUser"
storeName="AddressBook/AuthRoot/CertificateAuthority/Disallowed/My/Root/TrustedPeople/TrustedPublisher"
X509FindType="FindByThumbprint/FindBySubjectName/FindBySubjectDistinguishedName/FindByIssuerName/FindByIssuerDistinguishedName/FindBySerialNumber/FindByTimeValid/FindByTimeNotYetValid/FindByTemplateName/FindByApplicationPolicy/FindByCertificatePolicy/FindByExtension/FindByKeyUsage/FindBySubjectKeyIdentifier"
/>
serviceCertificate包含的属性及描述如表11-7所示。
表11-7 serviceCertificate属性
属性 |
描述 |
findValue |
一个字符串,包含要在X.509证书存储中搜索的值。此属性中包含的类型必须满足指定X509FindType 的要求。默认值为一个空字符串 |
storeLocation |
指定客户端可用于验证服务器证书的 X.509 证书存储的位置。包括以下有效值:
|
storeName |
指定要打开的X.509证书存储的名称。包括以下有效值:
|
X509FindType |
定义要执行的X.509搜索的类型。包括以下有效值:
|
serviceCredentials下的clientCertificate配置,可以定义一个用于在双工通信模式中对从服务发送到客户端的消息进行签名和加密的X.509证书。如果服务必须事先拥有客户端的证书才能与该客户端进行安全通信,则需要使用此元素。使用双工通信模式时,会出现这种情况。在更为典型的请求/响应模式中,客户端会将其证书包含在请求中,服务将使用该证书对发送回客户端的响应进行加密和签名。但是,在双工通信模式中,服务没有来自客户端的请求,因此服务需要事先具有客户端的证书,以确保发送到客户端消息的安全。因此,必须通过带外协商来获取客户端的证书,并使用此元素指定该证书。在此元素中设置的证书用于仅针对配置有MutualCertificateDuplex消息安全身份验证模式的绑定加密发送到客户端的消息。
serviceCredentials的clientCertificate配置节基本语法如下:
<clientCertificate>
<certificate/>
<authentication/>
</clientCertificate>
serviceCredentials的clientCertificate配置节没有属性,只有两个子元素<certificate/>和<authentication/>。
<authentication>元素用来指定服务使用的客户端证书的身份验证行为。基本语法如代码清单11-21所示。
代码清单11-21 <authentication>元素基本语法
<authentication
customCertificateValidatorType="namespace.typeName, [,AssemblyName] [,Version=version number] [,Culture=culture] [,PublicKeyToken=token]"
certificateValidationMode="ChainTrust/None/PeerTrust/PeerOrChainTrust/Custom"
includeWindowsGroups="Boolean"
mapClientCertificateToWindowsAccount="Boolean"
revocationMode="NoCheck/Online/Offline"
trustedStoreLocation="CurrentUser/LocalMachine"
/>
详细的属性说明如表11-8所示。
表11-8 <authentication>配置节属性说明
属性 |
描述 |
customCertificateValidatorType |
可选的字符串。用于验证自定义类型的类型和程序集。当certificateValidationMode设置为Custom时,必须设置此属性 |
certificateValidationMode |
可选的枚举。指定用来验证凭据的其中一种模式。此特性的类型为System.Servicemodel.Security.X509CertificateValidationMode。如果设置为Custom,还必须提供 customCertificateValidator。默认值为ChainTrust |
includeWindowsGroups |
可选的布尔值。指定Windows组是否包含在安全上下文中。将此属性设置为true会影响性能,因为这会导致完全组扩展。如果不需要建立用户所属组的列表,请将此属性设置为 false |
mapClientCertificateToWindowsAcccount |
布尔值。指定是否可以使用证书将客户端映射到 Windows标识。为此必须启用Active Directory |
revocationMode |
可选的枚举。用于检查吊销证书列表 (RCL) 的一种模式。默认值为Online |
trustedStoreLocation |
可选的枚举。两个系统存储位置之一: LocalMachine或CurrentUser。在向客户端协商服务证书时使用此值。将根据指定存储位置中的 “受信任人”存储执行验证。默认值为CurrentUser |
说明 certificateValidationMode共有以下五种模式。
None: 未执行任何证书验证。
PeerTrust:如果证书位于被信任的人的存储区中,则有效。
ChainTrust:如果证书链在受信任的根存储区生成证书颁发机构,则证书有效。
PeerOrChainTrust:如果证书位于被信任的人的存储区或证书链在受信任的根存储区生成证书颁发机构,则证书有效。
Custom:用户必须插入自定义 X509CertificateValidator 以验证证书。
clientCertificate的certificate基本语法如代码清单11-22所示,属性说明参看表11-7。
代码清单11-22 clientCertificate的certificate基本语法
<certificate findValue = "String"
storeLocation = "CurrentUser/LocalMachine"
storeName="AddressBook/AuthRoot/CertificateAuthority/Disallowed/My/Root/TrustedPeople/TrustedPublisher"
X509FindType="FindByThumbPrint/FindBySubjectName/FindBySubjectDistinguishedName/FindByIssuerName/FindByIssuerDistinguishedName/FindBySerialNumber/FindByTimeValid/FindByTimeNotYetValid/FindByTemplateName/FindByApplicationPolicy/FindByCertificatePolicy/FindByExtension/FindByKeyUsage/FindBySubjectKeyIdentifier"
/>
综合上面的讲解,回顾代码清单11-19的讲解是不是很清晰了呢?客户端的配置不用做过多的解释,如代码清单11-23所示。
代码清单11-23 客户端证书配置
<behaviors >
<endpointBehaviors>
<behavior name="ForListen">
<clientVia viaUri="net.tcp://127.0.0.1:64590/HelloService"/>
<clientCredentials>
<clientCertificate
findValue="XuanhunClient"
storeLocation="CurrentUser"
x509FindType="FindBySubjectName"
storeName="My"/>
<serviceCertificate>
<authentication certificateValidationMode="None" />
</serviceCertificate>
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
----------------------------------注:本文部分内容改编自《.NET 安全揭秘》