【发布时间】:2012-01-10 10:08:05
【问题描述】:
客户端机器在当前用户的“My”存储中拥有“TicketSalesClient”证书,在当前用户的“TrustedPeople”存储中拥有“TicketSalesServer”证书。服务器机器在本地机器的“TrustedPeople”存储中具有“TicketSalesClient”证书,在本地机器的“My”存储中具有“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) Forbidden。”
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 安全通道建立信任关系。根据验证程序,远程证书无效”
那我做错了什么?
【问题讨论】:
-
一个证书用于客户端认证,第二个用于服务认证。我应该在客户端上使用 TicketSalesServer 证书做什么?我应该使用客户自己的证书作为凭证。
标签: wcf client certificate anonymous