zoukankan      html  css  js  c++  java
  • WS BasicHttpBinding 安全解析(7)Certificate验证(IIS宿主)

    本节使用Transport安全模式来做Certificate验证,因为TransportCredentialOnly模式不支持证书。

    Certificate验证需要客户端或者服务端提供证书,从而进行身份验证。首先我们在vs2010的命令行使用如图11-42所示的命令创建两个证书,分别用于服务端和客户端。

    clip_image002

    图11-42 创建证书

    证书创建完成之后,我们在MMC控制台添加证书管理单元,然后将两个证书转移到受信任存储区,如图11-43。

    clip_image004

    图11-43 将证书转移到受信任存储区

    说明

    图11-43所示的过程我们也完全可以在命令行把证书直接生成到指定的区域,这里主要的目的是告诉大家如何统一的管理证书。

    因为传输安全模式下使用的是SSL链接,当然这需要我们在IIS配置站点的https绑定。

    我们重新创建一个和站点同名的证书--wcfservicewebsite.com,然后将其导出到本地。打开IIS,首先切换到IIS7.5的服务器管理,单击“服务器证书”,为服务器添加证书。然后回到服务站点管理视图,编辑站点绑定,选择添加的证书。回到站点管理视图,点击“SSL设置”,勾选“要求SLL”,如图11-44。

    clip_image006

    图11-44 配置站点要求SSL

    此时访问站点会报告证书无效,因为是本地生成的证书没有经过验证的颁发机构,如图11-45所示。

    clip_image008

    图11-45 访问https链接证书错误

    此时我们可以单击IE上的红叉,根据提示来将此证书安装到受信任的颁发机构中,如图11-46和图11-47。

    clip_image010

    图11-46 选择安装证书

    clip_image012

    图11-47 将证书安装到受信任的根证书颁发机构

    再次刷新站点,我们看到是通过验证的锁头标志,如图11-48。

    clip_image014

    图11-48 证书通过验证

    首先我们看看不设置客户端凭据情况下Transport模式下的通信是什么样的,修改服务端配置为代码清单11-100所示的内容。

    代码清单11-100 不设置客户端凭据

     
    <bindings>
    <basicHttpBinding>
    <binding 
    name="basicBindingConf">
    <security 
    mode="Transport">
    <transport 
    clientCredentialType="None">
    </transport>
    </security>
    </binding>
    </basicHttpBinding>
    </bindings>
    ......
    
    

    客户端根据服务端做相应的调整,之后设置可以通过https获取元数据,配置如代码清单11-101

     
    <behavior name="WcfHelloService.ServiceBehavior">
    <serviceMetadata 
    httpsGetEnabled="true"/>
    </behavior>

    客户端相应的将endpoint的address修改为:

    <endpoint address=https://wcfservicewebsite.com/HelloService.svc.../>。

    运行测试站点,结果如图11-49。

    clip_image016

    图11-49 Transport模式无凭据测试结果

    从图11-49的结果结合服务端代码,我们可以知道当前采用的是匿名访问。那么传输层是不是保证了传输安全呢?我们Fiddler的捕获结果,如代码清单11-102。

    代码清单11-102 Transport模式下捕获的数据

     
    CONNECT wcfservicewebsite.com:443 HTTP/1.1
    Host: wcfservicewebsite.com
    Proxy-Connection: Keep-Alive
    The data sent represents an SSLv3-compatible ClientHello handshake. For your 
    convenience, the data is extracted below.
    Major Version: 3
    Minor Version: 1
    Random: 4E 07 11 12 D7 AE D1 35 94 52 CF CE B9 EA BF 8C 5B 4E B2 D4 86 0A BC 
    E6 D2 61 C4 97 BC 1C 11 DA 
    SessionID: empty
    Ciphers: 
    [002F] TLS_RSA_AES_128_SHA
    [0035] TLS_RSA_AES_256_SHA
    [0005] SSL_RSA_WITH_RC4_128_SHA
    [000A] SSL_RSA_WITH_3DES_EDE_SHA
    [C013] TLS1_CK_ECDHE_RSA_WITH_AES_128_CBC_SHA
    [C014] TLS1_CK_ECDHE_RSA_WITH_AES_256_CBC_SHA
    [C009] TLS1_CK_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
    [C00A] TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
    [0032] TLS_DHE_DSS_WITH_AES_128_SHA
    [0038] TLS_DHE_DSS_WITH_AES_256_SHA
    [0013] SSL_DHE_DSS_WITH_3DES_EDE_SHA
    [0004] SSL_RSA_WITH_RC4_128_MD5

    代码清单11-102的内容是客户端发送的请求内容,Fiddler显示的并不是原始数据,但是足以证明数据在传输层面得到了保护,被加密传输,可以设置Fiddler对SSL进行解密,解密后的请求数据如代码清单11-103所示。

    代码清单11-103 实际的请求信息

     
    POST https://wcfservicewebsite.com/HelloService.svc HTTP/1.1
    Content-Type: text/xml; charset=utf-8
    VsDebuggerCausalityData: 
    uIDPo9B4edYyOw5ClT+7ozgCtOoAAAAAqjlegWjQxkCz0d14I8iaZDw+0oZgJs5BgmW5E+f6yIkACQAA
    SOAPAction: "http://tempuri.org/IHelloService/GetHello"
    Host: wcfservicewebsite.com
    Content-Length: 133
    Expect: 100-continue
    Accept-Encoding: gzip, deflate
    Connection: Keep-Alive
    <s:Envelope 
    xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><GetHello 
    xmlns="http://tempuri.org/"/></s:Body></s:Envelope>

    现在我们来配置服务端和客户端证书,分别使用上面生成的两个证书。接下来我们配置服务端证书,如代码清单11-104。

    代码清单11-104 配置服务端证书

     
    <serviceBehaviors>
    <behavior 
    name="WcfHelloService.ServiceBehavior">
    <serviceMetadata 
    httpGetEnabled="true"/>
    <serviceDebug 
    includeExceptionDetailInFaults="false"/>
    <serviceCredentials>
    <clientCertificate>
    <authentication 
    certificateValidationMode="PeerTrust"/>
    <certificate
    findValue="xClient"
    storeLocation="CurrentUser"
    storeName="TrustedPeople"
    x509FindType="FindBySubjectName"/>
    </clientCertificate>
    <serviceCertificate
    x509FindType="FindBySubjectName"
    storeLocation="CurrentUser"
    storeName="TrustedPeople"
    findValue="xServer"
    />
    </serviceCredentials>
    </behavior>
    </serviceBehaviors>

    证书配置和NetTcpBinding没有什么区别,这里我就不重复了,如果您还有疑惑可以参考前文。服务端配置好以后,我们从浏览器访问https://wcfservicewebsite.com/HelloService.svc,却出现如图11-50所示的错误。

    clip_image018

    图11-50 找不到证书错误

    我在Window7上做测试偶尔会出现这样的错误,有可能是证书存储区的缓存机制造成的,不过将证书存储在LocalMachine上,可以迅速找到。这可能和IIS托管有关,笔者对此没有深入研究,如果您遇到同样的问题可以尝试将证书放在LocalMachine存储区上。

    更新测试站点的配置,更新后客户的相关配置如代码清单11-105所示。

    代码清单11-105 客户端证书配置

     
    <system.serviceModel>
    <behaviors>
    <endpointBehaviors>
    <behavior 
    name="clientBehavior">
    <clientCredentials>
    <clientCertificate
    findValue="XuanhunClient"
    storeLocation="CurrentUser"
    storeName="TrustedPeople"
    x509FindType="FindBySubjectName"/>
    <serviceCertificate>
    <authentication 
    certificateValidationMode="None"/>
    </serviceCertificate>
    </clientCredentials>
    </behavior>
    </endpointBehaviors>
    </behaviors>
    <bindings>
    <basicHttpBinding>
    …...
    <security 
    mode="Transport">
    <transport 
    clientCredentialType="Certificate" proxyCredentialType="None">
    </transport>
    </security>
    </binding>
    </basicHttpBinding>
    </bindings>
    <client>
    <endpoint 
    address="https://wcfservicewebsite.com/HelloService.svc"
    binding="basicHttpBinding" 
    bindingConfiguration="BasicHttpBinding_IHelloService"
    contract="HelloServiceReferenceForBasic.IHelloService" 
    name="BasicHttpBinding_IHelloService" behaviorConfiguration="clientBehavior">
    </endpoint>
    </client>
    </system.serviceModel>

    代码清单11-105的配置中,我们将endpoint的address属性更改为https连接https://wcfservicewebsite.com/HelloService.svc",并配置<authentication certificateValidationMode="None"/>使得客户端不验证服务端证书。

    启动测试站点,得到了如图11-51的错误。

    clip_image020

    图11-51 SSL配置不一致错误

    出现图11-51的错误的原因在于服务本身要求客户端必须传递证书,而IIS的SSL设置没有对客户证书设置成必须。按图11-52修改就可以了。

    clip_image022

    图11-52 设置IIS的SSL

    现在我们再次运行测试站点,结果如图11-53。

    clip_image024

    图11-53 Certificate验证成功

    图11-53中成功的返回证书标识和验证类型X509,说明服务端对客户端证书的验证成功。


    作者:玄魂
    出处:http://www.cnblogs.com/xuanhun/
    原文链接:http://www.cnblogs.com/xuanhun/ 更多内容,请访问我的个人站点 对编程,安全感兴趣的,加qq群:hacking-1群:303242737,hacking-2群:147098303,nw.js,electron交流群 313717550。
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    关注我:关注玄魂的微信公众号

  • 相关阅读:
    Cesium中的坐标系及转换
    Cesium Workshop
    window.postMessage 跨窗口,跨iframe javascript 通信
    VUE课程参考---7、跑马灯效果
    VUE课程---9、事件绑定v-on
    VUE课程---8、属性绑定v-bind
    VUE课程---7、解决插值表达式闪烁问题
    小谈chrome调试命令:console.log的使用
    Hadoop平台配置总结
    hadoop 关闭进程时报错no 进程 to stop
  • 原文地址:https://www.cnblogs.com/xuanhun/p/2096198.html
Copyright © 2011-2022 走看看