WCF代理错误使用X509证书

时间:2011-04-27 18:29:41

标签: wcf service certificate x509


我创建了一个wcf服务,并且可以在客户端应用程序中成功引用它。但是当我实施X509证书时,问题出现了。

1)当我更改服务以使用x509证书时,我无法创建代理,因为浏览器中未显示mex端点。那么在这种情况下,当服务受到保护并且未公开mex端点时,我应该如何在客户端应用程序中引用服务?

2)我可以同时使用邮件和传输安全作为证书吗?这个场景是否适用于basicHttpBinding?我听说basicHttpBinding不能通过证书来保证消息安全。

在这方面的任何帮助,将受到高度赞赏。

这是我服务中的服务模型。

<system.serviceModel>
<client>       
  <endpoint behaviorConfiguration="" 
    binding="basicHttpBinding"
        bindingConfiguration="WCFServiceX509Binding" 
    contract="WCFService.Contract.Service.IWCFServiceContract"
        name="WCFServiceClientEndPoint" />      
</client>
<bindings>
  <basicHttpBinding>
    <binding name="WCFServiceX509Binding" maxBufferSize="6553600"
      maxBufferPoolSize="52428800" maxReceivedMessageSize="6553600">
      <security mode="TransportWithMessageCredential">
        <transport clientCredentialType="Certificate" />
        <message clientCredentialType="Certificate" />
      </security>
    </binding>        
  </basicHttpBinding>
</bindings>
<services>
  <service  behaviorConfiguration="ServiceBehavior" 
    name="WCFService.Model.WCFServiceModel">
    <endpoint 
    address="" 
    binding="basicHttpBinding" 
    bindingConfiguration="WCFServiceX509Binding"
        name="WCFServiceBasicHttpEndPoint" 
    contract="WCFService.Contract.Service.IWCFServiceContract">
      <identity>
            <certificateReference findValue="WCFUADOCServer" />
      </identity>
    </endpoint>
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="ServiceBehavior">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
      <serviceCredentials />
    </behavior>
  </serviceBehaviors>
  <endpointBehaviors>
    <behavior name="ClientCertificateBehavior">
      <clientCredentials>
        <clientCertificate  findValue="WCFUADOCServer"
                  x509FindType="FindBySubjectName"
                  storeLocation="LocalMachine"
                  storeName="TrustedPeople" />
      </clientCredentials>
    </behavior>
  </endpointBehaviors>
</behaviors>

非常感谢, 昌德。

1 个答案:

答案 0 :(得分:0)

  1. Mex端点不依赖于证书。根据您的配置,您根本不公开mex端点,并且仍然可以通过HTTP使用WSDL的帮助页面。
  2. 你想做什么?安全性有点high level term in this case。您可以使用安全传输通道,您可以使用在消息中传输的证书进行身份验证(我从未尝试过这种组合)。该方案应该适用于BasicHttpBinding。我自己感到很惊讶,但BasicHttpBinding实际上支持完全相互证书的非对称邮件安全性。
  3. 如果要使用传输安全性公开服务,则必须使用HTTPS - 由IIS management console(在IIS中托管时)或assign certificate to port by netsh(自托管)配置。请注意,运行该服务的帐户必须能够访问证书中的私钥 - you must correctly set up ACL

    如果要按证书对客户端进行身份验证,则应设置service credentials。如果您使用放置到证书库的自签名证书,则应至少使用以下内容:

    <serviceCredentials>
      <clientCertificate>
       <authentication certificateValidationMode="PeerTrust" />
      </clientCertificate>
    </serviceCredentials>
    

    您还可以定义custom certificate validator。对于端点使用而不是dns标识。

    对于客户端,还使用PeerTrust验证模式进行服务证书。