客户端计算机在当前用户的“我的”存储中具有“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安全通道建立信任关系。根据验证程序,远程证书无效”
那么我做错了什么?
答案 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.