解决 WCF 错误:EncryptedKey 子句未使用所需的加密令牌“System.IdentityModel.Tokens.X509SecurityToken”包装
Posted
技术标签:
【中文标题】解决 WCF 错误:EncryptedKey 子句未使用所需的加密令牌“System.IdentityModel.Tokens.X509SecurityToken”包装【英文标题】:Resolve WCF Error: The EncryptedKey clause was not wrapped with the required encryption token 'System.IdentityModel.Tokens.X509SecurityToken' 【发布时间】:2012-05-12 17:22:42 【问题描述】:我的 WCF 客户端因错误“EncryptedKey 子句未使用所需的加密令牌‘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]
这可能是导致问题的原因吗?
更新
原来是证书名称格式导致了问题。我设法通过使用自定义编码器将响应中的证书名称替换为 WCF 期望的名称来解决它。现在我有了这个丑陋的 hack,但它确实有效,所以我会接受它!
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);
【问题讨论】:
请发布请求、响应和配置。如果他们是机密的,你也可以给我发邮件 @YaronNaveh 我已向您发送了一封电子邮件,而不是在问题中粘贴大量代码/xml。如果我们能够缩小问题所在,我将使用相关的 sn-ps 更新问题。谢谢! 我也有同样的问题。当证书颁发者名称现在包含在消息中时,这对您有什么作用? 【参考方案1】:您提到的发行人名称顺序很可能是问题所在。由于这些名称没有签名,我建议您在客户端中编写一个自定义编码器,将响应中的名称替换为请求中的格式。
【讨论】:
【参考方案2】:除了明显的证书不匹配和禁止配置错误...我发现尝试访问私钥时出现问题。检查客户端是否对证书私钥具有适当的权限。如果您右键单击 certmanager 中的证书,您应该会看到 AllTasks/Manage Private Keys。将您客户的进程标识添加到列表中。
【讨论】:
好提示,但这不是我的问题;我知道该过程可以很好地访问证书,因为请求已成功加密和签名,它只是导致问题的响应。【参考方案3】:还要确保您使用的证书是正确的。我使用了缺少主题密钥标识符的自签名证书。
WCF : The EncryptedKey clause was not wrapped with the required encryption token 'System.IdentityModel.Tokens.X509SecurityToken'
【讨论】:
以上是关于解决 WCF 错误:EncryptedKey 子句未使用所需的加密令牌“System.IdentityModel.Tokens.X509SecurityToken”包装的主要内容,如果未能解决你的问题,请参考以下文章
WCF客户端 - EncryptedKey子句未包含所需的加密令牌
WCF:EncryptedKey子句未包含所需的加密令牌'System.IdentityModel.Tokens.X509SecurityToken'
WSSE - XML SOAP 安全和密钥加密和存储 (EncryptedData/EncryptedKey)
问题解决_WCF_WCF 接收我服务的 HTTP 响应时发生错误