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

posted @ 2013-02-25 20:11  tyb1222  阅读(1282)  评论(0编辑  收藏  举报