custom - wcf certificate authentication
WCF NetTcpBinding Security: ¿cómo funciona? (1)
El tipo de credencial de cliente predeterminado para NetTcpBinding es Autenticación de Windows. Para que la autenticación de Windows funcione, tanto el cliente como el servidor deben estar en el mismo dominio o en dominios mutuamente confiables (que en su caso no tiene).
Si tanto el cliente como el servidor estaban en el mismo dominio, WCF manejaría la mecánica de la Autenticación de Windows "detrás de escena". Y cuando tanto el cliente como el servidor están en la misma máquina, están efectivamente dentro del mismo dominio, por lo que Windows puede usar sus propios mecanismos para manejar el cifrado y el descifrado. Sin embargo, solo hará esto dentro de dominios mutuamente confiables.
Si no tiene dominios de cliente y servidor que confíen mutuamente, entonces el cliente y el servidor deben tener otra forma de determinar si confían mutuamente sus claves. Ahí es donde entran los certificados. El cliente y el servidor tienen sus propios certificados (o el servidor puede emitir un certificado al cliente).
La seguridad del transporte es como encriptar el exterior del sobre y el interior. La desventaja es que si tiene que pasar el sobre a alguien fuera de su propia organización, necesitan una clave de descifrado solo para saber dónde se supone que va el sobre; ahora también pueden leer el mensaje en el sobre. Por otro lado, la seguridad del transporte es más rápida: requiere que se transfieran menos datos generales de seguridad junto con su sobre.
La seguridad del mensaje encripta su mensaje, pero el sobre puede ser leído por los trabajadores postales (Internet y sus enrutadores). Solo el origen y el destino tienen las claves para descifrar el mensaje, pero los intermediarios pueden enrutar su mensaje correctamente.
Para resumir: para utilizar el cifrado en NetTcpBinding, tanto el cliente como el servidor deben estar dentro de un dominio (o dominios mutuamente confiables) o debe tener un certificado de intercambio de claves.
Editar: me pidieron un código de ejemplo; aquí hay un elemento de enlace en XAML. Normalmente se colocaría dentro de un elemento netTcpBinding.
<binding name="Secure" listenBacklog="4000" receiveTimeout="00:20:00" sendTimeout="00:20:01"
maxReceivedMessageSize="2147483647" maxConnections="200" portSharingEnabled="true">
<!-- ~2 GB -->
<readerQuotas maxStringContentLength="2147483647"/>
<!-- ~2 GB max string content length -->
<security mode="Message">
<transport clientCredentialType="None" protectionLevel="EncryptAndSign"/>
<message clientCredentialType="None"/>
</security>
</binding>
La parte importante es el elemento de seguridad. Para la seguridad del transporte, uno cambiaría el atributo de modo a "Transporte". Lo más probable es que clientCredentialType no sea "None", sino "Certificate", "Ntlm" o "Windows", según el contexto.
Estoy encontrando los siguientes problemas tratando de resolver el atolladero de la configuración en WCF ...
Creé un servicio cliente-servidor WCF usando un enlace NetTcp. No hice ningún cambio en la configuración de seguridad y cuando se ejecuta en una máquina funciona muy bien. Sin embargo, cuando ejecuté mi cliente desde otra máquina, se quejó de que al servidor no le gustaban las credenciales de seguridad que se enviaron.
Ahora entiendo que NetTCP está "protegido" de manera predeterminada y que mi cliente habría estado pasando los detalles de seguridad incorrectos, es decir, el nombre de usuario y la contraseña de Windows (o algún tipo de autenticación de dominio) a mi servidor que no se ejecutan en el mismo dominio no le hubiera gustado.
Sin embargo, lo que no entiendo es lo siguiente:
No he especificado ninguna seguridad en mi enlace: ¿la configuración estándar espera que se envíe un nombre de usuario o una contraseña de Windows?
No tengo ningún certificado instalado en mi servidor: entiendo que los enlaces de NetTCP necesitan alguna forma de clave pública privada para proteger las credenciales; sin embargo, esto parecía funcionar cuando tanto el cliente como el servidor estaban en la misma máquina. ¿Cómo se obtenían los datos? encriptado? ¿O lo quiere porque WCF sabía que estaba en la misma máquina y no se necesita encriptación?
He tenido que configurar mi modo de seguridad en mi cliente y servidor a "ninguno" ahora y se conectan muy bien. Sin embargo, ¿hay alguna forma de encriptar mis datos sin un certificado?
Finalmente ... ¿cuál es la diferencia entre Seguridad de transporte y Mensaje?
Para verificar mi comprensión (¡perdóneme el escenario!), La seguridad de los mensajes es como si hubiera enviado una carta de la persona A a la persona B y codifico la escritura de mi mano para asegurarme de que si alguien la intercepta no puede leerla. ¿La seguridad del transporte es si decido que mi carta se envíe por transporte armado para que nadie pueda acceder a ella en el camino?
¿Es posible tener algún tipo de encriptación en WCF sin un certificado? Mi proyecto es un proyecto privado y no quiero comprar un certificado y la información no es tan sensible de todos modos, así que es solo por mi propio conocimiento.