WCF使用证书非常简便,很多事情WCF都帮做好了,例如证书的检查,证书链的检查,加密解密消息的过程等,甚至证书交换和分发也帮搞定了。配置使用证书大致就下面这几个步骤:
    1. 分别给服务端和客户端申请数字证书,安装在各自的私人证书库(Personal)中。客户端启动后,WCF会默认到该库查找WCF客户端的数字证书。
    2. 将服务端的数字证书导出,安装到客户端系统的可信人员证书库(Trusted People)中。客户端启动后,WCF默认会到该库查找WCF服务的数字证书。
    3. 服务宿主配置文件修改如下。

【WCF】使用数字证书加密通讯<?xml version="1.0" encoding="utf-8" ?>
【WCF】使用数字证书加密通讯
<configuration>
【WCF】使用数字证书加密通讯  
<system.web>
【WCF】使用数字证书加密通讯    
<compilation debug="true" />
【WCF】使用数字证书加密通讯  
</system.web>
【WCF】使用数字证书加密通讯  
【WCF】使用数字证书加密通讯  
<system.serviceModel>
【WCF】使用数字证书加密通讯    
【WCF】使用数字证书加密通讯    
<services>
【WCF】使用数字证书加密通讯      
<service name="CertificateTest.Service.CalService" 
【WCF】使用数字证书加密通讯               behaviorConfiguration
="CalServiceBeConfig">
【WCF】使用数字证书加密通讯        
<host>
【WCF】使用数字证书加密通讯          
<baseAddresses>
【WCF】使用数字证书加密通讯            
<add baseAddress = "http://localhost:8888/" />
【WCF】使用数字证书加密通讯          
</baseAddresses>
【WCF】使用数字证书加密通讯        
</host>
【WCF】使用数字证书加密通讯        
【WCF】使用数字证书加密通讯        
<endpoint address ="CalService" 
【WCF】使用数字证书加密通讯                  binding
="wsHttpBinding"
【WCF】使用数字证书加密通讯                  contract
="CertificateTest.Contract.ICalService">
【WCF】使用数字证书加密通讯          
<identity>
【WCF】使用数字证书加密通讯          
</identity>
【WCF】使用数字证书加密通讯        
</endpoint>
【WCF】使用数字证书加密通讯        
【WCF】使用数字证书加密通讯      
</service>
【WCF】使用数字证书加密通讯    
</services>
【WCF】使用数字证书加密通讯    
<behaviors>
【WCF】使用数字证书加密通讯      
<serviceBehaviors>
【WCF】使用数字证书加密通讯        
<behavior name="CalServiceBeConfig" >
【WCF】使用数字证书加密通讯          
<serviceMetadata httpGetEnabled="True"/>
【WCF】使用数字证书加密通讯          
<serviceDebug includeExceptionDetailInFaults="False" />
【WCF】使用数字证书加密通讯          
<serviceCredentials>
【WCF】使用数字证书加密通讯            
<serviceCertificate findValue="d7a95083f6c5d13c20e6a962d338a2ebea055c9c"
【WCF】使用数字证书加密通讯                                storeLocation
="CurrentUser"
【WCF】使用数字证书加密通讯                                storeName
="My"
【WCF】使用数字证书加密通讯                                x509FindType
="FindByThumbprint"/>
【WCF】使用数字证书加密通讯          
</serviceCredentials>
【WCF】使用数字证书加密通讯        
</behavior>
【WCF】使用数字证书加密通讯      
</serviceBehaviors>
【WCF】使用数字证书加密通讯    
</behaviors>
【WCF】使用数字证书加密通讯  
</system.serviceModel>
【WCF】使用数字证书加密通讯
</configuration>
【WCF】使用数字证书加密通讯


4. 客户端配置文件如下。Behavior中加了个clientVia是为了进行消息跟踪。

【WCF】使用数字证书加密通讯<?xml version="1.0" encoding="utf-8" ?>
【WCF】使用数字证书加密通讯
<configuration>
【WCF】使用数字证书加密通讯  
<system.serviceModel>
【WCF】使用数字证书加密通讯    
【WCF】使用数字证书加密通讯    
<!--Behaviors Configuration-->
【WCF】使用数字证书加密通讯    
<behaviors>
【WCF】使用数字证书加密通讯      
<endpointBehaviors>
【WCF】使用数字证书加密通讯        
<behavior name="clientBeh">
【WCF】使用数字证书加密通讯          
<clientVia viaUri="http://localhost:8080/CalService"></clientVia>
【WCF】使用数字证书加密通讯          
<clientCredentials>
【WCF】使用数字证书加密通讯            
<!--以证书指纹作为条件在私人证书库中搜索证书-->
【WCF】使用数字证书加密通讯            
<clientCertificate
【WCF】使用数字证书加密通讯              findValue
="ffd01fef0293e479a3d170a141522e8ce1fdded4"
【WCF】使用数字证书加密通讯              storeLocation
="CurrentUser"
【WCF】使用数字证书加密通讯              storeName
="My"
【WCF】使用数字证书加密通讯              x509FindType
="FindByThumbprint"/>
【WCF】使用数字证书加密通讯          
</clientCredentials>
【WCF】使用数字证书加密通讯        
</behavior>
【WCF】使用数字证书加密通讯      
</endpointBehaviors>
【WCF】使用数字证书加密通讯    
</behaviors>
【WCF】使用数字证书加密通讯    
【WCF】使用数字证书加密通讯    
<!--Client Configuration-->
【WCF】使用数字证书加密通讯    
<client>
【WCF】使用数字证书加密通讯      
<endpoint address="http://192.168.1.167:8888/CalService"
【WCF】使用数字证书加密通讯                binding
="wsHttpBinding"
【WCF】使用数字证书加密通讯                contract
="CertificateTest.Contract.ICalService"
【WCF】使用数字证书加密通讯                behaviorConfiguration
="clientBeh"
【WCF】使用数字证书加密通讯                name
="defaultEP">
【WCF】使用数字证书加密通讯      
</endpoint>
【WCF】使用数字证书加密通讯    
</client>    
【WCF】使用数字证书加密通讯    
【WCF】使用数字证书加密通讯  
</system.serviceModel>
【WCF】使用数字证书加密通讯
</configuration>
【WCF】使用数字证书加密通讯

    关于客户端证书配置,不用显式指定证书的位置,甚至不用指定使用数字证书也是可以的,只要把客户端证书导入到私人证书库里就可以了。WCF会自动协商使用证书,并到上面提到证书库中去查找证书进行交换。配置如下所示:

【WCF】使用数字证书加密通讯<?xml version="1.0" encoding="utf-8" ?>
【WCF】使用数字证书加密通讯
<configuration>
【WCF】使用数字证书加密通讯  
<system.serviceModel>
【WCF】使用数字证书加密通讯    
【WCF】使用数字证书加密通讯    
<!--Behaviors Configuration-->
【WCF】使用数字证书加密通讯    
<behaviors>
【WCF】使用数字证书加密通讯      
<endpointBehaviors>
【WCF】使用数字证书加密通讯        
<behavior name="clientBeh">
【WCF】使用数字证书加密通讯          
<clientVia viaUri="http://localhost:8080/CalService"></clientVia>
【WCF】使用数字证书加密通讯        
</behavior>
【WCF】使用数字证书加密通讯      
</endpointBehaviors>
【WCF】使用数字证书加密通讯    
</behaviors>
【WCF】使用数字证书加密通讯    
【WCF】使用数字证书加密通讯    
<!--Client Configuration-->
【WCF】使用数字证书加密通讯    
<client>
【WCF】使用数字证书加密通讯      
<endpoint address="http://192.168.1.167:8888/CalService"
【WCF】使用数字证书加密通讯                binding
="wsHttpBinding"
【WCF】使用数字证书加密通讯                contract
="CertificateTest.Contract.ICalService"
【WCF】使用数字证书加密通讯                behaviorConfiguration
="clientBeh"
【WCF】使用数字证书加密通讯                name
="defaultEP">
【WCF】使用数字证书加密通讯      
</endpoint>
【WCF】使用数字证书加密通讯    
</client>    
【WCF】使用数字证书加密通讯    
【WCF】使用数字证书加密通讯  
</system.serviceModel>
【WCF】使用数字证书加密通讯
</configuration>

 

    下面是源码,很简单的加法例子。

    WCF契约部分代码:

【WCF】使用数字证书加密通讯using System;
【WCF】使用数字证书加密通讯
using System.Runtime.Serialization;
【WCF】使用数字证书加密通讯
using System.ServiceModel;
【WCF】使用数字证书加密通讯
【WCF】使用数字证书加密通讯
namespace CertificateTest.Contract
}

 

    WCF服务器部分代码:

【WCF】使用数字证书加密通讯using System;
【WCF】使用数字证书加密通讯
using System.Runtime.Serialization;
【WCF】使用数字证书加密通讯
using System.ServiceModel;
【WCF】使用数字证书加密通讯
using CertificateTest.Contract;
【WCF】使用数字证书加密通讯
【WCF】使用数字证书加密通讯
namespace CertificateTest.Service
}

 

    WCF宿主部分代码:

【WCF】使用数字证书加密通讯using System;
【WCF】使用数字证书加密通讯
using System.ServiceModel;
【WCF】使用数字证书加密通讯
using CertificateTest.Service;
【WCF】使用数字证书加密通讯
using CertificateTest.Contract;
【WCF】使用数字证书加密通讯
【WCF】使用数字证书加密通讯
namespace CertificateTest.Host
}

 

    WCF客户端部分代码:

【WCF】使用数字证书加密通讯using System;
【WCF】使用数字证书加密通讯
using System.ServiceModel;
【WCF】使用数字证书加密通讯
using CertificateTest.Contract;
【WCF】使用数字证书加密通讯
【WCF】使用数字证书加密通讯
namespace CertificateTest.Client
}

 

    下面是用星际强度密钥加密后的SOAP消息密文,用tcpTrace抓的。

【WCF】使用数字证书加密通讯HTTP/1.1 200 OK
【WCF】使用数字证书加密通讯Content
-Length: 2858
【WCF】使用数字证书加密通讯Content
-Type: application/soap+xml; charset=utf-8
【WCF】使用数字证书加密通讯Server: Microsoft
-HTTPAPI/1.0
【WCF】使用数字证书加密通讯Date: Thu, 
29 Jan 2009 15:55:03 GMT
【WCF】使用数字证书加密通讯
【WCF】使用数字证书加密通讯
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
【WCF】使用数字证书加密通讯  
<s:Header>
【WCF】使用数字证书加密通讯    
<a:Action s:mustUnderstand="1" u:Id="_1">http://schemas.xmlsoap.org/ws/2005/02/trust/RSTR/SCT/Cancel</a:Action>
【WCF】使用数字证书加密通讯
    <a:RelatesTo u:Id="_2">urn:uuid:58e87213-f5cc-4541-9d45-0a880db9ed24</a:RelatesTo>
【WCF】使用数字证书加密通讯    
<o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
【WCF】使用数字证书加密通讯      
<u:Timestamp u:Id="uuid-3393524a-cd23-4a9b-8dde-01bf7d124715-72">
【WCF】使用数字证书加密通讯        
<u:Created>2009-01-29T15:55:03.390Z</u:Created>
【WCF】使用数字证书加密通讯        
<u:Expires>2009-01-29T16:00:03.390Z</u:Expires>
【WCF】使用数字证书加密通讯      
</u:Timestamp>
【WCF】使用数字证书加密通讯      
<c:DerivedKeyToken u:Id="uuid-3393524a-cd23-4a9b-8dde-01bf7d124715-67" xmlns:c="http://schemas.xmlsoap.org/ws/2005/02/sc">
【WCF】使用数字证书加密通讯        
<o:SecurityTokenReference>
【WCF】使用数字证书加密通讯          
<o:Reference URI="urn:uuid:74031c45-64e6-4dd2-afaf-d351503f8557" ValueType="http://schemas.xmlsoap.org/ws/2005/02/sc/sct"/>
【WCF】使用数字证书加密通讯        
</o:SecurityTokenReference>
【WCF】使用数字证书加密通讯        
<c:Offset>0</c:Offset>
【WCF】使用数字证书加密通讯        
<c:Length>24</c:Length>
【WCF】使用数字证书加密通讯        
<c:Nonce>RhG3GrRz7LzSyQG2J6y4QQ==</c:Nonce>
【WCF】使用数字证书加密通讯      
</c:DerivedKeyToken>
【WCF】使用数字证书加密通讯      
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
【WCF】使用数字证书加密通讯        
<SignedInfo>
【WCF】使用数字证书加密通讯          
<CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
【WCF】使用数字证书加密通讯          
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#hmac-sha1"/>
【WCF】使用数字证书加密通讯          
<Reference URI="#_0">
【WCF】使用数字证书加密通讯            
<Transforms>
【WCF】使用数字证书加密通讯              
<Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
【WCF】使用数字证书加密通讯            
</Transforms>
【WCF】使用数字证书加密通讯            
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
【WCF】使用数字证书加密通讯            
<DigestValue>BXF6YVgC7GaFcATWlFL6EsPDNMk=</DigestValue>
【WCF】使用数字证书加密通讯          
</Reference>
【WCF】使用数字证书加密通讯          
<Reference URI="#_1">
【WCF】使用数字证书加密通讯            
<Transforms>
【WCF】使用数字证书加密通讯              
<Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
【WCF】使用数字证书加密通讯            
</Transforms>
【WCF】使用数字证书加密通讯            
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
【WCF】使用数字证书加密通讯            
<DigestValue>Co+CdLM6yrXJYKmiLC3jm2Mbk1E=</DigestValue>
【WCF】使用数字证书加密通讯          
</Reference>
【WCF】使用数字证书加密通讯          
<Reference URI="#_2">
【WCF】使用数字证书加密通讯            
<Transforms>
【WCF】使用数字证书加密通讯              
<Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
【WCF】使用数字证书加密通讯            
</Transforms>
【WCF】使用数字证书加密通讯            
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
【WCF】使用数字证书加密通讯            
<DigestValue>lP2tDfmzac97N49n0kAJ/q55Qd0=</DigestValue>
【WCF】使用数字证书加密通讯          
</Reference>
【WCF】使用数字证书加密通讯          
<Reference URI="#uuid-3393524a-cd23-4a9b-8dde-01bf7d124715-72">
【WCF】使用数字证书加密通讯            
<Transforms>
【WCF】使用数字证书加密通讯              
<Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
【WCF】使用数字证书加密通讯            
</Transforms>
【WCF】使用数字证书加密通讯            
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
【WCF】使用数字证书加密通讯            
<DigestValue>zSNOO+zcFHJ+By95A6rYCASaODE=</DigestValue>
【WCF】使用数字证书加密通讯          
</Reference>
【WCF】使用数字证书加密通讯        
</SignedInfo>
【WCF】使用数字证书加密通讯        
<SignatureValue>p6WT2z73qpigpEoCd56LHCmC+OY=</SignatureValue>
【WCF】使用数字证书加密通讯        
<KeyInfo>
【WCF】使用数字证书加密通讯          
<o:SecurityTokenReference>
【WCF】使用数字证书加密通讯            
<o:Reference ValueType="http://schemas.xmlsoap.org/ws/2005/02/sc/dk" URI="#uuid-3393524a-cd23-4a9b-8dde-01bf7d124715-67"/>
【WCF】使用数字证书加密通讯          
</o:SecurityTokenReference>
【WCF】使用数字证书加密通讯        
</KeyInfo>
【WCF】使用数字证书加密通讯      
</Signature>
【WCF】使用数字证书加密通讯    
</o:Security>
【WCF】使用数字证书加密通讯  
</s:Header>
【WCF】使用数字证书加密通讯  
<s:Body u:Id="_0">
【WCF】使用数字证书加密通讯    
<t:RequestSecurityTokenResponse xmlns:t="http://schemas.xmlsoap.org/ws/2005/02/trust">
【WCF】使用数字证书加密通讯      
<t:RequestedTokenCancelled></t:RequestedTokenCancelled>
【WCF】使用数字证书加密通讯    
</t:RequestSecurityTokenResponse>
【WCF】使用数字证书加密通讯  
</s:Body>
【WCF】使用数字证书加密通讯
</s:Envelope>
【WCF】使用数字证书加密通讯

相关文章: