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!
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. –
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
Terminé utilizando solo un certificado de servidor, aunque sigo creyendo que podría simplificarse para scenarii como el mío. –