我有一个 WCF 客户端崩溃并出现错误“EncryptedKey 子句未使用所需的加密令牌'System.IdentityModel.Tokens.X509SecurityToken'。” 对于每一个回应。
我环顾四周,这篇博客文章似乎表明问题出在我的证书设置上,但我不确定我做错了什么......
我的客户使用带有 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 期望的名称来解决它。现在我有这个丑陋的黑客,但它有效,所以我会忍受它!
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);
}