在带有.NET 4.7的Windows 10中,默认情况下未启用TLS 1.2

时间:2017-06-29 14:23:45

标签: .net windows-10 c++-cli tls1.2

我正在升级 Visual C ++ / CLI MFC DLL,以便默认使用TLS 1.2 ,以符合即将强制执行的要求Authorize.Net。

DLL现在设置为目标.NET 4.7,并且在运行它的Windows 10计算机上安装了.NET 4.7,但默认情况下未启用TLS 1.2 ,因为它应该是。 NET 4.6及以上版本。

我想避免不得不用代码修改DLL:

ServicePointManager::SecurityProtocol = SecurityProtocolType::Tls12;

我使用以下代码测试了与TLS 1.2的兼容性,这些代码总是引发异常:

HttpWebRequest ^httpReq = (HttpWebRequest ^)(WebRequest::Create("https://www.ssllabs.com:10303"));
HttpWebResponse ^ httpResp = (HttpWebResponse ^)httpReq->GetResponse();

if (((int)httpResp->StatusCode >= 200) &&
    ((int)httpResp->StatusCode <= 299))
    {
    // Log message indicating success
    }

我使用以下方法找到了默认的安全协议:

int protocolType = (int)ServicePointManager::SecurityProtocol;

返回值240,表示:

  SecurityProtocolType.Tls | SecurityProtocolType.Ssl3

不同版本的DLL,用C#编写。针对.NET 4.6,默认情况下,在安装了.NET 4.6的Windows Server 2012 R2上以TLS 1.2为目标,而无需通过ServicePointManager显式设置SecurityProtocol。

为什么默认情况下不会为Windows 10系统上的DLL启用TLS 1.2,如果所有内容都针对&amp;运行.NET 4.7?它可能与DLL是C ++ / CLI并由旧的VB6应用程序调用这一事实有关吗?我只是感到困惑。

2 个答案:

答案 0 :(得分:1)

我自己并不了解这种机制。如果我找到更多信息,我想并将更新此信息。但是,来自the docs on ServicePointManager.SecurityProtocol

  

.NET Framework 4.6包含一项新的安全功能,可阻止连接的不安全密码和散列算法。通过API(如HttpClient,HttpWebRequest,FTPClient,SmtpClient,SslStream等)使用TLS / SSL并以.NET Framework 4.6为目标的应用程序默认情况下会获得更安全的行为。

这表明默认值取决于已编译代码的目标框架。要更新应用程序的目标以获取新行为,请将项目属性中VS中的目标更改为至少4.6并重新编译。根据.net如何检测应用程序所针对的框架,您可以避免直接重新编译和编辑程序集的元数据以更改其目标并获取.net以返回较新的值。

.net-4.5 +根据您所定位的框架更改行为的原因是尝试避免在发布新版本时破坏兼容性。即使你的应用程序以.net-4.5为目标使用.net-4.7.1或更新的运行时,对于某些API和操作,.net-4.7.1也会假装表现得像.net-4.5。我们的想法是,在应用程序正常运行之前,开发人员可能需要在重定向到.net-4.7之后进行代码更改。

答案 1 :(得分:0)

您是否尝试在config中指定运行时目标框架?

<system.web>
    <httpRuntime targetFramework="4.7.2"/>
</system.web>

此设置使应用程序可以将安全协议选择重定向到OS,而无需将某些值硬编码到ServicePointManager.SecurityProtocol

在这种情况下 System.Net.ServicePointManager.SecurityProtocol == SystemDefault