【问题标题】:Error in WCF auth with mutual SSL using certificates使用证书的相互 SSL 的 WCF 身份验证错误
【发布时间】:2014-10-27 13:18:19
【问题描述】:

我正在尝试使用另一家公司发布的服务。关于认证和通信的规范是:

  • 肥皂
  • 带有双向 SSL 身份验证的 HTTPS(2 路 SSL)
    • 使用他们发送给我们的公共证书(我使用的是 ServiceCertificate)
    • 使用他们为我们创建的私有证书(我用作 ClientCertificate)
  • 带有 UsernameToken 的 WS-Security

这是我到现在为止的代码:

WSHttpBinding binding = new WSHttpBinding(SecurityMode.Transport);
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
binding.SendTimeout = binding.CloseTimeout = binding.ReceiveTimeout = binding.OpenTimeout = new TimeSpan(0, 15, 0); // 15 minutes

Uri uri = new Uri(input.ServiceAddress);
EndpointAddress endpointAddress = new EndpointAddress(uri);

// Client creation
using (Client client = new Client(binding, endpointAddress))
{
    client.ClientCredentials.ClientCertificate.Certificate = input.PrivateCertificate;
    client.ClientCredentials.ServiceCertificate.DefaultCertificate = input.PublicCertificate;

    client.Open();

    // Service call
    ResponseType response = client.ServiceCall(params);
}

调用服务时出现此错误:

服务发出 HTTP 请求时出错。这可能是由于在 HTTPS 情况下未使用 HTTP.SYS 正确配置服务器证书。这也可能是由于客户端和服务器之间的安全绑定不匹配造成的。

我已经尝试过的事情:

  • 添加这行代码:“System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Ssl3;”
    • thisthis 上找到了解决方案
  • 用netsh在端口注册公共证书
    • 使用此命令:“netsh http add sslcert ipport=0.0.0.0:443 certhash=证书指纹 appid={应用程序 GUID}”
    • 基于我们在另一个项目中遇到的另一个问题

我不知道如何解决这个问题,我对此一无所知!已经搜索了很多,但我尝试的一切都没有!

【问题讨论】:

  • 虽然我不能告诉你出了什么问题,但我可以告诉你 SSL3 和 netsh 位可能出了什么问题:在最近的贵宾犬攻击之后,他们可能已经关闭了 SSL3。您应该检查他们在 SSL 握手中提供哪些协议和密码(我假设您的浏览器至少信任 SSL 证书),然后查看您是否启用了这些密码。 Netsh 位无关紧要,因为该位是服务器端,除非您在本地运行服务器,否则您的客户端将完全忽略该位。您可以使用ssllabs.com 来测试来自服务器端的内容和客户端的内容。
  • 字数限制:当我说最近的贵宾犬袭击事件时,我的意思是新闻中的内容,而不是您的第三方。
  • @Maverik,谢谢!我有一本解释身份验证和连接要求的手册。我知道我已经写了关于这个问题的内容,但我会尝试再问他们一点。可悲的是,ssllabs 在检查域名时遇到了意外错误,但服务器证书(我说的公共证书)在那里,有一个可以让它信任它(VeriSign)。
  • 我刚刚注意到您的要求中也有 UsernameToken。 WCF 是否有可能实际上是因为您没有按照示例代码发送它?您的代码看起来非常像我正在使用的代码,只是我从 STS 获得了一个 saml 令牌,而您的代码似乎是在客户端生成的?要求表明他们可能期望持有密钥令牌,而 wcf 在这些情况下非常神秘且具有误导性。您可能想查看具有内置 UsernameToken 的 WIF 以及根据上述要求发送正确请求的方法。
  • @Maverik:是的,它是基于他们的 wsdl 生成的客户端。 UsernameToken 位于我在代码上作为参数编写的“参数”上。该模式显示在此link 上。 “ssllabs”现在正在成功返回对其域的评估,但还没有成功。我在尝试其他一些事情时遇到了另一个错误:“无法为具有权限‘服务’的 SSL/TLS 建立安全通道。”

标签: c# web-services wcf ssl ssl-certificate


【解决方案1】:

我们的基础设施出现了一些网络问题。一旦我们从我的机器上移除了安全层,服务就可以运行了。

我猜证书(可能是密钥)没有通过网络,我收到了这个错误(因为它没有进行身份验证)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多