缺少相互证书的 Wcf 请求 wsse:Security
Posted
技术标签:
【中文标题】缺少相互证书的 Wcf 请求 wsse:Security【英文标题】:Wcf request with mutual certificate missing wsse:Security 【发布时间】:2020-02-10 00:02:21 【问题描述】:我正在尝试使用 wcf 通过相互证书进行 SOAP 调用,但也不断出错
'请求被中止:无法创建 SSL/TLS 安全通道。' 或
'远程服务器返回错误:(500) Internal Server Error Missing wsse:Security header in request'
在 SOAP UI 中完成的类似请求有效,但 C# 不想通过。我还查看了发送的具体内容,发现肥皂信封确实缺少标题中的 wsse:Security。我怎样才能让它发挥作用?
WSHttpBinding myBinding = new WSHttpBinding();
myBinding.Security.Mode = SecurityMode.Transport;
myBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
EndpointAddress ea = new EndpointAddress("https://[securedEndpoint]/Calculator");
CalculatorClient cc = new CalculatorClient(myBinding, ea);
cc.ClientCredentials.ClientCertificate.SetCertificate(
StoreLocation.CurrentUser,
StoreName.Root,
X509FindType.FindBySerialNumber,
"37802b632e74e355");
cc.ClientCredentials.ServiceCertificate.SetDefaultCertificate(
StoreLocation.CurrentUser,
StoreName.Root,
X509FindType.FindBySerialNumber,
"29f3e22fc1ae45be");
// Begin using the client.
try
cc.Open();
Console.WriteLine(cc.Add(200, 1111));
Console.ReadLine();
// Close the client.
cc.Close();
【问题讨论】:
【参考方案1】:如您所知,当我们使用证书来保护通信时,我们应该将证书绑定到特定端口。另外,如果我们用证书对客户端进行认证,我们必须在服务器证书和客户端证书之间建立证书信任关系。除了Message安全模式,我们一般在客户端提供一个客户端证书就够了。 我建议你检查客户端和服务器端之间的信任关系状态。此外,为了保证证书可用,我们最好使用本地计算机证书存储和证书指纹设置证书。考虑到证书私钥访问的问题,建议大家将Everyone账号加入证书私钥管理组。 最后请确保证书具有客户端认证和服务器认证的预期用途。 如果有什么可以帮助的,请随时告诉我。
【讨论】:
这一定与 C# 和我的证书有关。我试图将粘贴肥皂信封从 SOAPUI 复制到 Postman。我用这个 SOAP 消息运行 Postman。邮递员让我挑选证书,我从商店挑选了一张。它确实成功了。问题是为什么我不能在 c# 中实现同样的目标。 您选择的证书是您在代码中提供的客户端证书吗?请删除服务证书,传输安全不需要配置服务证书,这个只在服务器端配置。另外,你确定证书是服务器端信任的吗? 是的。我删除了服务证书,结果是一样的。我 100% 确定证书受到服务器端的信任,就像我使用 Postman 或 SoapUI 做同样的事情时一切正常。 请尝试在本地机器中指定证书,并将Everyone帐户添加到证书私钥的管理组中。 我使用以下方式向前移动了一点:***.com/questions/9571058/… 现在我得到了 wsse Security 标头,但现在我得到了不同的错误:System.ServiceModel.Security.MessageSecurityException:'传入的消息是用令牌签名的这与用于加密正文的不同。这是没有预料到的。'以上是关于缺少相互证书的 Wcf 请求 wsse:Security的主要内容,如果未能解决你的问题,请参考以下文章
使用ssl和客户端证书的Wcf:请求svc succes wcf调用返回403.16
通过 HTTPS 上的客户端证书对 WCF 请求进行身份验证