transportwithmessagecredential clientcredentialtype clientcredentials clientcertificate wcf dns certificate identity

clientcredentialtype - ¿Por qué WCF se queja por la falla de verificación de identidad?



transportwithmessagecredential (3)

El control se hace siempre, y debe ser. Básicamente, WCF comprobará que el certificado se emite para el nombre de dominio (sucompañía.com) o el nombre de la máquina donde reside su servicio. ¡Este es un control de seguridad que nunca desactivo! De lo contrario, cualquier persona que suplantara su servicio podría usar cualquier certificado hecho a nombre de un dominio / máquina arbitrario y obtener su tráfico, ¡no lo que usted quiere!

Entonces, lo que necesita asegurarse es que su certificado real en el servidor de producción se emite efectivamente a ese nombre de dominio del que formará parte el servidor de producción, por ejemplo, si su servidor de producción va a estar en "producción.suempresa.com", el certificado debe extenderse a ese dominio.

Bagazo

Estoy creando una aplicación WCF donde usaré certificados para encriptar la comunicación entre el cliente y el servidor. En mi entorno de desarrollo, quiero usar un certificado de prueba / certificado autofirmado que he creado usando makecert. (Solo el servidor tendrá un certificado, el cliente no).

Instalé el certificado en una tienda de certificados y todo funciona bien. En el cliente, certificateValidationMode está configurado actualmente en "falso", ya que estoy trabajando con un certificado de prueba.

Mi problema:

En la aplicación.config en el cliente, necesito especificar el elemento de identidad como este:

<endpoint ... > <identity> <dns value="<Name-Of-Server-Computer>"/> </identity> </endpoint>

Si elimino el elemento de identidad, aparece el siguiente mensaje de error en el cliente cuando intento conectarme con el servidor:

La verificación de identidad falló para el mensaje saliente. La identidad DNS esperada del punto extremo remoto era ''localhost'', pero el punto final remoto proporcionaba el DNS ''Nombre-del-Servidor-Ordenador''. Si se trata de un punto final remoto legítimo, puede solucionar el problema especificando explícitamente la identidad DNS ''Nombre-de-Servidor-Computadora'' como la propiedad Identidad de EndpointAddress al crear un proxy de canal.

Así que aquí están mis preguntas:

  • ¿La verificación de identidad solo se realiza cuando se utiliza un certificado de prueba / autofirmado? Cuando implemente mi aplicación usando un certificado real y de confianza adquirido de una CA, ¿se realizará la verificación de identidad?

  • ¿Hay alguna forma de desactivar la verificación de identidad? Sé que puedo crear mi propio validador de certificados personalizado, pero no parece haber una manera de anular la verificación de identidad con estos.


La respuesta a esta pregunta está en el mensaje de error en sí. En el cliente puedes hacer:

EndpointIdentity identity = EndpointIdentity.CreateDnsIdentity("Server"); EndpointAddress address = new EndpointAddress(new Uri("net.tcp://1.2.3.4:12345/ServiceName"), identity);

Reemplace "Servidor", por lo que se espera. Normalmente, este sería el nombre común (CN) de su certificado autofirmado. Si lo hace, no arruinará la seguridad, siempre que asuma toda la responsabilidad de asegurarse de que el certificado presentado sea válido, es decir, cree su validador de certificados personalizado y realice comprobaciones relevantes allí.


certificateValidationMode debe establecerse en "Ninguno", no "falso" ...