with password clientcredentialtype wcf authentication iis client-certificates

clientcredentialtype - wcf basic authentication username password



¿Cómo implemento la autenticación del Certificado del cliente de la manera correcta? (1)

WCF es extremadamente extensible y tiene muchas funciones listas para usar, sin embargo, sigo luchando con algunos temas y mientras más documentación leo, más me confundo.

Espero obtener algunas respuestas de la comunidad. Comentarios sobre cualquier suposición o pregunta es muy bienvenido.

Para el registro: para aceptar realmente una sola respuesta, debería dividir esta publicación en múltiples preguntas, pero conduciría a una confusión aún mayor. Estoy bastante seguro de que hay algunos expertos en WCF reales en línea que pueden responder a las pocas preguntas de este documento, todo a la vez, así que puedo aceptar una única respuesta como el verdadero negocio para configurar la autenticación del certificado de cliente utilizando IIS de la manera correcta.

Déjame bosquejar la situación y la solicitud del socio:

1: El requisito de socio y la pregunta de usar un certificado de cliente.

El Partner X necesita llamar a una API en mi back-end y tienen el claro requerimiento de usar la autenticación Clientcertificate. Crearon el certificado de cliente y nos proporcionaron el certificado con solo la clave pública, ya que parece lógico que mantengan la clave privada en privado y en sus propios sistemas. El certificado fue importado en la cuenta de la computadora local y mirando la ruta de certificación esto es válido. Todas las autoridades de certificación intermedias y, al final, la autoridad de certificación raíz son de confianza.

2: nuestra configuración de servidor WCF

Tengo un serviceBehavior configurado como tal:

<behavior name="ClientCertificateBehavior"> <serviceMetadata httpsGetEnabled="true" /> <serviceCredentials> <serviceCertificate findValue="<serialnumber here>" x509FindType="FindBySerialNumber" /> <clientCertificate> <authentication certificateValidationMode="PeerTrust" /> </clientCertificate> </serviceCredentials> </behavior>

Supongo que cometí un primer error aquí y debería usar ChainTrust para validar realmente el certificado utilizando su ruta de certificación . ¿Qué piensas?

El servicio está configurado como tal:

<service behaviorConfiguration="ClientCertificateBehavior" name="<Full service namespace and servicename>"> <endpoint binding="basicHttpBinding" bindingConfiguration="Soap11CertificateBasicHttpBinding" contract="<The interface>"></endpoint> </service>

El enlace se ve así:

Es un enlace básico de Http para forzar SOAP1.1 (de acuerdo con las especificaciones del socio).

<binding name="Soap11CertificateBasicHttpBinding"> <security mode="Transport"> <transport clientCredentialType="Certificate" /> </security> </binding>

3: alojamiento del servicio WCF en IIS y la configuración de IIS

Alojamos nuestros servicios de WCF en IIS7. Configuramos la carpeta en la que residen los servicios para requerir SSL y aceptar certificados de Cliente. Autenticación anónima de autenticación está habilitada.

La cuestión es que la comunicación del socio funciona y estábamos seguros de que todo estaba bien, sin embargo al alternar la configuración de IIS para ''exigir'' el certificado del cliente nos muestra que, de repente, ya no es posible llamar con éxito a nuestro servicio.

¿Tengo razón al suponer que las siguientes cosas no se hacen correctamente?

  • El serviceCerticate en el serviceBehavior no es realmente necesario. Esta es una configuración utilizada por el cliente. ¿O es necesario proporcionar esta información de certificado para el punto final del servicio para que coincida con el certificado que está siendo enviado por el cliente?

  • Para que la autenticación del certificado del cliente realmente funcione en IIS, el certificado debe asignarse a un usuario. A este usuario se le deben otorgar permisos en la carpeta que contiene los servicios y se deben deshabilitar todos los mecanismos de autenticación (anónimo, ventanas, ...). De esta forma, IIS manejará el saludo real y validará el servicio de comunicación. ¿O es más una cuestión de seguridad adicional mapear el certificado a un usuario?

    • Al configurar ''Aceptar'' en IIS omitimos la validación del certificado real entre el cliente y el servidor.

    • Todos los mecanismos de autenticación como ''anónimo'' y ''ventanas'' tienen que estar deshabilitados en IIS para la carpeta que contiene los servicios.


En su escenario, no necesita configurar certificados en WCF, IIS los maneja por usted. Puede borrar todo el bloque <serviceCredentials> , porque:

El <serviceCertificate> de <serviceCredentials> especifica un certificado X.509 que se usará para autenticar el servicio a los clientes que usan Message security mode , que no usa, y el <clientCertificate> de <serviceCredentials> define un certificado X.509 utilizado para firmar y encriptar mensajes a un cliente de un servicio en un patrón de comunicación dúplex .

Vea aquí cómo asignar certificados de cliente a cuentas de usuario.