2009-10-27 51 views
17

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).¿Por qué WCF se queja por la falla de verificación de identidad?

He instalado el certificado en un almacén de certificados, y todo está funcionando bien. En el cliente, certificateValidationMode está configurado actualmente en "falso", ya que estoy trabajando con un certificado de prueba.

Mi problema:

En el app.config en el cliente, que debe especificar el elemento de identidad como esto:

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

Si quito el elemento de identidad, me sale el siguiente mensaje de error en el cliente cuando trato de conectarme al servidor:

Error de verificación de identidad 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á mi pregunta:

  • es el control de identidad sólo se hace 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 una manera de desactivar el control 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.

Respuesta

10

La comprobación 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 que el servidor de producción formará parte, p. si su servidor de producción va a estar en "producción.suempresa.com", el certificado debe extenderse a ese dominio.

Marc

+0

> "Este es un control de seguridad que nunca había desactivo!" Solo para asegurarme de que entiendo. ¿Eso significa que hay una forma de desactivarlo? Entiendo los beneficios del cheque ... – Nitramk

+1

Nunca pensé en hacer esto, así que nunca sentí la necesidad de comprobar si hay alguna manera de apagarlo. No lo sé, lo siento. –

24

La respuesta a esta pregunta está en el propio mensaje de error. En el cliente puede 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. Hacer esto 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 las comprobaciones pertinentes allí.

+0

¡Tienes razón! Esta respuesta es correcta. –

3

certificateValidationMode se debe establecer en "Ninguno", no es "falsa" ...

Cuestiones relacionadas