我开发了一个WCF自托管服务,我有两个基本的安全要求,因为它将通过Internet访问:
传输层应防止篡改和嗅探,尤其是检索身份验证凭据。这就是SSL所做的,但是从我所看到的设置SSL需要安装证书(可能通过使用普通证书文件的this hack除外),我不想这样做。
< / LI>身份验证层应包含用户名/密码验证程序。
我将我的服务配置为使用:
<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>
谢谢!
答案 0 :(得分:10)
默认情况下,所有安全 WCF绑定(如wsHttpBinding)都会对邮件进行加密和签名。
SSL必须使用证书,并且您提供的链接中的黑客攻击是黑客wcf,而不是SSL。因为没有SSL WCF禁止使用basicHttpBinding(以明文形式发送xml)和UserNamePasswordValidator,因为在这种情况下拦截消息的任何人都可以获得用户名/密码。
使用WSHttpBinding,您可以避免使用SSL并将安全性置于消息级别。
我强烈建议您阅读this article,尤其是服务凭据和谈判章节:
为了支持相互身份验证和邮件保护,服务必须 为呼叫者提供凭据。使用传输安全性时 (SSL),服务凭证通过传输协商 协议。消息安全性的服务凭证也可以 在使用Windows凭据时协商;否则服务 必须指定证书
使用UserNamePasswordValidator
,您必须在服务器上配置证书,以允许客户端签名并加密每条消息(使用证书的公钥)。
如果您使用的是Windows身份验证,则不需要它。
为什么你这么担心证书?