zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    第1章习题
    生成树相关问题
    cf 710 E Generate a String
    树状数组(BIT)
    HDU 5360 Hiking(2015多校联合)
    Apache HttpClient4.0&HtmlCleaner用法
    Android中的长度单位详解(dp、sp、px、in、pt、mm)
    HDU 5328 Problem Killer(2015多校联合)
    HDU 5327 Olympiad(2015多校联合)
    HDU 5335 Walk Out(2015多校联合)
  • 原文地址:https://www.cnblogs.com/tyb1222/p/2932659.html
Copyright © 2011-2022 走看看