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: