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:
Establezca la clave del
SendTrustedIssuerListRegistro 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
SendTrustedIssuerListHKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL0. 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
SendTrustedIssuerListuna 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.
Evento Override en el módulo protocolo de transferencia de hipertexto (HTTP) usado por IIS (solo es necesario cuando el
OnGlobalPreBeginRequestservicio 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.HttpWebRequesto 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 elOnGlobalPreBeginRequestevento 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 deOnGlobalPreBeginRequestpuede 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.
Instale WCF QFE para especificar
X509CertificateValidatorel 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 clienteX509CertificateValidationModeal usar el modo de seguridadPeerChainCustomTransporte.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 elX509CertificateValidationMode.PeerTrustmodo de validación dePeerOrChainTrustdestino. Esta limitación se aplica para evitar cambios importantes. La configuración de un personalizadoX509CertificateValidatortendrí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).