Procédure : référencer les certificats X.509 de façon cohérente

Vous pouvez identifier un certificat de plusieurs manières : par le hachage du certificat, par l'émetteur et le numéro de série ou par l'identificateur de la clé du sujet. L'identificateur de la clé du sujet fournit une identification unique de la clé publique du sujet du certificat et sert souvent dans le cadre des signatures numériques XML. La valeur de cet identificateur fait habituellement partie du certificat X.509 en tant qu’extension de certificat X.509. Windows Communication Foundation (WCF) a un style de référencement par défaut qui utilise l’émetteur et le numéro de série si l’extension SKI est manquante dans le certificat. Si le certificat contient l’extension de l’identificateur, le style de référencement utilise par défaut l’identificateur pour pointer vers le certificat. Si, au cours du développement d’une application, vous passez de certificats qui n’utilisent pas l’extension de l’identificateur à des certificats qui l’utilisent, le style de référencement utilisé dans les messages générés par WCF change également.

Si un style de référencement cohérent est requis indépendamment de la présence de l'extension de l'identificateur de la clé du sujet, il est possible de configurer ce style de référencement souhaité comme l'illustre le code suivant.

Exemple

L’exemple suivant crée un élément de liaison de sécurité personnalisé qui utilise un seul style de référencement cohérent, le nom de l’émetteur et le numéro de série.

public Binding CreateClientBinding()
{
    AsymmetricSecurityBindingElement abe =
        (AsymmetricSecurityBindingElement)SecurityBindingElement.
        CreateMutualCertificateBindingElement(
        MessageSecurityVersion.
        WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10);

    abe.SetKeyDerivation(false);

    X509SecurityTokenParameters istp =
       abe.InitiatorTokenParameters as X509SecurityTokenParameters;
    if (istp != null)
    {
        istp.X509ReferenceStyle =
        X509KeyIdentifierClauseType.IssuerSerial;
    }
    X509SecurityTokenParameters rstp =
    abe.RecipientTokenParameters as X509SecurityTokenParameters;
    if (rstp != null)
    {
        rstp.X509ReferenceStyle =
        X509KeyIdentifierClauseType.IssuerSerial;
    }

    HttpTransportBindingElement transport =
        new HttpTransportBindingElement();

    return new CustomBinding(abe, transport);
}
Public Function CreateClientBinding() As Binding

    Dim abe As AsymmetricSecurityBindingElement = CType(SecurityBindingElement.CreateMutualCertificateDuplexBindingElement _
        (MessageSecurityVersion.WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10), _
        AsymmetricSecurityBindingElement)

    abe.SetKeyDerivation(False)

    Dim istp As X509SecurityTokenParameters = TryCast(abe.InitiatorTokenParameters, X509SecurityTokenParameters)

    If istp IsNot Nothing Then
        istp.X509ReferenceStyle = X509KeyIdentifierClauseType.IssuerSerial
    End If

    Dim rstp As X509SecurityTokenParameters = TryCast(abe.RecipientTokenParameters, X509SecurityTokenParameters)
    If rstp IsNot Nothing Then
        rstp.X509ReferenceStyle = X509KeyIdentifierClauseType.IssuerSerial
    End If

    Return New CustomBinding(abe, New HttpTransportBindingElement())
End Function

Compilation du code

Les espaces de noms suivants sont requis pour compiler le code :

Voir aussi