繁体   English   中英

具有证书客户端身份验证的自托管Wcf服务

[英]Self-Hosted Wcf Service with Certificate client authentication

我有一个自托管的wcf服务,它使用wsHttpBinding和Transport安全性。 我希望服务使用证书对客户端进行身份验证。

当客户端使用clientCredentialsType设置为“None”与服务进行通信时,一切正常。 证书是使用OpenSSL(自签名)创建的,并在特定端口上注册netsh。 证书的名称是DomainName(在我的情况下是机器名)。

更新
我已经为客户端和服务器创建了证书,并将它们放在彼此的Trusted Root存储中(客户端存储中的服务器证书,反之亦然)。

我已经在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:禁止使用客户端身份验证方案“Anonymous”的HTTP请求。 ---> System.Net.WebException:远程服务器返回错误:(403)Forbidden。 System.Service.Net.HttpWebRequest.GetResponse()at System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)

还有一件事我们需要做。 我们应该让他们的证书相互信任。 客户端必须信任服务器的证书,并且服务器必须信任客户端的证书。
具体而言,服务器证书安装在客户端受信任的根证书颁发机构中,客户端证书安装在服务器受信任的根证书颁发机构中。 最好使用本地计算机证书存储区。 我们可以使用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
如果有什么我可以帮忙,请随时告诉我。

你的配置文件看起来没问题。 我的第三方客户端证书(公钥)也有同样的问题,无论我添加哪个证书仍然无效。 但是我已经设法使用我的自签名客户端证书。 我只需要将客户端CA证书添加到服务器上的受信任的根证书颁发机构。

我发现这两个主题有助于确定一些问题: 使用IIS托管的WCF WCF进行 相互身份验证 - 使用证书的双向SSL安全性

希望它对你有所帮助。 如果我能设法解决这个问题,我会发布更新。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM