2012-05-22 46 views
8

我已经开发了一个WCF自托管服务,对此我有两个基本的安全需求,因为它会在互联网上访问:TransportWithMessageCredential没有足够的证书足够的WCF服务?

  • 传输层应防止篡改和嗅探,尤其是认证的检索证书。这就是SSL所做的,但是从我所看到的设置SSL需要安装证书(除非可能通过使用普通证书文件的this 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> 

谢谢!

回答

10

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

SSL必须使用证书,并且您给的链接中的黑客攻击wcf,而不是SSL。因为没有SSL,WCF禁止使用basicHttpBinding(发送清晰的xml)和UserNamePasswordValidator,因为在这种情况下,拦截邮件的任何人都可以获得用户名/密码。

使用WSHttpBinding可以避免SSL并将安全性置于消息级别。

我强烈建议你阅读this article,尤其是服务凭证和协商章:

为了支持相互认证和消息保护,服务必须 提供凭据给调用者。当使用传输安全性 (SSL)时,服务凭证通过传输协议 协商。用于邮件安全的服务凭据也可以是 ,当使用Windows凭据时将进行协商;否则服务 证书必须指定

随着UserNamePasswordValidator,你必须在服务器上配置证书允许客户端的签名和加密每个信息(使用证书的公钥)。 如果您使用Windows身份验证,则不需要。

你为什么如此担心证书?

+0

我只是想尽可能没有证书的简单安装。服务器需要自定义用户名/密码(无Windows认证),然后保证通信机密性和完整性。 –

+3

正如我告诉过你的,你需要“东西”来签署和加密消息,这就是为什么你的UserNamePasswordValidator需要一个证书。你可以找到一些破解,使其没有证书,但是那么你的消息将不会被签名/加密。安装证书非常简单,您也可以使用自动签署的证书(在服务器本身生成),因此不会花费您一些钱。 – Fabske

+1

我最终只使用服务器证书,但我仍然认为它可以使我的scenarii变得更简单。 –