升级到 .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.6 环境中运行,.NET Framework 4.5.2 及更早版本也不会受到影响。

  • 受影响的顶级 API 的列表:

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