Compartilhar via


Como: fazer referência de forma consistente aos certificados X.509

Você pode identificar um certificado de várias maneiras: pelo hash do certificado, pelo emissor e número de série ou pelo identificador de chave de assunto (SKI). O SKI fornece uma identificação exclusiva para a chave pública do assunto do certificado e é frequentemente usado ao trabalhar com assinatura digital XML. O valor SKI geralmente faz parte do certificado X.509 como uma extensão de certificado X.509. O Windows Communication Foundation (WCF) tem um estilo de referência padrão que usa o emissor e o número de série se a extensão SKI estiver ausente do certificado. Se o certificado contiver a extensão SKI, o estilo de referência padrão usará o SKI para apontar para o certificado. Se no meio do desenvolvimento de um aplicativo, você alternar do uso de certificados que não usam a extensão SKI para certificados que usam a extensão SKI, o estilo de referência usado nas mensagens geradas pelo WCF também será alterado.

Se for necessário um estilo de referência consistente, independentemente da presença da extensão SKI, é possível configurar o estilo de referência desejado conforme mostrado no código a seguir.

Exemplo

O exemplo a seguir cria um elemento de associação de segurança personalizado que usa um único estilo de referência consistente, o nome do emissor e o número 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

Compilando o código

Os namespaces a seguir são necessários para compilar o código:

Confira também