加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 解决WCF错误:EncryptedKey子句未包含所需的加密令牌“Sys

发布时间:2020-12-15 21:33:43 所属栏目:百科 来源:网络整理
导读:我有一个WCF客户端崩溃的错误“加密的KateyKey子句没有包含所需的加密令牌’System.IdentityModel.Tokens.X509SecurityToken’.”对于每一个回应. 我环顾四周,this blog post似乎表明问题出在我的证书设置上,但我不确定我做错了什么… 我的客户端使用带有Mut
我有一个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,"[serial number 2]"
);

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

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

Request:  CN=[CN],O=[O],L=[L],C=[C]
Response: C=[C],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,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],CN=[CN]","CN=[CN],C=[C]"
    );

    var stream = new MemoryStream(Encoding.UTF8.GetBytes(message));     
    return ReadMessage(stream,int.MaxValue);
}

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读