解决WCF错误:EncryptedKey子句未包含所需的加密令牌'System.IdentityModel.Tokens.X509SecurityToken'

问题描述 投票:4回答:3

我有一个WCF客户端崩溃的错误“加密的KateyKey子句没有包含所需的加密令牌'System.IdentityModel.Tokens.X509SecurityToken'。”对于每一个回应。

我环顾四周,this blog post似乎表明问题出在我的证书设置上,但我不确定我做错了什么...

我的客户端使用带有MutualCertificateBindingElement的自定义绑定来保证安全性,我在代码中配置证书如下:

client.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.ChainTrust;
client.ClientCredentials.ServiceCertificate.SetDefaultCertificate
(
    StoreLocation.CurrentUser,
    StoreName.AddressBook,
    X509FindType.FindBySerialNumber,
    "[serial number 1]"
);

client.ClientCredentials.ClientCertificate.SetCertificate
(
    StoreLocation.CurrentUser,
    StoreName.My,
    X509FindType.FindBySerialNumber,
    "[serial number 2]"
);

序列号与请求和响应消息中的<X509SerialNumber>元素中的值匹配。

我注意到的一个差异是请求中的<X509IssuerName>元素,并且响应的格式不同:

Request:  CN=[CN], O=[O], L=[L], C=[C]
Response: C=[C],L=[L],O=[O],CN=[CN]

这是否可能导致问题?

UPDATE

原来是导致问题的证书名称格式。我设法通过使用自定义编码器将响应中的证书名称替换为WCF所期望的来解决它。现在我有这个丑陋的黑客,但它确实有效,所以我会忍受它!

public override Message ReadMessage(ArraySegment<byte> buffer, BufferManager bufferManager, string contentType)
{   
    var msgContents = new byte[buffer.Count];
    Array.Copy(buffer.Array, buffer.Offset, msgContents, 0, msgContents.Length);
    bufferManager.ReturnBuffer(buffer.Array);
    var message = Encoding.UTF8.GetString(msgContents);

    // Fix certificate issuer name formatting to match what WCF expects.
    message = message.Replace
    (
        "C=[C],L=[L],O=[O],CN=[CN]",
        "CN=[CN], O=[O], L=[L], C=[C]"
    );

    var stream = new MemoryStream(Encoding.UTF8.GetBytes(message));     
    return ReadMessage(stream, int.MaxValue);
}
c# wcf wcf-security x509certificate2
3个回答
1
投票

您提到的发行人名称顺序很可能是问题。由于这些名称未签名,我建议您在客户端编写一个自定义编码器,用于替换响应中的名称,以便在请求中进行格式化。


0
投票

除了明显的证书不匹配和禁止错误配置...我已经看到尝试访问私钥的问题。检查客户端是否具有对cert私钥的适当权限。如果右键单击certmanager中的cert,您应该看到AllTask​​s / Manage Private Keys。将客户端的进程标识添加到列表中。


0
投票

还要确保您使用的证书是正确的。我使用了自签名证书,该证书缺少主题密钥标识符。

WCF : The EncryptedKey clause was not wrapped with the required encryption token 'System.IdentityModel.Tokens.X509SecurityToken'

© www.soinside.com 2019 - 2024. All rights reserved.