如何:以一致的方式引用 X.509 证书

可以采用下列多种方式来标识证书:证书哈希、颁发者和序列号或者使用者密钥标识符 (SKI)。 SKI 为证书的使用者公钥提供唯一标识,通常用于处理 XML 数字签名。 SKI 值通常以“X.509 证书扩展”的形式作为 X.509 证书的一部分。 Windows Communication Foundation (WCF) 具有一个默认的引用样式,如果证书中缺少 SKI 扩展,则该样式将使用颁发者和序列号。 如果证书中包含 SKI 扩展,该默认引用样式将使用 SKI 来指向证书。 如果在应用程序开发过程中,将使用的证书从不使用 SKI 扩展的证书改换为使用 SKI 扩展的证书,则由 WCF 生成的消息中所使用的引用样式也会随之发生变化。

如果无论是否存在 SKI 扩展,都需要使用一致的引用样式,则可以配置所需的引用样式,如下面的代码中所示。

示例

下面的示例创建一个自定义安全绑定元素,该元素使用一致的引用样式:颁发者名称和序列号。

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

编译代码

编译该代码需要以下命名空间:

另请参阅