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

应用对象
.NET Framework 4.6.2

症状

假设已升级到计算机上的 Microsoft .NET Framework 4.6。 使用将 SSL 3.0 与 ServicePointManager 或 SslStream API 一起使用的应用程序连接到服务器时,连接将失败。

原因

出现此问题的原因是 ServicePointManager 和 SslStream 使用的默认 SSL/TLS 协议集已更改。

旧值:Ssl 3.0 |Tls 1.0 |Tls 1.1

      

新值:Tls 1.0 |Tls 1.1 |Tls 1.2

解决方法

若要解决此问题,请将服务器更新为 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 中的已知问题的详细信息,请参阅 .NET Framework 4.6 的已知问题

详细信息

有关 .NET Framework 4.6 中的产品版本控制更改和影响的详细信息,请参阅 .NET Framework 4.6 中的应用程序兼容性

便笺

  • 仅当应用程序面向 .NET Framework 4.6 时,新配置才适用。 即使 .NET Framework 4.5.2 及更低版本在 .NET Framework 4.6 环境中运行,它们也不会受到影响。

  • 受影响的顶级 API 列表:

    • HttpClient、HttpWebRequest
    • FtpClient
    • SmtpClient
    • SslStream
  • SCH_USE_STRONG_CRYPTO 此标志将在 .NET Framework 4.6 中自动使用,并通过删除不安全的加密和哈希算法来影响行为。 对于早于 Windows 10 的所有操作系统平台,RC4 算法将从使用中删除。 从 Windows 10,将删除以下其他不安全算法:DES、NULL、EXPORT 和 MD5