【发布时间】:2012-03-24 18:57:34
【问题描述】:
我开发了一个 ASP.NET MVC 网站,该网站还托管 WCF 4 服务;我创建了一个 .NET Windows 应用程序,它补充了网站并通过 Internet 使用该 Web 服务与之交互。这两个程序都是在 Visual Studio 2010 中使用 .NET 4 创建的。与 WCF 服务一起使用的绑定是 WsHttpBinding。
我的唯一安全要求是 WCF 服务不被某个未知方使用,因为这会污染我网站数据库中的信息。我不需要任何隐私:我不在乎是否有第三方看到我发送到网络服务的消息(即不需要加密)
考虑到这一单一要求,并且据我对 Web 服务安全性的了解,实现该安全方案的最佳方法是让客户端使用 X509 证书签署每条 SOAP 消息,并获得 Web 服务信任使用其“受信任的人”存储中存在的证书签名的任何消息。由于证书使用公钥/私钥对,即使消息没有加密,如果没有用于签名消息的私钥,未经授权的第三方也无法复制它。这也可以确保我消息的完整性。
考虑到这个决定,我使用 makecert.exe 创建了一个测试证书。我在“当前用户”“我的”证书存储中的客户端计算机(带有 Windows 应用程序的计算机)中安装了带有 both 私钥和公钥的版本。然后,我导出了证书(没有私钥),并将其安装在 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>
客户端 Windows 应用程序上的配置将证书设置为其凭据。绑定配置与服务器中的配置相同。
<behaviors>
<endpointBehaviors>
<behavior name="CertificateCredential">
<clientCredentials>
<clientCertificate findValue="ErrEye"
storeLocation="CurrentUser"
storeName="My"
x509FindType="FindBySubjectName" />
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
问题是,使用此配置,当我尝试检查 Web Service 主机是否启动成功时,我收到以下错误:
The service certificate is not provided. Specify a service certificate in ServiceCredentials.
我的问题是,我不想指定“服务证书”。据我了解,服务证书将允许客户端对服务进行身份验证,但我不需要它;我只希望服务对客户端进行身份验证,仅此而已。我确实理解这意味着如果有人冒充网络服务器(例如,通过篡改我的客户端计算机的 DNS 设置),它将接收来自我的客户端的消息,而客户端不会知道它不是与预期的接收者交流:我不介意这种情况发生。
总之,我的问题是:如何在 WCF 中配置我所描述的安全方案?
提前感谢您的帮助。
【问题讨论】:
标签: wcf security x509certificate