缺少相互证书的 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的主要内容,如果未能解决你的问题,请参考以下文章

使用证书连接时 WCF 请求引发错误

使用ssl和客户端证书的Wcf:请求svc succes wcf调用返回403.16

使用 WCF 的 Http 请求中缺少授权标头

通过 HTTPS 上的客户端证书对 WCF 请求进行身份验证

向 wcf 服务发出 https 请求:根据验证程序,远程证书无效

WCF 错误:“X.509 证书 CN=localhost 链构建失败......”