【问题标题】:Wcf custom certificate validation doesn't validateWcf 自定义证书验证不验证
【发布时间】:2015-05-27 18:54:57
【问题描述】:

我试图在我的 wcf 配置中查找错误,但找不到问题所在。可能我需要更多的眼睛;无论如何,我想在 wcf 中使用自定义认证验证。我在我的 CertificateValidator 类中设置了断点,但是这个断点没有捕获任何请求,但是应用程序正在运行并且我可以发送请求(没有证书)。

这是我的配置

<system.serviceModel>
  <bindings>
    <basicHttpBinding>
      <binding maxReceivedMessageSize="104857600">
        <security>
          <message clientCredentialType="Certificate" />
        </security>
      </binding>
    </basicHttpBinding>
  </bindings>

  <services>
    <service name="AccountService" behaviorConfiguration="">
      <endpoint address="" binding="basicHttpBinding" bindingConfiguration="" contract="IAccountService"></endpoint> 
    </service>
    <service name="PortalService" behaviorConfiguration="">
      <endpoint address="" binding="basicHttpBinding" bindingConfiguration="" contract="IPortalService"></endpoint>
    </service>
  </services>

  <behaviors>
    <serviceBehaviors>
      <behavior>
        <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
        <serviceDebug includeExceptionDetailInFaults="false"/>
        <serviceCredentials>
          <clientCertificate>
            <authentication certificateValidationMode="Custom" customCertificateValidatorType="Services.Validators.CertificateValidator, Services" />
          </clientCertificate>
        </serviceCredentials>
      </behavior>
    </serviceBehaviors>
  </behaviors>
  <protocolMapping>
      <add binding="basicHttpsBinding" scheme="https" />
  </protocolMapping>    
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>

【问题讨论】:

    标签: c# .net wcf certificate x509certificate


    【解决方案1】:

    您使用的是 NET 4 还是 4.5?

    我认为你错过的事情:

    • 您的自定义basicHttpBinding 需要使用&lt;security mode="Message"&gt;(目前您没有指定它,即默认为"None"
    • 您的自定义 basicHttpBinding 需要一个 name= 以便可以引用它
    • 您的端点需要使用bindingConfiguration= 引用自定义basicHttpBinding
    • 您的自定义服务行为需要 name= 以便可以引用
    • 您的服务需要使用behaviorConfiguration=引用自定义服务行为
    • 您的服务需要在&lt;serviceCredentials&gt; 中指定一个&lt;serviceCertificate&gt;,该协议用于与客户端建立安全通道
    • 您的客户端需要知道&lt;clientCredentials&gt; 中的'&lt;serviceCertificate&gt;',以便与服务器建立安全通道
    • 您的客户端需要将用于凭据的证书附加到发送到服务器的请求(通过在 .config 中的 &lt;clientCredentials&gt; 中指定 &lt;clientCertificate&gt; 或以编程方式)
    • 确保您已正确创建和安装证书

    注意:您应该至少创建了 2 个证书 - 1 用于服务器的身份 - 客户端使用 1 个或多个证书(取决于您是否决定所有客户端都应提供相同的证书,或者您是否为每个客户端分配唯一的证书) - 不要对服务器身份和客户端凭据使用相同的证书

    一些有助于理解“消息级别安全性”的链接:

    如果您的消息交换速度太慢,请考虑使用“传输”级别的安全性。

    试试这个:

      <system.serviceModel>
        <bindings>
          <basicHttpBinding>
            <binding name="securebasicHttpBinding" maxReceivedMessageSize="104857600">
              <security mode="Message">
                <message clientCredentialType="Certificate" />
              </security>
            </binding>
          </basicHttpBinding>
        </bindings>
    
        <services>
          <service behaviorConfiguration="secureBehaviour" name="AccountService">
            <endpoint address="" binding="basicHttpBinding" bindingConfiguration="securebasicHttpBinding"
              contract="IAccountService" />
          </service>
          <service behaviorConfiguration="secureBehaviour" name="PortalService">
            <endpoint address="" binding="basicHttpBinding" bindingConfiguration="securebasicHttpBinding"
              contract="IPortalService" />
          </service>
        </services>
    
        <behaviors>
          <serviceBehaviors>
            <behavior name="secureBehaviour">
              <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
              <serviceDebug includeExceptionDetailInFaults="false"/>
              <serviceCredentials>
                <serviceCertificate ...something goes here... />
                <clientCertificate>
                  <authentication certificateValidationMode="Custom" customCertificateValidatorType="Services.Validators.CertificateValidator, Services" />
                </clientCertificate>
              </serviceCredentials>
            </behavior>
          </serviceBehaviors>
        </behaviors>
        <protocolMapping>
          <add binding="basicHttpsBinding" scheme="https" />
        </protocolMapping>
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
      </system.serviceModel>
    

    【讨论】:

    • 你好科林,谢谢你的回答,我试过了,但没有效果。您只需添加绑定名称并为服务设置该名称,对吗?还是我错过了什么?
    • 看看这是否能让你更进一步
    • 嘿科林感谢您为您的答案添加提示,您提到的所有内容都是正确的,我可以添加到该列表中“将身份添加到端点(我认为 basicHttpBinding 需要它)”。我犯的最大错误是认为服务仅用于验证从客户端到服务的消息,这就是我错过 的原因。显然 WCF 不能只验证一个方向的消息。但是您在我错过某些元素中的名称之前提到的内容,我认为.net 将使用没有名称的默认规范......无论如何,我认为您的回答是正确且有帮助的。
    猜你喜欢
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    • 1970-01-01
    • 2019-07-21
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多