4

我正在使用 HttpWebRequest 连接到第 3 方 API,并出现该 API 不支持用于请求的 TLS 版本的故障(“基础连接关闭”)。我检查了 Fiddler 中的请求,发现我的请求正在发送 TLS 1.0。

我已经尝试按照 SO 上许多很多答案中的建议在全局上设置较新的 TLS / SSL 版本ServicePointManager(并尝试了许多不同风格的设置设置),但即使在发出请求之前设置了它,我仍然得到同样的错误,我在 Fiddler 中检查并看到该请求仍在使用 TLS 1.0!就像我尝试使用 ServicePointManager 根本没有任何效果一样。

我提出请求的 DLL 在 .NET 4.6.1 上,并且也在 .NET 4.6.1 上使用 DLL,所以我不认为框架版本是罪魁祸首。

非常感谢任何想法或指导!

4

3 回答 3

2

我正在开发的 Android 应用程序也有类似的问题。

事实证明,我必须专门关闭 TLS 1.0,然后才能尝试更新版本的 TLS。我认为这是一个愚蠢的问题,但我最终所做的工作奏效了,所以我不会抱怨得太厉害。

第一篇文章包含许多有关审核代码的页面链接,以查看您使用的方法是否专门将您锁定在 TLS 1.0 中,就好像您不小心将其硬编码进去一样。

如果您使用自定义绑定:
- 配置 WCF 以允许操作系统通过将 SslProtocols 设置为使用 SslProtocols.None 来选择最佳安全协议。
- 或者配置使用配置路径system.serviceModel/bindings/customBinding/binding/sslStreamSecurity:sslProtocols的协议。

如果您没有使用自定义绑定并且使用配置设置 WCF 绑定,请设置与配置路径 system.serviceModel/bindings/netTcpBinding/binding/security/transport:sslProtocols 一起使用的协议。

对于 .NET Framework 4.6 - 4.6.2 而不是 WCF
将 DontEnableSystemDefaultTlsVersions AppContext 开关设置为 false。请参阅通过 AppContext 开关配置安全性。

对于使用带有证书凭据的 TCP 传输安全的 .NET Framework 4.6 - 4.6.2 的 WCF
您必须安装最新的操作系统补丁。请参阅安全更新。

除非您明确配置协议版本,否则 WCF 框架会自动选择最高 TLS 1.2 可用的最高协议。有关详细信息,请参阅前面的部分使用带有证书凭据的传输安全性的 WCF TCP 传输。

https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls

上面的页面链接到下面的链接,该链接专门用于从您的项目中删除 TLS 1.0 依赖项,以便迁移到 TLS 1.2+。

https://www.microsoft.com/en-us/download/details.aspx?id=55266

  1. 识别 AcquireCredentialsHandle() 的所有实例。这有助于审阅者更接近可能硬编码 TLS 的代码块。
  2. 查看硬编码 TLS 的 SecPkgContext_SupportedProtocols 和 SecPkgContext_ConnectionInfo 结构的任何实例。
  3. 在本机代码中,将 grbitEnabledProtocols 的任何非零赋值设置为零。这允许操作系统使用其默认的 TLS 版本。
  4. 如果启用 FIPS 模式可能会与本​​文档中明确禁用 TLS 1.0/1.1 所需的设置发生冲突,请禁用它。有关详细信息,请参阅附录 B。
  5. 使用在 Server 2012 或更早版本上托管的 WinHTTP 更新和重新编译任何应用程序。一种。应用程序必须通过 WinHttpSetOption 添加代码以支持 TLS 1.2
  6. 要涵盖所有基础,请扫描源代码和在线服务配置文件以查找以下与 TLS 硬编码中常用的枚举类型值相对应的模式
    :安全协议类型
    b. SSLv2、SSLv23、SSLv3、TLS1、TLS 10、TLS11
    c。WINHTTP_FLAG_SECURE_PROTOCOL_
    d. SP_PROT_e
    。NSStreamSocketSecurityLevel
    f。PROTOCOL_SSL 或 PROTOCOL_TLS

这就是文档的核心内容,但除此之外还有更多内容。我建议检查一下并确保您不会意外犯错,或者您有阻止您前进的遗留代码。这可能有点重写,而不仅仅是一个设置,祝你好运!

于 2019-08-02T21:15:27.260 回答
1

框架是罪魁祸首。问题是从 4.​​6 版开始的 .NET Framework 不允许 SSL,因为它被认为是易受攻击的。

解决方法

要解决此问题,请将服务器更新到 Tls 1.0、Tls 1.1 或 Tls 1.2,因为 SSL 3.0 已被证明不安全并且容易受到 POODLE 等攻击。

注意 如果您无法更新服务器,请使用 AppContext 类退出此功能。

为此,请使用以下方法之一:

以编程方式:必须是应用程序做的第一件事,因为 ServicePointManager 只会初始化一次。在您的应用程序中使用以下代码示例:

private const string DisableCachingName = @"TestSwitch.LocalAppContext.DisableCaching";
        private const string DontEnableSchUseStrongCryptoName = @"Switch.System.Net.DontEnableSchUseStrongCrypto";
        AppContext.SetSwitch(DisableCachingName, true);
        AppContext.SetSwitch(DontEnableSchUseStrongCryptoName, true);

通过为您的应用程序使用 AppConfig 文件:将以下行添加到 Appconfig 文件中:

<AppContextSwitchOverrides value="Switch.System.Net.DontEnableSchUseStrongCrypto=true"/>

有关以下链接的更多信息。

升级到 .NET Framework 4.6 后无法使用 ServicePointManager 或 SslStream API 连接到服务器

于 2019-08-02T21:09:30.280 回答
-1

我认为您可能需要更改注册表设置请按照以下参考链接

来自 StackOverflow

另一个来源

微软

于 2019-08-08T23:03:46.690 回答