WCF使用SSL和客户端证书显示403 Forbidden

时间:2014-12-05 19:26:57

标签: c# wcf ssl

我们遇到了WCF问题 - 我们在尝试连接时遇到以下错误。对于各种配置有很多建议,尝试过它们我们可以使用一些帮助。

我们使用HTTPS来实现传输安全性,使用我们从GoDaddy获得的真实SSL证书。当我们浏览网站上的网页时,它似乎已安装并正常工作。没有身份验证,我们可以正确连接到我们的WCF服务。

对于身份验证,我们使用自己创建的客户端证书。在我们使用带有自签名服务器证书的消息安全性时,这些客户端证书在我们切换到HTTPS之前工作正常(这很痛苦,因为我们必须让客户端安装服务器证书)。

错误 客户端身份验证方案“匿名”禁止HTTP请求。 内部异常:远程服务器返回错误:(403)禁止

服务器配置文件

<system.serviceModel>
  <bindings>
    <wsHttpBinding>
      <binding name="NewBinding0">
        <security mode="Transport">
          <transport clientCredentialType="Certificate" />
        </security>
      </binding>
    </wsHttpBinding>
  </bindings>
  <services>
    <service name="WcfService1.Service1">
      <endpoint address="" binding="wsHttpBinding" bindingConfiguration="NewBinding0" contract="WcfService1.IService1" />
    </service>
  </services>
  <behaviors>
    <serviceBehaviors>
      <behavior name="">
        <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
        <serviceDebug includeExceptionDetailInFaults="true" />
        <serviceCredentials>
          <clientCertificate>
            <authentication certificateValidationMode="PeerTrust" />
          </clientCertificate>
          <serviceCertificate findValue="....." x509FindType="FindByThumbprint" />
        </serviceCredentials>
      </behavior>
    </serviceBehaviors>
  </behaviors>
  <protocolMapping>
    <add scheme="https" binding="wsHttpBinding" bindingConfiguration="NewBinding0" />
  </protocolMapping>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>

客户端配置文件

<system.serviceModel>
    <behaviors>
        <endpointBehaviors>
            <behavior name="NewBehavior0">
                <clientCredentials>
                    <clientCertificate findValue="customuser1"
                        storeName="TrustedPeople" x509FindType="FindBySubjectName" />
                </clientCredentials>
            </behavior>
        </endpointBehaviors>
    </behaviors>
    <bindings>
        <wsHttpBinding>
            <binding name="NewBinding0">
                <security mode="Transport">
                    <transport clientCredentialType="Certificate" />
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>
    <client>
        <endpoint address="https://www.insertoursitename.com/WcfService1/Service1.svc"
            behaviorConfiguration="NewBehavior0" binding="wsHttpBinding"
            bindingConfiguration="NewBinding0" contract="ServiceReference1.IService1"
            name="wsHttpBinding_IService1" />
    </client>
</system.serviceModel>

1 个答案:

答案 0 :(得分:0)

我的问题与你的问题非常相似,我会在回答问题之前描述我的情景。

  1. 创建了一个简单的WCF服务(使用自定义绑定,但这无关紧要)。
  2. 使用makecert创建自签名RootCA,并生成两个用于SSL加密的证书 tempCertServer.cer ,将IIS配置为需要https等。 - &GT;测试了这部分,从浏览器从另一台计算机上运行正常。
  3. 第二个证书 tempCertClient.cer 用作要呈现给IIS的客户端证书,将IIS配置为要求客户端证书等 - &gt;从浏览器测试此部分(最好使用IE,因为您可以轻松清除SSL状态)。我得到提示选择客户端证书,但从不连接,错误与问题完全相同: “HTTP请求被禁止使用客户端身份验证方案'Anonymous'。内部异常:远程服务器返回错误:(403)Forbidden。”
  4. 用适当的证书(来自已知的CA)替换tempCertClient,没有问题,建立了连接并显示了WCF页面;无论我尝试使用自签名客户端证书,总是遇到上述错误。
  5. 浪费了一整天++尝试各种设置,阅读有关注册表更改的博客,将证书服务器端置于不同的证书存储区,更改配置文件设置等,无需解析。

    答案非常简单,检查本地计算机\受信任的根证书颁发机构服务器端,并删除任何非根CA(即不应存在的那些,IssuedTo NOT EQUALS IssuedBy)

    客户端证书本身不需要安装在服务器上,只有可以验证它的根CA必须安装在服务器端的LocalComputer \ Trusted Root证书颁发机构中。