How to implement a WCF client with WS-SECURITY without knowing the service certificate

Daniel Ruzo 0 Puntos de reputación
2024-09-02T14:16:21.4733333+00:00

To create a .Net client that would use WCF to consume a web service that implements WS-SECURTY, I created a CustomBinding to which I added three elements:

  1. AsymmetricSecurityBindingElement
  2. TextMessageEncodingBindingElement
  3. HttpsTransportBindingElement

With this CustomBinding and an EndpointAddress I instantiated the client, and then established the client and server certificates using the following code: MyClient.ClientCredentials.ClientCertificate.Certificate = myCertificate MyClient.ClientCredentials.ServiceCertificate.DefaultCertificate = serverCertificate

The problem I have now is that I need to consume services that are part of a network with more than 90 endpoints, each with its own certificate, so knowing the service certificate in advance is impossible, or impractical. The lack of security of this approach would not be a problem, because the certificates used by the services must comply with certain rules and would be validated on the client, but WCF always throws me an error because I have not set the server certificate.

I have tried setting the server certificate validation mode to "None" using the following code, but it has not worked: MyClient.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None

I have also tried setting a CustomCertificateValidator with the following code, but it still asks for the server certificate: MyClient.ClientCredentials.ServiceCertificate.Authentication.CustomCertificateValidator = New CustomCertificateValidator

I have also tried setting any certificate for the server and validating the actual certificate in the CustomCertificateValidator, but the certificate I receive in the validator is the same certificate I configured and not the actual certificate coming from the server.

Is there no way to consume a web service with WS-SECURTY using WCF without knowing the public key of the service certificate beforehand?

Thank you for your answers.

ASP.NET
ASP.NET
Conjunto de tecnologías de .NET Framework para la creación de aplicaciones y servicios web XML.
46 preguntas
{count} votos

3 respuestas

Ordenar por: Muy útil
  1. Jonathan Pereira Castillo 10,505 Puntos de reputación Proveedor de Microsoft
    2024-11-12T16:41:49.17+00:00

    ¡Hola Daniel Ruzo!

    Bienvenido a Microsoft Q&A.Implementar un cliente WCF con WS-Security sin conocer el certificado del servicio de antemano puede ser un desafío, pero hay algunas estrategias que puedes considerar:

    Cliente Anónimo con Seguridad Basada en Certificados:

    • Puedes configurar tu cliente WCF para usar un cliente anónimo con seguridad basada en certificados. Esto significa que el cliente no necesita presentar un certificado al servicio, pero el servicio aún utiliza un certificado para asegurar la comunicación. Este enfoque es útil cuando el cliente no necesita autenticarse ante el servicio.
    • Ejemplo de configuración:
    <bindings>
    <customBinding>
    <binding name="CustomBinding">
    <security defaultAlgorithmSuite="Default" authenticationMode="AnonymousForCertificate" requireDerivedKeys="false" securityHeaderLayout="Strict" includeTimestamp="true" keyEntropyMode="CombinedEntropy">
    <localClientSettings detectReplays="false" />
    <localServiceSettings detectReplays="false" />
    </security>
    <textMessageEncoding messageVersion="Soap12WSAddressing10" />
    <httpsTransport />
    </binding>
    </customBinding>
    </bindings>
    

    Validador de Certificados Personalizado:

    • Implementa un validador de certificados personalizado para manejar la validación del certificado del servicio de manera dinámica. Esto te permite validar el certificado según tu propia lógica, como verificar contra una lista de certificados de confianza o validar ciertas propiedades del certificado.
    • Ejemplo de implementación:
    public class CustomCertificateValidator : X509CertificateValidator
    {
    public override void Validate(X509Certificate2 certificate)
    {
        // Implementa tu lógica de validación personalizada aquí
        if (certificate == null)
        {
            throw new ArgumentNullException("certificate");
        }
    
        // Ejemplo: Verificar si el certificado es emitido por una CA de confianza
        if (!IsCertificateTrusted(certificate))
        {
            throw new SecurityTokenValidationException("El certificado no es de confianza.");
        }
    }
    
    private bool IsCertificateTrusted(X509Certificate2 certificate)
    {
        // Implementa tu lógica para verificar si el certificado es de confianza
        return true; // Placeholder
    }
    }
    

    Modo de Validación del Certificado del Servicio:

    • Configura el CertificateValidationMode a None y maneja la validación manualmente en tu validador personalizado. Este enfoque te permite omitir la validación predeterminada e implementar tu propia lógica.
    • Ejemplo de configuración:
                MyClient.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
    MyClient.ClientCredentials.ServiceCertificate.Authentication.CustomCertificateValidator = new CustomCertificateValidator();
    

    Estas estrategias deberían ayudarte a consumir un servicio web con WS-Security usando WCF sin necesidad de conocer el certificado del servicio de antemano.

    Espero que estos consejos ayuden a resolver el problema. Si necesitas más asistencia, estoy a tu disposición.

    Saludos,

    Jonathan.

    ----------*

    Tu opinión es muy importante para nosotros! Si esta respuesta resolvió tu consulta, por favor haz clic en ''. Esto nos ayuda a mejorar continuamente la calidad y relevancia de nuestras soluciones.

    0 comentarios No hay comentarios

  2. Jonathan Pereira Castillo 10,505 Puntos de reputación Proveedor de Microsoft
    2024-11-14T17:43:31.9366667+00:00

    Hola Daniel Ruzo!,

    El propósito de este mensaje es verificar la información proporcionada. Si tienes más actualizaciones sobre este tema, no dudes en responder en este mismo hilo.

    Respetuosamente,

    Jonathan

    ---------

    Tu opinión es muy importante para nosotros! Si esta respuesta resolvió tu consulta, por favor haz clic en ‘Sí’. Esto nos ayuda a mejorar continuamente la calidad y relevancia de nuestras soluciones. ¡Gracias por tu colaboración!

    0 comentarios No hay comentarios

  3. Jonathan Pereira Castillo 10,505 Puntos de reputación Proveedor de Microsoft
    2024-11-15T17:41:26.41+00:00

    Buenos día Daniel Ruzo!,

    Conforme a la información previamente proporcionada, el objetivo de este mensaje es verificar la misma. Si tienes nuevas actualizaciones relacionadas con este asunto, por favor, siéntete libre de responder en este mismo hilo.

    Atentamente,

    Jonathan

    -----------

    Tu opinión es muy importante para nosotros! Si esta respuesta resolvió tu consulta, por favor haz clic en ‘Sí’. Esto nos ayuda a mejorar continuamente la calidad y relevancia de nuestras soluciones. ¡Gracias por tu colaboración!

    0 comentarios No hay comentarios

Su respuesta

Las respuestas se pueden marcar como respuestas aceptadas por el autor de la pregunta, lo que ayuda a los usuarios a conocer la respuesta que resolvió el problema del autor.