配置WCF服务以通过使用X509证书来验证客户端,但没有服务器凭据

问题描述:

我开发了一个也托管WCF 4服务的ASP.NET MVC网站;并且我创建了一个.NET Windows应用程序,它补充了网站并通过互联网使用该Web服务与其交互。这两个程序都是在Visual Studio 2010中使用.NET 4创建的。与WCF服务一起使用的绑定是WsHttpBinding。配置WCF服务以通过使用X509证书来验证客户端,但没有服务器凭据

我的只有安全要求是WCF服务未被某个未知方使用,因为这会污染我网站数据库中的信息。我不需要任何隐私:我不在乎某些第三方是否看到了我发送给Web服务的消息(即,不需要加密)

考虑到单个需求,并且尽可能我对Web服务安全性的了解是,实现该安全场景的最佳方式是让客户端用X509证书签署每个SOAP消息,并让Web服务信任任何使用“可信任人员”证书签署的消息“商店。由于证书使用公钥/私钥对,即使邮件未加密,如果没有用于签署邮件的私钥,未经授权的第三方也不能复制它。这也可以保证我的信息完整性。

考虑到这个决定,我使用makecert.exe创建了一个测试证书。我在“当前用户”“我的”证书存储中安装了带有版本的版本的客户机(带有Windows应用程序的机器)中的私钥和公钥。然后,我导出了证书(不带私钥),并将其安装在Web服务器的“本地计算机”证书存储区的“可信人员”中。

我的(失败的)尝试配置方案到目前为止是这样的:

绑定配置为使用消息安全,在该消息预计的证书类型的客户端凭据。此外,服务器被配置为使用PeerTrust代替ChainTrust,由于测试证书不是由受信任的CA发出:

<bindings> 
    <wsHttpBinding> 
    <binding> 
     <security mode="Message"> 
     <transport clientCredentialType="None" proxyCredentialType="None" /> 
     <message clientCredentialType="Certificate" /> 
     </security> 
    </binding> 
    </wsHttpBinding> 
</bindings> 

<behaviors> 
    <serviceBehaviors> 
    <behavior name="Standard"> 
     <serviceMetadata httpGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
     <serviceCredentials> 
     <clientCertificate> 
      <authentication certificateValidationMode = "PeerTrust" trustedStoreLocation="LocalMachine"/> 
     </clientCertificate> 
     </serviceCredentials> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 

在客户端窗口应用程序的配置设置证书作为其证书。绑定配置与服务器中的配置相同。

<behaviors> 
    <endpointBehaviors> 
    <behavior name="CertificateCredential"> 
     <clientCredentials> 
     <clientCertificate findValue="ErrEye" 
          storeLocation="CurrentUser" 
          storeName="My" 
          x509FindType="FindBySubjectName" /> 
     </clientCredentials> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 

的问题是,这种配置,当我尝试检查,如果Web服务主机已成功启动,我收到以下错误:

The service certificate is not provided. Specify a service certificate in ServiceCredentials. 

我的问题是,我不知道想要指定“服务证书”。据我了解,服务证书将允许客户端验证服务,但我不需要;我只想要服务来验证客户端,就是这样。 I do理解这意味着如果有人冒充Web服务器(例如通过篡改我的客户端计算机的DNS设置),它会从我的客户端接收消息,客户端不会知道它未与其预期的接收者通信:我不介意这是否会发生。

总之,我的问题是:如何在WCF中配置我描述的安全场景?

在此先感谢您的帮助。

只要它的.net来。净(直到现在仍然如此) - 添加此

negotiateServiceCredential=true 

到:

<message clientCredentialType="Certificate" /> 

但要注意,你将失去与非.NET客户端的互操作性。

+0

不幸的是,服务主机仍然不会启动并显示指定服务凭证的相同错误。以“true”和“false”两种方式试用negotiateServiceCredential。 – andragon 2012-03-25 01:14:22