自从升级到 .Net 4.6.1 后,我无法再调用第三方 Web 服务,但收到错误消息“无法为具有权限的 SSL/TLS 建立安全通道......”。我可以通过多种方式解决此问题,但我认为这些方式不可接受。a) 将以下行添加到代码中:
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls11 | System.Net.SecurityProtocolType.Tls;
这确保我不使用 Tls1.2 并且所有工作都像以前一样使用 .Net 4.5.2
b)将以下行添加到我的配置文件中
<AppContextSwitchOverrides value="Switch.System.Net.DontEnableSchUseStrongCrypto=true"/>
这确保我不使用 Tls1.2 并且所有工作都像以前一样使用 .Net 4.5.2
我宁愿能够使用 Tls1.2,也不愿为来自我的应用程序的所有调用关闭它,我的应用程序与许多第三方服务通信,我不想因为一个问题而限制所有通信。
使用 WireShark 诊断问题已经突出显示未发送客户端证书,这显然会导致此错误。
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="def">
<security mode="Transport">
<transport clientCredentialType="Certificate"/>
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="https://abc" binding="basicHttpBinding" bindingConfiguration="def" contract="ghi" name="jkl"/>
</client>
ClientCertificate 在代码中设置
我已经阅读了很多关于 stackoverflow 的文章,最相似/有用的如下: 如何强制 WCF 客户端发送客户端证书?
我检查过:
- 可以访问客户端证书(私钥)
- 服务器证书是可信且有效的
- 客户端证书与服务器发送的规范之一匹配
将我的绑定转换为自定义绑定以指定 requireClientCertificate - 无效
<endpoint address="https://abc" binding="customBinding" bindingConfiguration="def" contract="ghi" name="jkl"/>
谁能指出我可以检查的其他任何内容或帮助我理解为什么我的证书没有发送?
6 月 2 日更新 我可以使用我的客户端证书成功下载 wsdl,以在 Chrome 中进行身份验证,但不能在 Internet Explorer 或 Edge 中进行身份验证!
我相信 Chrome 不使用 SChannel(就像 Edge 和 IE 一样)用于 TLS,但它是自己的 SSL/TLS 实现。
虽然我不是 100% 确定我目前正在考虑问题是服务器正在为客户端证书指定与客户端签名算法不匹配的签名算法。我不太了解 TLS 1.2 的工作原理,但从阅读规范 tools.ietf.org/html/rfc5246#section-7.4.4 来看,这似乎是可能的。
请参阅wireshark 跟踪中的证书请求 - i.stack.imgur.com/BwmUM.png 和证书详细信息 - i.stack.imgur.com/pbKEF.png
那里有任何 tls1.2 专家吗?