没有证书的 TransportWithMessageCredential 对于 WCF 服务来说是否足够安全

本文关键字:是否 安全 服务 WCF 证书 TransportWithMessageCredential 对于 | 更新日期: 2023-09-27 18:35:06

我开发了一个 WCF 自承载服务,对此我有两个基本的安全要求,因为它将通过 Internet 访问:

  • 传输层应防止篡改和嗅探,尤其是检索身份验证凭据。这就是SSL的作用,但是从我所看到的设置SSL需要安装证书(除了可能通过这个使用纯证书文件的hack),我宁愿不必这样做。

  • 身份验证层应由用户名/密码验证器组成。

我将服务配置为使用:

      <security mode="TransportWithMessageCredential">
        <message clientCredentialType="UserName" />
        <transport clientCredentialType="Basic" />
      </security>

即使传输层是 HTTP(不是 HTTPS),这是否会使 WCF 创建另一个等效于 SSL 的安全层?如果不是,在安全强度方面有什么区别?

另外,有没有办法在不使用SSL证书的情况下保护元数据端点(不是必需的,但将不胜感激)?

以下是我自托管服务的完整配置代码:

<?xml version="1.0"?>
<configuration>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup>
  <system.serviceModel>
    <services>
      <service name="MyService">
        <host>
          <baseAddresses>
            <add baseAddress = "http://localhost:8000/Services" />
          </baseAddresses>
        </host>
        <endpoint address ="MyService" binding="wsHttpBinding" contract="IMyService">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <bindings>
      <wsHttpBinding>
        <binding name="Binding1" maxReceivedMessageSize="2147483647">
          <security mode="TransportWithMessageCredential">
            <message clientCredentialType="UserName" />
            <transport clientCredentialType="Basic" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="True"/>
          <serviceCredentials>
            <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="CR.Common.Services.CustomValidator, Common" />
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

谢谢!

没有证书的 TransportWithMessageCredential 对于 WCF 服务来说是否足够安全

默认情况下,所有安全 WCF 绑定(如 wsHttpBinding)都将对消息进行加密和签名。

SSL强制使用证书,您提供的链接中的黑客攻击是黑客WCF,而不是SSL。因为如果没有 SSL WCF 禁止使用 basicHttpBinding(以明文形式发送 xml)和 UserNamePasswordValidator,因为在这种情况下,拦截消息的任何人都可以获取用户名/密码。

使用 WSHttpBinding,您可以避免 SSL 并将安全性放在消息级别。

我强烈建议您阅读本文,尤其是服务凭据和协商一章:

若要支持相互身份验证和消息保护,服务必须 向调用方提供凭据。使用传输安全时 (SSL),服务凭据通过传输进行协商 协议。消息安全性的服务凭据也可以是 在使用 Windows 凭据时协商;否则是服务 必须指定证书

使用

UserNamePasswordValidator ,您必须在服务器上配置证书,以允许客户端对每条消息进行签名和加密(使用证书的公钥)。如果您使用的是 Windows 身份验证,则不需要它。

你为什么这么担心证书?