在.NET中不改变代码的情况下启用TLS 1.2

13

我有一个使用SmtpClient发送电子邮件的.NET 4.5.2应用程序。该应用程序安装在Windows 2012 R2服务器上。当我禁用TLS 1和TLS 1.1并仅启用TLS 1.2时,应用程序停止发送邮件。我认为这是因为.NET 4.5.2不支持v1.2。

我考虑以下步骤:

1> 在Windows Server上禁用TLS 1和TLS 1.1,并仅启用TLS 1.2。
2> 在Windows Server上安装.NET 4.8。
3> 修改应用程序的目标框架为4.8(在csproj和web.config中),然后重新编译。
4> 部署应用程序。

问题
根据文档从.NET Framework 4.7.1开始,WCF默认使用操作系统配置的版本
1> 这只适用于WCF还是SMTP也会默认使用操作系统配置的版本?
2> 还是我需要显式设置版本,如: System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
3> 是否可能现在就设置版本为TLS 1.2,并在将来TLS 1.3可用时应用程序自动默认为TLS 1.3?(无需再次更改代码)


希望你的应用程序没有托管在Azure应用服务中;如果是的话,你可以轻松地导航到你的应用服务 > 设置 > TLS/SSL设置 > 升级到TLS 1.2或首选。理想情况下,最高的TLS是好的和安全的。 - hiFI
1个回答

15

这只适用于WCF吗?SMTP是否也默认使用操作系统配置的版本?

不是,这适用于所有基于SslStream的.NET Framework网络API,包括SMTP、HTTP和FTP


还是我需要显式设置版本,例如System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;?

如果您将应用程序编译为.NET 4.7或更高版本,则不需要为System.Net.ServicePointManager.SecurityProtocol设置值,因为它将设置为SystemDefault,这意味着它将继承操作系统的默认安全协议或系统管理员执行的任何自定义配置。


现在是否可以设置版本TLS 1.2,并且当未来可用TLS 1.3时,应用程序应自动默认为TLS 1.3?

是的,您只需检查System.Net.ServicePointManager.SecurityProtocol是否设置为除SystemDefault(在.NET 4.7+中的值为0)以外的其他任何内容,如果是,则可以将其设置为TLS 1.2以覆盖它。

var securityProtocol = (int)System.Net.ServicePointManager.SecurityProtocol;

// 0 = SystemDefault in .NET 4.7+
if (securityProtocol != 0)
{
    System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
}

1
我应该把这段代码放在哪里?在控制器上,服务中还是启动项中? - ezhupa99
@ezhupa99 在您的应用程序开始之初,在执行任何HTTP请求之前 - C. Augusto Proiete

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接