[WCF安全系列]谈谈WCF的客户端认证[X.509证书认证]

前面介绍Windows认证用户名/密码认证这两种典型的客户端认证模式,我们最后来介绍最后一种客户端认证方式,即客户端凭证类型为X.509证书时服务端采用的认证,简称为证书认证。我们照例先看看看客户端证书凭证如何设置设置。

一、客户端证书凭证的设置

服务认证一文中,我们知道了基于X.509证书证书的服务凭证通过X509CertificateRecipientServiceCredential类型表示。与之对应地,客户端凭证对应的类型是X509CertificateInitiatorClientCredential。如下面的定义所示,在终结点行为 ClientCredentials中,具有一个只读的ClientCertificate属性,其类型就是X509CertificateInitiatorClientCredential。该类型实际上是对一个X509Certificate2类型对象的封装,我们可以通过两个SetCertificate方法重载以证书引用的方式指定某个具体的X.509证书作为客户端的凭证。

   1: public class ClientCredentials : SecurityCredentialsManager, IEndpointBehavior
   2: {    
   3:     //其他成员
   4:     public X509CertificateInitiatorClientCredential ClientCertificate { get; }
   5: }
   6: public sealed class X509CertificateInitiatorClientCredential
   7: {
   8:     //其他成员
   9:     public void SetCertificate(string subjectName, StoreLocation storeLocation, StoreName storeName);
  10:     public void SetCertificate(StoreLocation storeLocation, StoreName storeName, X509FindType findType, object findValue);
  11:     public X509Certificate2 Certificate { get; set; }
  12: }

在下面给出服务调用代码中,我们通过编程的方式为ChannelFactory<TChannel>设置了一个基于X.509证书的客户端凭证。

   1: using (ChannelFactory<ICalculator> channelFactory = new ChannelFactory<ICalculator>("calculatorService"))
   2: {
   3:     channelFactory.Credentials.ClientCertificate.SetCertificate(
   4:         StoreLocation.LocalMachine, 
   5:         StoreName.TrustedPeople, 
   6:         X509FindType.FindBySubjectName, 
   7:         "‎‎‎Foo");
   8:     ICalculator calculator = channelFactory.CreateChannel();
   9:     double result = calculator.Add(1, 2);
  10:     //...
  11: }

终结点行为ClientCredentials同样为客户端(默认)证书的设置定义相应的配置。在下面给出的XML片断中,我们通过配置的方式为终结点凭证指定了一个X.509证书。这个证书将作为服务代理对象(通过ChannelFactory<TChannel>创建的代理,或者是直接实例化通过元数据导入生成的服务代理类型)的默认客户凭证,而该凭证可以通过编程进行动态更改。

   1: <system.serviceModel>
   2:   ...
   3:   <behaviors>
   4:     <endpointBehaviors>
   5:       <behavior name="defaultClientCert">
   6:         <clientCredentials>
   7:           <clientCertificate storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" findValue="Foo"/>
   8:         </clientCredentials>
   9:       </behavior>
  10:     </endpointBehaviors>
  11:   </behaviors>
  12: </system.serviceModel>

二、客户端证书认证模式

关于基于证书的客户端认证,你可以与基于证书的服务认证进行类比。对于服务认证,服务在寄宿的时候指定某个X.509证书作为服务的凭证。客户端在默认的情况下会以ChainTrust模式对服务证书进行认证,也可以通过ClientCredentials这个终结点行为指定不同的认证模式。对于客户端认证,认证方变成了服务本身,服务端对客户证书的认证也采用相同的策略:默认认证模式为ChainTrust,但借助ServiceCredentials这个服务行为来指定不同的认证模式。

下面给出了服务端进行客户端证书认证模式设置对应的相关类型的定义。服务行为ServiceCredentials中具有一个只读的ClientCertificate属性,类型为X509CertificateInitiatorServiceCredential(对应于服务认证中的X509CertificateRecipientClientCredential)。X509CertificateInitiatorServiceCredential定义了只读属性Authentication,其类型为X509ClientCertificateAuthentication(对应于服务认证中的X509ServiceCertificateAuthentication)。和X509ServiceCertificateAuthentication定义类似,你可以通过X509ClientCertificateAuthentication设置不同的认证模式(None、PeerTrust、ChainTrust、PeerOrChainTrust、Custom)。当你选择Custom模式的时候,你需要通过CustomCertificateValidator属性设置一个自定义的X509CertificateValidator。

   1: public class ServiceCredentials : SecurityCredentialsManager, IServiceBehavior
   2: {
   3:     //其他成员
   4:     public X509CertificateInitiatorServiceCredential ClientCertificate { get; }
   5: }
   6: public sealed class X509CertificateInitiatorServiceCredential
   7: {
   8:     //其他成员
   9:     public X509ClientCertificateAuthentication Authentication { get; }
  10:     public X509Certificate2 Certificate { get; set; }
  11: }
  12: public class X509ClientCertificateAuthentication
  13: {
  14:     //其他成员
  15:     public X509CertificateValidationMode CertificateValidationMode { get; set; }
  16:     public X509CertificateValidator CustomCertificateValidator { get; set; }
  17: }

下面的代码演示了在对服务进行自我寄宿的情况下,如何设置对客户端证书进行认证的模式,在这里将认证模式设置成了PeerOrChainTrust。

   1: using (ServiceHost host = new ServiceHost(typeof(CalculatorService)))
   2: {
   3:     ServiceCredentials serviceCredentials = host.Description.Behaviors.Find<ServiceCredentials>();
   4:     if (null == serviceCredentials)
   5:     {
   6:         serviceCredentials = new ServiceCredentials();
   7:         host.Description.Behaviors.Add(serviceCredentials);
   8:     }
   9:     serviceCredentials.ClientCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.PeerOrChainTrust;
  10:     host.Open();
  11:     //...
  12: }

我们推荐的依旧是采用配置的方式,上面这段代码中设置的服务行为可以通过下面一端配置来表示。

   1: <system.serviceModel>
   2: ...
   3:   <behaviors>
   4:     <serviceBehaviors>
   5:       <behavior name="setCertAuthentication">
   6:         <serviceCredentials>
   7:           <clientCertificate>
   8:             <authentication certificateValidationMode="PeerOrChainTrust"/>
   9:           </clientCertificate>
  10:         </serviceCredentials>
  11:       </behavior>
  12:     </serviceBehaviors>
  13:   </behaviors>
  14: </system.serviceModel>

作者:蒋金楠
微信公众账号:大内老A
微博:www.weibo.com/artech
如果你想及时得到个人撰写文章以及著作的消息推送,或者想看看个人推荐的技术资料,可以扫描左边二维码(或者长按识别二维码)关注个人公众号(原来公众帐号蒋金楠的自媒体将会停用)。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

原文链接

时间: 2024-09-19 23:54:22

[WCF安全系列]谈谈WCF的客户端认证[X.509证书认证]的相关文章

[WCF安全系列]谈谈WCF的客户端认证[用户名/密码认证]

对于基于Internet的应用,基于用户名和密码的认证方式是最为常用的,而WCF为你提供了不同模式的用户名认证方式.首先还是从用户凭证的表示说起. 一.用户名/密码认证的三种模式 基于用户名/密码的用户凭证通过类型UserNamePasswordClientCredential表示.而在ClientCredentials中,只读属性UserName表示这样一个用户凭证.你可以按照Windows凭证的方式为ChannelFactory<TChannel>或者ClientBase<TChan

[WCF安全系列]谈谈WCF的客户端认证[Windows认证]

结束了服务认证的介绍之后,我们接着介绍WCF双向认证的另一个方面,即服务对客户端的认证,简称客户端认证.客户端认证采用的方式决定于客户端凭证的类型,内容只要涉及基于以下三种典型客户凭证类型的认证:Windows.用户名和X.509证书.从编程的角度来讲,Windows认证是最为简单的认证方式.在这种认证方式下,客户端进程运行的Window帐号对应的Windows凭证被自动作为调用服务的客户端凭证,所以无需显示指定具体的Windiws凭证. 如果需要另一个Windows帐号的名义调用服务,客户端就

通过双向证书认证访问由tomcat7和Axis2搭建的web服务(上)

本文通过一系列的实验步骤描述,向您展示如何使用 gSOAP 编写的客户端,通过双向证书认证,访问由 tomcat7 和 Axis2 搭建的 web 服务.全文http://www.aliyun.com/zixun/aggregation/32779.html">循序渐进,分为几个阶段逐步展开,每个阶段相关的注意事项和遇到过的一些问题也一并记录下来供读者参考. 先简单介绍一下需要准备的工具. 服务端:由 tomcat7+axis2 搭建而成 客户端:由 gSOAP 工具生成 证书 :用 op

[WCF安全系列]绑定、安全模式与客户端凭证类型:BasicHttpBinding

整个安全传输是在WCF的信道层进行的,而绑定是信道层的缔造者,所以终结点采用哪种类型的绑定以及对绑定的属性进行怎样的设置决定了信道层最终采用何种机制实现消息的安全传输.具体来说,我们可以通过绑定设置最终采用的安全模式,以及基于相应安全模式下进行认证和消息保护的行为. 一.Binding安全相关的应用编程接口 不同的绑定类型由于其采用的传输协议不同,应用的场景也各有侧重,很难提供一种统一的应用编程接口完成基于不同绑定的安全设置,所以每一种绑定都具有各自用于安全设置相关的类型.但是基于对安全的设置,

[WCF安全系列]认证与凭证:X.509证书

在<上篇>中,我们谈到了常用的认证方式:用户名/密码认证和Windows认证.在下篇中,我们着重来介绍另外一种重要的凭证类型:X.509证书,以及针对X.509证书的认证方式.不过为了让读者能够真正地全面地了解X.509证书,我们需要先了解一些关于非对称密码学的背景知识. 目录 一.非对称密码学(Asymmetric Cryptography)     消息加密(Encryption)     数字签名(Digital Signature) 二.数字证书     数字证书的颁发机制     创

[WCF安全系列]认证与凭证:用户名/密码认证与Windows认证

如果要给认证下一个定义,我个人的倾向这样的定义:认证是确定被认证方的真实身份和他或她申明(Claim)的身份是否相符的行为.认证方需要被认证方提供相应的身份证明材料,以鉴定本身的身份是否与声称的身份相符.在计算机的语言中,这里的身份证明有一个专有的名称,即"凭证(Credential)",或者用户凭证(User Credential).认证凭证(Authentication Credential). 一.凭证的属性 最好的设计就是能够尽可能的模拟现实的设计.对于安全认证来说,在现实生活

[WCF安全系列]实例演示:TLS/SSL在WCF中的应用[SSL over TCP]

在接下来的系列文章中我们正是讨论关于身份认证的主题.在前面我们已经谈到了,WCF中的认证属于"双向认证",既包括服务对客户端的认证(以下简称客户端认证),也包括客户端对服务的认证(以下简称服务认证).客户端认证和服务认证从本质上并没有什么不同,无非都是被认证一方提供相应的用户凭证供对方对自己的身份进行验证.我们先来讨论服务认证,客户端认证放在后续的文章中. 在<从两种安全模式谈起>中,我们对TLS/SSL进行了简单的介绍.我们知道,客户端和服务在为建立安全上下文而进行的协商

WCF专题系列(7):消息如何传递之绑定Part 2

概述 每个服务终结点都包含一个地址Address.一个绑定Binding 和一个 契约Contract.契约指定可用的操作,绑定指定如何与服务进行通信,而地址指 定查找服务的位置,在WCF专题系列前5篇中,深入了解了WCF中寻址的细节.本 文为消息如何传递之绑定第二部分,将详细介绍WCF内置的各种绑定元素,绑定 元素之间的顺序以及如何创建一个自定义的绑定元素. 在WCF专题系列( 6):消息如何传递之绑定Part 1一文中,我提到绑定由绑定元素组成,每个绑 定元素用来描述终结点与客户端通信方式中

[WCF安全系列]服务凭证(Service Credential)与服务身份(Service Identity)

在采用TLS/SSL实现Transport安全的情况下,客户端对服务证书实施认证.但是在默认情况下,这种认证仅仅是确保服务证书的合法性(通过数字签名确保证书确实是由申明的CA颁发)和可信任性(证书或者CA证书存储于相应的可信赖存储区).而WCF提供服务证书并不限于此,客户端对服务认证的模式应该是这样的:服务端预先知道了服务的身份,在进行服务调用之前,服务端需要提供相应的凭证用以辅助客户端确认调用的服务具有预先确定的身份.对于这样的服务认证模式,具有两个重要的概念,即服务凭证和服务身份. 目录: