2012-05-22 26 views
8

he desarrollado un servicio de auto-organizada WCF, por el que tengo dos requisitos básicos de seguridad, ya que se puede acceder a través de Internet:¿TransportWithMessageCredential sin certificado es lo suficientemente seguro para un servicio WCF?

  • La capa de transporte debe evitar la manipulación y olfateando, especialmente la recuperación de autenticación cartas credenciales. Esto es lo que hace SSL, pero por lo que he visto, la configuración de SSL requiere la instalación de certificados (excepto quizás a través del this hack que usa archivos de certificado sin formato), que prefiero no tener que hacer.

  • La capa de autenticación debe consistir en un validador de nombre de usuario/contraseña.

que configuran mi servicio a utilizar:

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

Incluso si la capa de transporte es HTTP (no HTTPS), esto marca WCF crear otra capa de seguridad que es equivalente a SSL? Si no, ¿cuál es la diferencia en términos de fortaleza de seguridad?

Además, ¿hay alguna forma de proteger el punto final de metadatos sin usar un certificado SSL (no es esencial, pero se agradecería)?

Aquí está mi código de configuración completo para el servicio alojado en sí mismo:

<?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> 

Gracias!

Respuesta

10

De forma predeterminada, todas las vinculaciones seguras WCF (como wsHttpBinding) cifrarán y firmarán mensajes.

SSL obligatorio utilizar un certificado, y el truco en el enlace que das es piratería wcf, no SSL. Porque sin SSL WCF prohíbe el uso de basicHttpBinding (que envía xml en clear) y UserNamePasswordValidator, porque en este caso cualquiera que intercepte el mensaje puede obtener el nombre de usuario/contraseña.

Con WSHttpBinding puede evitar SSL y poner la seguridad en el nivel del mensaje.

Le recomiendo que lea this article, especialmente los credenciales de servicio y la negociación capítulo:

para admitir la autenticación mutua y protección de mensajes, los servicios deben proporcionar credenciales a la persona que llama. Cuando se utiliza la seguridad del transporte (SSL), las credenciales del servicio se negocian a través del protocolo de transporte . Las credenciales del servicio para la seguridad del mensaje también pueden ser negociadas cuando se usan las credenciales de Windows; de lo contrario un certificado de servicio se debe especificar

Con la UserNamePasswordValidator, debe configurar un certificado en el servidor para permitir al cliente el signo y cifrar cada mensaje (utilizando la clave pública del certificado). Si estaba usando la autenticación de Windows, no será necesario.

¿Por qué está tan preocupado por el certificado?

+0

Simplemente me gustaría una instalación simple sin certificados si es posible. Algo donde el servidor requeriría un nombre de usuario/contraseña personalizado (SIN autenticación de Windows) y luego garantizaría la confidencialidad e integridad de la comunicación. –

+3

Como te dije, necesitas "algo" para firmar y encriptar el mensaje, es por eso que UserNamePasswordValidator necesita un certificado. Puede encontrar algún truco que lo haga funcionar sin certificado, pero luego su mensaje no será firmado/encriptado. Instalar un certificado es bastante fácil, y también podría usar un certificado firmado automáticamente (generado en el servidor) para que no le cueste algo de dinero. – Fabske

+1

Terminé utilizando solo un certificado de servidor, aunque sigo creyendo que podría simplificarse para scenarii como el mío. –

Cuestiones relacionadas