Pregunta

Estoy creando una aplicación WCF donde usaré certificados para cifrar 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).

He instalado el certificado en un almacén 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 app.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 al servidor:

  

Error de verificación de identidad para mensaje saliente. La identidad DNS esperada del punto final remoto era 'localhost' pero el punto final remoto proporcionó el reclamo DNS 'Nombre-de-servidor-computadora'. Si se trata de un punto final remoto legítimo, puede solucionar el problema especificando explícitamente la identidad DNS 'Nombre-del-servidor-computadora' como la propiedad de identidad de EndpointAddress al crear el proxy del canal.

Entonces 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 utilizando un certificado real, confiable y comprado de una CA, ¿se realizará la verificación de identidad?

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

¿Fue útil?

Solución

La verificación se realiza siempre, y debería realizarse. Básicamente, WCF verificará que el certificado se emita al nombre de dominio (su empresa.com) o al nombre de la máquina donde reside su servicio. ¡Este es un control de seguridad que nunca deshabilitaría! De lo contrario, cualquier persona que falsifique su servicio podría usar cualquier certificado otorgado a un dominio / nombre de máquina arbitrario y obtener su tráfico, ¡no lo que desea!

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

Marc

Otros consejos

La respuesta a esta pregunta está en el mensaje de error mismo. 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. Hacerlo 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 certificado personalizado y realice las verificaciones pertinentes allí.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top