Compartir a través de


Cómo: Utilizar diferentes certificados X.509 para la firma y el cifrado

En este tema se muestra cómo configurar Windows Communication Foundation (WCF) para utilizar certificados diferentes para la firma y el cifrado de mensajes tanto en el cliente como en el servicio.

Para poder utilizar certificados independientes para la firma y el cifrado, se debe crear un cliente personalizado o las credenciales de servicio (o ambos) porque WCF no proporciona una API para establecer varios clientes o certificados de servicio. Además, se debe proporcionar un administrador de tokens de seguridad para sacar el máximo partido a la información de varios certificados y crear un proveedor de tokens de seguridad adecuado para el uso de claves especificado y la dirección del mensaje.

El diagrama siguiente muestra las clases principales que se utilizan, las clases de las que se heredan (identificadas mediante una flecha que señala hacia arriba) y los tipos de valor devueltos de ciertos métodos y propiedades.

ms729856.e4971edd-a59f-4571-b36f-7e6b2f0d610f(es-es,VS.90).gif

Para obtener más información acerca de las credenciales personalizadas, vea Cómo: Crear credenciales de cliente y servicio personalizadas.

Además, debe crear un comprobador de identidad personalizado y vincularlo a un elemento de enlace de seguridad en un enlace personalizado. También debe utilizar las credenciales personalizadas en lugar de las credenciales predeterminadas.

En el diagrama siguiente, se muestran las clases implicadas en el enlace personalizado y cómo se vincula el comprobador de identidad personalizado. Hay varios elementos de enlace implicados. Todos ellos se heredan de BindingElement. AsymmetricSecurityBindingElement tiene la propiedad LocalClientSecuritySettings, que devuelve una instancia de IdentityVerifier, a partir de la cual se personaliza MyIdentityVerifier.

ms729856.dddea4a2-0bb4-4921-9bf4-20d4d82c3da5(es-es,VS.90).gif

Para obtener más información acerca de cómo crear un comprobador de identidad personalizado, consulte Cómo crear un comprobador de identidad de cliente personalizado.

Para utilizar certificados independientes para la firma y el cifrado

  1. Defina una nueva clase de credenciales de cliente que herede de la clase ClientCredentials. Implemente cuatro nuevas propiedades para permitir la especificación de múltiples certificados: ClientSigningCertificate, ClientEncryptingCertificate, ServiceSigningCertificate y ServiceEncryptingCertificate. Invalide también el método CreateSecurityTokenManager para devolver una instancia de la clase ClientCredentialsSecurityTokenManager personalizada que se define en el paso siguiente.

  2. Defina un nuevo administrador de tokens de seguridad del cliente que herede de la clase ClientCredentialsSecurityTokenManager. Invalide el método CreateSecurityTokenProvider para crear un proveedor de tokens de seguridad adecuado. El parámetro requirement (un SecurityTokenRequirement) proporciona la dirección del mensaje y el uso de las claves.

  3. Defina una nueva clase de credenciales de servicio que hereda de la clase ServiceCredentials. Implemente cuatro nuevas propiedades para permitir la especificación de múltiples certificados: ClientSigningCertificate, ClientEncryptingCertificate, ServiceSigningCertificate y ServiceEncryptingCertificate. Invalide también el método CreateSecurityTokenManager para devolver una instancia de la clase ServiceCredentialsSecurityTokenManager personalizada que se define en el paso siguiente.

  4. Defina un nuevo administrador de tokens de seguridad de servicio que herede de la clase ServiceCredentialsSecurityTokenManager. Invalide el método CreateSecurityTokenProvider para crear un proveedor de tokens de seguridad adecuado dada la dirección del mensaje pasada y el uso de las claves.

Para utilizar varios certificados en el cliente

  1. Cree un enlace personalizado. El elemento de enlace de seguridad debe funcionar en modo dúplex para permitir que distintos proveedores de tokens de seguridad estén presentes para las solicitudes y respuestas. Una manera de hacerlo es utilizar un transporte de tipo dúplex o utilizar CompositeDuplexBindingElement tal y como se muestra en el código siguiente. Vincule el objeto IdentityVerifier personalizado que se define en el paso siguiente al elemento de enlace de seguridad. Reemplace las credenciales de cliente predeterminadas con las credenciales de cliente personalizadas creadas previamente.

  2. Defina un objeto IdentityVerifier personalizado. El servicio tiene varias identidades porque se usan certificados diferentes para cifrar la solicitud y firmar la respuesta.

    Nota

    En el ejemplo siguiente, el comprobador de identidad personalizado proporcionado no realiza ninguna comprobación de identidad del extremo con fines de demostración. No se trata de una práctica recomendada para el código de producción.

Para utilizar varios certificados en el servicio

  1. Cree un enlace personalizado. El elemento de enlace de seguridad debe funcionar en modo dúplex para permitir que distintos proveedores de tokens de seguridad estén presentes para las solicitudes y respuestas. Tal y como ocurre con el cliente, utilice un transporte de tipo dúplex o use CompositeDuplexBindingElement tal y como se muestra en el código siguiente. Reemplace las credenciales de servicio predeterminadas con las credenciales de servicio personalizadas creadas previamente.

Consulte también

Referencia

ClientCredentials
ServiceCredentials
ClientCredentialsSecurityTokenManager
ServiceCredentialsSecurityTokenManager
IdentityVerifier

Conceptos

Cómo: Crear credenciales de cliente y servicio personalizadas