使用 WCF 将服务器的传输和消息签名证书作为客户端分离

kri*_*ash 5 wcf wcf-binding wcf-client wcf-security

我目前正在将 WCF 客户端集成到 Java Web 服务中。服务器要求客户端使用 SSL 和要签名的消息通过证书进行身份验证。

我已成功通过 SSL、Signed 等将消息发送到服务器。但是,服务器响应消息也已签名,但使用的证书与用于验证服务器的证书不同。

WCF 客户端不喜欢这种行为。它失败并显示以下消息:“传入的消息使用的令牌与用于加密正文的令牌不同。这是意料之外的。” 这里详细描述这个问题。

在 Google 上环顾四周,我发现通过实现 ClientCredentials 和其他安全相关类并添加新扩展,可以将客户端传输证书与唱歌证书分离。您可以在此处阅读有关它的所有详细信息。但是,我在弄清楚我必须在何处扩展才能在客户端模式下为服务器证书提供相同的行为时遇到了一些麻烦。

任何有关该主题或参考的帮助将不胜感激。

提前致谢。

小智 1

看看这里

这向您展示了如何创建自定义 ServiceCredentialsSecurityTokenManager,它允许您为服务器的请求和响应指定各种消息签名和加密证书。

我强调消息是因为您所描述的问题在我看来是消息安全验证。传输安全性与用于验证消息安全性的机制(即消息签名和消息解密)是分开的。

忽略传输安全性,因为它位于 WCF 管道的较低位置,并且从您的描述来看似乎工作正常。一个单独的问题是消息安全。看来您需要能够使用证书来解密响应和证书来验证签名。上面的文章展示了启用此类证书管理的示例,它详细介绍了如何创建行为和扩展以将其应用到您的客户端,这是一个单独的问题。这取决于您想要如何配置代理,即通过代码或通过配置。

您链接的示例文章也不是您所需的完整实现,它仅提供用于签名的证书和用于传输客户端凭据的证书。

您可以创建一个混合 ServiceCredentialsSecurityTokenManager 来提供传输证书以及签名和解密,通过查看SecurityTokenRequirement文档,这一点应该足够清楚