【问题标题】:WCF Proxy error Using X509 Certificate使用 X509 证书的 WCF 代理错误
【发布时间】:2011-04-27 18:29:41
【问题描述】:


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

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

2) 我可以同时使用消息和传输安全作为证书吗?这种情况适用于 basicHttpBinding 吗?听说basicHttpBinding不能通过证书来保证消息安全。

在这方面的任何帮助,将不胜感激。

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

<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>

非常感谢, 钱。

【问题讨论】:

    标签: wcf service certificate x509


    【解决方案1】:
    1. Mex 端点不依赖于证书。根据您的配置,您根本不会公开 mex 端点,并且使用 WSDL 的帮助页面应该仍然可以通过 HTTP 访问。
    2. 你想做什么?安全性是一点点high level term in this case。您可以使用安全传输通道,也可以使用消息中传输的证书进行身份验证(我从未尝试过这种组合)。该场景应该适用于BasicHttpBinding。我自己对此感到惊讶,但 BasicHttpBinding 实际上支持完全的相互证书非对称消息安全。

    如果您想公开具有传输安全性的服务,您必须使用 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 验证模式。

    【讨论】:

    • 哇,速度真快……很棒的参考资料。是的,安全性非常高。基本上它携带非常敏感的信息,因此我必须同时具有传输和消息安全性。
    • 我会尽力做你建议的所有事情,并会再次回复你。非常感谢您的回复。尊敬的钱德。
    • 我忘记向您发布有关“高级术语”的附加链接。我修改了答案。
    • 在这方面我还有一个问题。在客户端,如果我们在配置文件中设置了使用证书的行为,我们是否应该再次在代码中传递证书?
    • “供客户端使用,也可用于服务证书的 PeerTrust 验证模式”这是什么意思?我应该在 ?? 中添加它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-18
    • 2012-04-09
    • 1970-01-01
    • 2012-03-04
    • 2016-03-20
    • 1970-01-01
    相关资源
    最近更新 更多