【问题标题】:Configure a WCF service to authenticate the client by using X509 certificates but without server credentials配置 WCF 服务以使用 X509 证书但不使用服务器凭据对客户端进行身份验证
【发布时间】: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


    【解决方案1】:

    只要它的 .net 到 .net(并且仍然如此) - 添加这个

    negotiateServiceCredential=true
    

    到:

    <message clientCredentialType="Certificate" />
    

    但请注意,您将失去与非 .net 客户端的互操作性。

    【讨论】:

    • 不幸的是,服务主机仍然无法启动,并显示有关指定服务凭据的相同错误。尝试在“true”和“false”中使用negotiateServiceCredential。
    猜你喜欢
    • 1970-01-01
    • 2012-02-06
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多