SSL/TLS 应用于无Svc文件的WCF
在许多项目中,我们可能需要使用SSL/TLS(SSL Security Socket Layer 安全套接字/TSL Transfer Layer Security 传输层安全)来对客户端与服务端进行认证,并使用客户端与服务端之间认证成功后产生的会话密钥(Session Key)对数据加密,以保证消息的机密性。
应用SSL/TLS,很自然想到证书。.Net平台下,可以使用makeCert来制作测试证书。关于makeCert的使用,可以参见MSDN。
本节内容:
1、证书制作
2、无Svc文件的服务端配置
3、客户端调用
1、证书制作
本例中使用的制作证书的命令如下:
makecert -r -pe -n "CN= Tyb1222 " -b 01/01/2000 -e 01/01/2050 -eku 1.3.6.1.5.5.7.3.1 -ss my -sr localMachine -sky exchange -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12
注意以上命令红色部分表示证书主题。
-ss my表示证书的存储区为个人。
-sr localMachine 表示存储于本地计算机
这些信息在稍后的配置中会用到。其他的请参见MSDN中的说明
查看证书如图:
2、无Svc文件的服务端配置
<?xml version="1.0" encoding="utf-8"?> <!-- 有关如何配置 ASP.NET 应用程序的详细消息,请访问 http://go.microsoft.com/fwlink/?LinkId=169433 --> <configuration> <system.serviceModel> <bindings> <basicHttpBinding> <binding name="vrvTransportBinding"> <security mode="Transport"> <transport clientCredentialType="None"></transport> </security> </binding> </basicHttpBinding> </bindings> <serviceHostingEnvironment> <serviceActivations> <add service="VrvService.StateGrid.TerminalService" relativeAddress="TerminalService.svc"/> </serviceActivations> </serviceHostingEnvironment> <services> <service name="VrvService.StateGrid.TerminalService" behaviorConfiguration="vrvServiceBehavior"> <endpoint address="" binding="basicHttpBinding" contract="VrvService.Interface.ITerminal" behaviorConfiguration="vrvEndpointBehavior" bindingConfiguration="vrvTransportBinding"> </endpoint> <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/> </service> </services> <behaviors> <serviceBehaviors> <behavior name="vrvServiceBehavior"> <serviceMetadata httpsGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="True"/> <serviceCredentials> <windowsAuthentication allowAnonymousLogons="true"/> <clientCertificate> <authentication certificateValidationMode="PeerTrust"/> </clientCertificate> <serviceCertificate findValue="Tyb1222" storeName="My" storeLocation="LocalMachine" x509FindType="FindBySubjectName"/> </serviceCredentials> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
3、客户端调用
可以通过添加引用调用服务:如下图,单击确定即可:
客户端调用代码如下:
var proxy = new TerminalClient(); proxy.GetTerminalAlarm("123123", 10);
运行代码出现如下异常:
由于证书是使用信任链模式对进行认证的,如果证书不收信,将导致以上异常。解决办法如下:
1、将证书导入“受信任根证书颁发机构”,如下图:
在上图的导入窗口中操作后,客户端调用就不会有以上异常。
2、在C#客户端调用时,可以通过代码回调证书的认证方式:
ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyError) => true; var proxy = new TerminalClient(); proxy.GetTerminalAlarm("123123", 10);
参考:
http://www.cnblogs.com/artech/archive/2011/06/02/Authentication_042.html