• WCF服务关于Username的SSL或X.509认证


      背景:在Win 7+IIS7的环境下,开发基于basicHttpBinding ,netTcpBinding的Username认证的WCF服务。

       basicHttpBinding, netTcpBinding的认证方式使用UserName时,WCF限制不能传输明文的username/password,wcf限制请使用ssl、x.509加密解密2中途径。

    下面是使用UserName的一种绑定配置:

    <netTcpBinding>

    <binding name="securityconfg">

    <security mode="TransportWithMessageCredential">

    <message clientCredentialType="UserName"/>

    </security>

    </binding>

    </netTcpBinding>

    basicHttpBinding:

    basicHttpBinding 的UserName需要在IIS网址的绑定添加https协议,并指定SSL证书。MSDN的说明:For the basicHttpBinding, this requires setting up an SSL channel.

    netTcpBinding:

    可以使用https指定的SSL证书,也可以重新创建新的证书:

    做个测试程序就没有必要去申请一个X509数字签名证书了,微软提供了一个makecert.exe的命令专门用来生成测试使用的X509证书的,那我们就来建立一个测试用的证书,在cmd下输入以下命令:

    makecert.exe -sr LocalMachine -ss My -a sha1 -n CN=MyServer -sky exchange –pe

    这个命令的意思就是创建一个测试的X509证书,这个证书放在存储位置为'Localmachine'的'My'这个文件夹下,证书主题名字叫'MyServer',需要更多关于makecert命令的信息请参考MSDN。

    对应的配置如下:

    <serviceCertificate storeName="My" findValue="MyServer"

    x509FindType="FindBySubjectName" storeLocation="LocalMachine"/>

    需要注意的2点:

    1,需要设置IIS宿主对密钥访问权限,方法如下:

    下载FindPrivateKey.exe工具,通过命令查找指定证书

    FindPrivateKey My LocalMachine -n "CN= MyServer "

    查找到对应的密钥存放位置,然后找到此文件,在文件属性安全添加IIS_IUSRS用户的读权限。

    2,由于使用的是测试证书,客户端调用时可能遇到下面的提示:

    X.509 certificate CN=MyServer 链生成失败。所使用的证书具有无法验证的信任链。请替换该证书或更改 certificateValidationMode

    解决方法:

    在客户单的app.config/web.config中添加如下行为(禁用证书验证,正式环境可以不用)并修改配置文件中对应endpoint的behaviorConfiguration="myClientBehavior"。

    <behaviors>

    <endpointBehaviors>

    <behavior name="myClientBehavior">

    <clientCredentials>

    <serviceCertificate>

    <authentication certificateValidationMode="None"/>

    </serviceCertificate>

    </clientCredentials>

    </behavior>

    </endpointBehaviors>

    </behaviors>

    关于negotiateServiceCredential 属性说明:

               negotiateServiceCredential 默认值为true,此属性指示是否在客户端和服务之间自动协商服务证书。如果此属性为 true,则会进行此类协商。如果此属性为 false,则与服务通信之前必须在客户端指定服务证书。服务端必须始终指定一个证书。例如下面的配置,就需要在客户端指定证书。

    <security mode="Message">
    <message clientCredentialType="UserName" negotiateServiceCredential ="false"/>
    </security>

    扩展阅读:

    WCF ClearUsernameBinding: Send username without SSL or x.509 certificates

    WCF X.509证书创建与IIS宿主设置

  • 相关阅读:
    (转)oracle 11g安装后用户名忘记怎么办
    svn
    (转)ublox公司AGPS解决方案简介
    转(Google 全国 地图 纠偏数据 偏移数据 火星坐标修正 方案 )
    (转)真实经纬度的最简单获得方法
    (转)64bit上安装32位oracle 10 g出现错误:无法定位承诺工序输入点 getprocessimagifilenamew 于动态链接库PSAPI.DLL
    转】PPT带备注演示(只有讲解者看到备注)[转载]
    iphone应用程序结构
    ObjC 初识
    并行编程(PLINQ)学习笔记
  • 原文地址:https://www.cnblogs.com/webJingGao/p/3230374.html
Copyright © 2020-2023  润新知