Usar un X509CertificateValidator personalizado con un servicio WCF hospedado en IIS y un certificado de cliente autofirmado

En este artículo se describe cómo usar un personalizado con un servicio Microsoft Internet Information Services (IIS) hospedado en Windows Communication Foundation (WCF) y un certificado de cliente X509CertificateValidator autofirmado.

Versión del producto original:   Windows Communication Foundation
Número KB original:   2480671

Resumen

Configure un servicio WCF para que use un certificado de cliente para la autenticación de capa de sockets seguros (SSL). Desea usar un X509CertificateValidator personalizado para validar los certificados de cliente en el nivel de aplicación (servicio WCF), no en la capa del sistema operativo (SO).

WCF 3.5 SP1 no permite el uso de personalizado sin instalar una X509CertificateValidators revisión en absoluto. En .NET 4 Windows Communication Foundation, solo se puede usar un personalizado cuando el certificado se puede validar correctamente en la capa del sistema operativo; especialmente, no sería posible usar certificados de cliente autofirmados sin instalarlos en el almacén de certificados de entidades de certificación raíz de confianza (pueden ser miles de certificados X509CertificateValidator diferentes).

Cómo hacerlo

Para habilitar este escenario, son necesarios los siguientes pasos:

  1. Establezca la clave del SendTrustedIssuerList Registro en 0 (DWORD) en el Registro. Consulte Tls/SSL Tools and Configuración para obtener más información.

    De forma predeterminada, SChannel (el componente del sistema operativo usado para establecer conexiones SSL) envía una lista de emisores de confianza al cliente durante el protocolo de enlace SSL. Se ha hecho para permitir que la aplicación en el lado cliente haga que sea más fácil para el usuario elegir qué certificado debe usarse. De forma predeterminada, SChannel envía una lista de todos los certificados (en realidad, las huellas digitales) instalados en el almacén de certificados de entidades de certificación de confianza. Puede reducir esta lista especificando una TCL (lista de certificados de confianza). Por ejemplo, para requerir que los clientes usen sus certificados de tarjeta inteligente, crearía una lista de confianza de certificados (CTL) que solo contenga el certificado raíz de la entidad de certificación (CA) que emite estos certificados de tarjeta inteligente. Para obtener más información acerca de cómo crear una CTL, vea Security in Microsoft IIS.

    Si desea permitir el uso de certificados de cliente, que no puede validar en el sistema operativo del servidor (por ejemplo, autofirmado y no instalado en el almacén de entidades de certificación raíz de confianza), debe establecer el valor en SendTrustedIssuerList HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL 0. En este caso, el servidor no envía una lista de emisores de confianza al cliente y el cliente permitirá al usuario usar cualquier certificado de cliente disponible.

    Advertencia

    Es SendTrustedIssuerList una clave de todo el equipo. Al cambiarlo, se ven afectadas todas las aplicaciones (directorios virtuales) que usan la autenticación de certificados de cliente.

    Este paso solo es necesario cuando no es posible validar también el certificado de cliente en la capa del sistema operativo.

  2. Evento Override en el módulo protocolo de transferencia de hipertexto (HTTP) usado por IIS (solo es necesario cuando el OnGlobalPreBeginRequest servicio WCF se hospeda en IIS).

    Solo después de realizar las modificaciones descritas en el paso 1, el cliente en realidad envía un certificado. Antes de aplicar este cambio, vería mensajes de error que el cliente no envió un certificado (incluso cuando se establece un certificado en System.Net.HttpWebRequest o en Internet Explorer). Cuando la solicitud llega al lado del servidor, el componente SChannel siempre realiza una validación de certificado al establecer la conexión SSL. El código devuelto de esta validación de certificado se pasa por la pila a los autores de llamadas. Cuando el servicio WCF se hospeda en IIS, IIS comprueba el código devuelto de la validación del certificado SChannel y termina la solicitud con el código de error 403 (acceso denegado) en una fase temprana de la canalización HTTP. La única forma de evitar este comportamiento en IIS en este momento es invalidar el OnGlobalPreBeginRequest evento en la canalización HTTP. Es uno de los pocos puntos de extensión de IIS, que solo se puede usar con código nativo, sin código administrado (.NET). La documentación de OnGlobalPreBeginRequest puede encontrarse en el método CGlobalModule::OnGlobalPreBeginRequest.

    Este paso solo es necesario cuando no es posible validar también el certificado de cliente en la capa del sistema operativo.

  3. Instale WCF QFE para especificar X509CertificateValidator el archivo .

    WCF usó originalmente el código de resultadoSChannel para validar certificados de cliente también. Si el código devuelto era 0 (correcto), se permitía la autenticación y se usaba un X509CertificateValidator codificado de forma segura con el modo de validación establecido en X509CertificateValidationMode.None (X509CertificateValidationMode Enum). Lo que significa que no era posible usar ningún otro WCF como , o para certificados de cliente X509CertificateValidationMode al usar el modo de seguridad Peer Chain Custom Transporte.

    En .NET 4, este problema se corrigió y la corrección también fue backported .NET 3.5 SP1. Después de aplicar la revisión mencionada a continuación, solo puede invalidar el comportamiento de validación al especificar X509CertificateValidationMode.Custom . Si quieres usar algo como o , deberás crear un personalizado, que está reusando el validador predeterminado para el X509CertificateValidationMode.PeerTrust modo de validación de PeerOrChainTrust destino. Esta limitación se aplica para evitar cambios importantes. La configuración de un personalizado X509CertificateValidator tendría el siguiente aspecto:

    <serviceCredentials>
        <clientCertificate>
            <authentication certificateValidationMode="Custom" customCertificateValidatorType="Samples.MyCertificateValidator, Samples" />
        </clientCertificate>
    </serviceCredentials>
    

    Este paso solo es necesario cuando se usa .NET Framework 3.5 SP1 (no para .NET 4).