我有一个自托管的wcf服务,该服务使用具有传输安全性的wsHttpBinding。我希望该服务使用证书对客户端进行身份验证。
当客户端使用clientCredentialsType设置为“ None”与服务进行通信时,一切正常。 证书是使用OpenSSL(自签名)创建的,并已在特定端口上的netsh注册。证书的名称为DomainName(在我的情况下为计算机名)。
更新
我已经为客户端和服务器创建了证书,并将它们分别放置在其他受信任的根存储中(服务器证书在客户端的存储中,反之亦然)。
我在SOF上浏览了很多文章和其他问题,但即使是看起来相关的文章也无法帮助我解决问题。
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="serviceBehavior">
<serviceMetadata httpsGetEnabled="true" httpGetEnabled="false" />
<serviceDebug includeExceptionDetailInFaults="true" httpsHelpPageEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<wsHttpBinding>
<binding name="httpsBinding" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" sendTimeout="01:00:00">
<security mode="Transport" >
<transport clientCredentialType="Certificate"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
<services>
<service behaviorConfiguration="serviceBehavior" name="Service">
<endpoint binding="wsHttpBinding" bindingConfiguration="httpsBinding" contract="SomeNamespace.IService"/>
<host>
<baseAddresses>
<add baseAddress="https://domain:port/Something/"/>
</baseAddresses>
</host>
</service>
</services>
</system.serviceModel>
<system.serviceModel>
<client>
<endpoint address="https://domain:port/Something/"
behaviorConfiguration="endpointCredentialBehavior"
binding="wsHttpBinding"
bindingConfiguration="Binding"
contract="SomeNamespace.IService"/>
</client>
<behaviors>
<endpointBehaviors>
<behavior name="endpointCredentialBehavior">
<clientCredentials>
<clientCertificate findValue="DomainName"
storeLocation="LocalMachine"
storeName="My"
x509FindType="FindBySubjectName" />
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
<bindings>
<wsHttpBinding>
<binding name="Binding">
<security mode="Transport">
<transport clientCredentialType="Certificate"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
</system.serviceModel>
我收到以下异常:
System.ServiceModel.Security.MessageSecurityException:客户端身份验证方案“匿名”禁止了HTTP请求。 ---> System.Net.WebException:远程服务器返回错误:(403)禁止。 在System.Net.HttpWebRequest.GetResponse() 在System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)处
答案 0 :(得分:0)
我们还需要做一件事。我们应该使他们的证书相互信任。服务器的证书必须受客户端信任,并且客户端的证书必须受服务器信任。
具体来说,服务器证书安装在客户端受信任的根证书颁发机构中,客户端证书安装在服务器受信任的根证书颁发机构中。最好使用本地计算机证书存储。我们可以使用Certlm.msc命令检查证书。
有关此问题,请参阅正式文件。
https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/transport-security-with-certificate-authentication
对于由其他特殊工具(例如PowerShell)创建的某些特殊证书,我们最好使项目的目标框架(服务器和客户端)高于4.6.2。
https://github.com/dotnet/docs/issues/12000
随时让我知道是否有什么可以帮助您的。
答案 1 :(得分:0)
您的配置文件看起来还不错。 无论我在何处添加该证书,我的第三方客户证书(公钥)都存在相同的问题。 但是,我设法使其与我的自签名客户端证书一起使用。我只需要将客户端CA证书添加到服务器上的“受信任的根证书颁发机构”。
我发现这两个主题有助于确定某些问题: Mutual authentication with a IIS hosted WCF WCF – 2 Way SSL Security using Certificates希望对您有帮助。如果我能够解决此问题,我会发布更新。