使用客户端证书进行身份验

时间:2011-12-01 08:26:42

标签: wcf client certificate anonymous

客户端计算机在当前用户的“我的”存储中具有“TicketSalesClient”证书,在当前用户的“TrustedPeople”存储中具有“TicketSalesServer”证书。服务器计算机在本地计算机的“TrustedPeople”存储中具有“TicketSalesClient”证书,在本地计算机的“我的”存储中具有“TicketSalesServer”证书。

该服务在IIS 7下运行。下面是web.config文件:

<system.serviceModel> 
<services>
  <service behaviorConfiguration="secureBehavior" name="InternetRailwayTicketSales.TicketSalesImplementations.TicketSalesService">
    <endpoint address="TicketSalesService" 
              binding="basicHttpBinding" 
              bindingConfiguration="secureHttpBinding" contract="InternetRailwayTicketSales.TicketSalesInterface.ITicketSales" />

    <endpoint address="TicketSalesServiceSecureMex" 
              binding="basicHttpBinding" 
              bindingConfiguration="secureHttpBinding" 
              contract="IMetadataExchange" />

    <host>
      <baseAddresses>
        <add baseAddress="https://localhost:443/TicketSales/" />            
      </baseAddresses>
    </host>

  </service>
</services>
<bindings>
  <basicHttpBinding>
    <binding name="secureHttpBinding">
      <security mode="Transport">
        <transport clientCredentialType="Certificate"/>
      </security>
    </binding>
  </basicHttpBinding>
</bindings>

<behaviors>
  <serviceBehaviors>
    <behavior name="secureBehavior">
      <serviceThrottling maxConcurrentInstances="5000" maxConcurrentSessions="5000" />
      <serviceMetadata httpsGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="True" />
      <serviceCredentials>
        <serviceCertificate findValue="TicketSalesServer" 
                            storeLocation="LocalMachine"
                            storeName="My"
                            x509FindType="FindBySubjectName"/>
        <clientCertificate>
          <authentication certificateValidationMode="PeerTrust"/>
        </clientCertificate>
      </serviceCredentials>
    </behavior>
  </serviceBehaviors>
</behaviors>

IIS中的服务配置为SSL和证书需要。

1)现在当我尝试在客户端添加服务引用时,我收到:“HTTP请求被禁止使用客户端身份验证方案'匿名'。远程服务器返回错误:(403)禁止。”

2)如果我尝试使用浏览器请求元数据端点,我首先应用SSL证书,然后收到“凭据不授予查看此目录或页面的权限”的错误。据我所知,这是因为我无法通过浏览器提供客户端凭据。

3)我尝试将svcutil与包含客户端凭据的配置文件一起使用:

    <configuration>
  <system.serviceModel>
    <client>
      <endpoint 
        behaviorConfiguration="ClientCertificateBehavior"
        binding="basicHttpBinding"
        bindingConfiguration="Binding1" 
        contract="IMetadataExchange"
        name="https" />
    </client>
    <bindings>
      <basicHttpBinding>
        <binding name="Binding1">
          <security mode="Transport">
            <transport clientCredentialType="Certificate" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <behaviors>
      <endpointBehaviors>
        <behavior name="ClientCertificateBehavior">
          <clientCredentials>
            <clientCertificate findValue="TicketSalesClient"
                               storeLocation="CurrentUser"
                               storeName="My"
                               x509FindType="FindBySubjectName" />
          </clientCredentials>
        </behavior>
      </endpointBehaviors>
    </behaviors>
  </system.serviceModel>
    </configuration>

然后:

svcutil https://veryLongAddress.svc?wsdl /config:svcutilConf.config

响应是“底层连接已关闭:无法为SSL / TLS安全通道建立信任关系。根据验证程序,远程证书无效”

那么我做错了什么?

3 个答案:

答案 0 :(得分:1)

好像你的证书安装没问题。你可以尝试如下所示,看看输出。尝试从IE浏览到该服务,您应该能够看到该服务及其wsdl。

转到IE,然后

工具 - &gt;互联网选项 - &gt;安全 - &gt;互联网 - &gt;自定义级别

工具 - &gt;互联网选项 - &gt;安全 - &gt;内联网 - &gt;自定义级别

现在向下滚动到Misc部分,找到选项“当没有证书或只有一个证书时,不要提示客户端证书选择”Diable。

现在重新启动IE并浏览到该服务,IE应该要求您从个人存储中选择一个客户端证书,并且您需要选择mvc.localhost。

如果看不到TicketSalesClient证书,则您的客户端证书不在相应的商店中。

原因是您用于安装证书的文件与创建证书的目的一样重要。当您在证书库中双击它们时,您可以找到每个证书的用途,您有一个名为“预期目的”的列。确保它是您的客户证书。

答案 1 :(得分:0)

在IIS中托管服务时,所有端点必须具有相同的传输安全配置。之前我玩过这个,最后重新定义了WSDL GET的绑定(是的,它还定义了内部绑定)。因此,将服务绑定修改为:

  <basicHttpBinding>
    <binding name="secureHttpBinding">
      <security mode="Transport">
        <transport clientCredentialType="Certificate" />
      </security>
    </binding>
  </basicHttpBinding>
  <customBinding>
    <binding name="wsdlBinding">
      <textMessageEncoding messageVersion="None" />
      <httpsTransport requireClientCertificate="true" />
    </binding>
  </customBinding> 

在服务行为中使用:

  <serviceMetadata httpsGetEnabled="true" 
                   httpsGetBinding="customBinding" 
                   httpsGetBindingConfiguration="wsdlBinding" />

这应该强制WSDL获取需要客户端证书,并且“应该”从浏览器工作(除非有其他问题)。

答案 2 :(得分:0)

当我们在IIS中使用安全类型传输和客户端凭据类型证书托管WCF服务时,然后将您的客户端证书放在根存储并在IIS中启用匿名身份验证。 Enable anonymous authentication in IIS But most important, add your certificate to root store.