WCF 客户端到 WSE 3.0 服务异常:CWWSS7310E:XML 加密信息 [.....]

Posted

技术标签:

【中文标题】WCF 客户端到 WSE 3.0 服务异常:CWWSS7310E:XML 加密信息 [.....]【英文标题】:WCF Client to WSE 3.0 service Exception: CWWSS7310E: XML encryption information[.....] 【发布时间】:2020-07-08 05:20:29 【问题描述】:

我以前从未使用过肥皂服务,所以我可能做错了什么。我已经通过带有“Svcutil”的 wsdl 为该服务生成了一个服务客户端引用。

我已按照本指南https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/how-to-configure-a-wcf-client-to-interoperate-with-wse3-0-services 设置自定义绑定。 之后,我是引用中的一个客户端,并提供一个使用 WseSecurityAssertion.MutualCertificate10 和服务端点地址的新绑定。

然后我添加一个证书并将这些凭据添加到服务客户端:

clientProxy.ClientCredentials.ClientCertificate.Certificate = new X509Certificate2(string.Concat(xxx, yyy), GetCertificatePassword(xxx), PersistKeySet);
            clientProxy.ClientCredentials.ServiceCertificate.DefaultCertificate = new X509Certificate2(xxx, "", PersistKeySet);
            clientProxy.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = ChainTrust;
            clientProxy.ClientCredentials.ServiceCertificate.Authentication.RevocationMode = NoCheck;

这是以前工作过的代码(但在使用 wcf 和“Svcutil”之前),我主要复制了它,但对其进行了一些重构。

当我调用 Web 服务时,我收到此错误:

System.ServiceModel.FaultException: 'CWWSS5511E: An exception occurred during the decryption of a message. The exception is CWWSS7310E: XML encryption information exists in the security header, however an inbound XML encryption configuration is not present.'

我知道我加密了我不应该加密的东西,当我将发送的请求与旧代码与我现在发送的请求进行比较时,我可以看到它已添加到安全标头中:

<e:EncryptedKey Id="_0" xmlns:e="http://www.w3.org/2001/04/xmlenc#"><e:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p"><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" xmlns="http://www.w3.org/2000/09/xmldsig#"/></e:EncryptionMethod><KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">

还有一些关于钥匙的信息。

我想知道我做错了什么代码以前没有做。我找不到任何配置文件,所以我不认为这是我错过的一些配置。可以在哪里设置此加密?是在绑定内部还是在我设置 clientCredentials 的地方?

【问题讨论】:

所以这是旧代码?你做了哪些改变?您是否更改了 Net 的版本?您现在使用的是 Windows 10 吗?我以前没有看到过这个错误,但是我处理过很多关于证书的帖子。它在使用 wcf 和 Svutil 之前工作,这有帮助。看看它是否仍然适用于 wcf 和 SVutil?如果它仍然有效,则使用诸如wireshark或fiddler之类的嗅探器并将第一个请求与非工作进行比较。 http 请求标头中可能有一些不同的东西可以解释这些差异。 【参考方案1】:

所以经过大量阅读和比较后,我最终发现我没有设置 ProtectionLevel 为 System.Net.Security.ProtectionLevel.Sign 的新一代服务参考文件。这可能是在旧版本中硬编码的,而不是使用配置文件来设置保护级别。 这就是导致服务端的服务不明白如何正确解密的原因。

【讨论】:

以上是关于WCF 客户端到 WSE 3.0 服务异常:CWWSS7310E:XML 加密信息 [.....]的主要内容,如果未能解决你的问题,请参考以下文章

WSE 3.0 Windows 7 兼容性

在 WCF 服务 C# 的服务器端获取客户端的 Mac 地址不重复(在 WCF 3.0 中获取客户端 IP 地址)

如何使用 wcf 的 .net Web 服务创建安全的 SOAP 主体?

WCF异常处理

WCF:OneWay OperationContract 上的异常处理

WCF 协议异常