TLS 1.2 客户端和服务器无法通信,因为它们没有共同的算法。

3

我遇到了TLS 1.2的问题。如果我在客户端机器上启用tls1.0,它就能正常工作,但这并不是推荐的方法。

异常信息为- 客户端和服务器不能通信,因为它们没有共同的加密算法。 System.ComponentModel.Win32Exception (0x80004005):客户端和服务器不能通信,因为它们没有共同的加密算法。

我的应用程序的目标框架是.NET 4.6.2。


1
你在2012服务器上启用了1.2吗?下载 iiscrypto 工具来验证并在需要时启用它。 - Alex K.
@AlexK.,是的,它们已启用。 - Ragwq
使用诸如Wireshark/网络监视器之类的软件,检查ClientHello和ServerHello TLS消息中的算法。 - Zergatul
2
@AlexK.,我使用了iiscrypto并发现Windows 10使用tls1.0。谢谢你推荐这个程序。 - Ragwq
针对基于.NET Framework 4.6.2的应用程序,您需要对代码库进行一些更改。https://learn.microsoft.com/en-us/dotnet/framework/network-programming/tls#if-your-app-targets-a-net-framework-version-earlier-than-47 - Lex Li
我找到了解决方案。 <appSettings> <add key="AppContext.SetSwitch:Switch.System.Net.DontEnableSchUseStrongCrypto" value="false" /> <add key="AppContext.SetSwitch:Switch.System.Net.DontEnableSystemDefaultTlsVersions" value="false" /> </appSettings> https://dev59.com/sq3la4cB1Zd3GeqPPJUE#51923235 - Lise
2个回答

6

这里有两种可能的情况,我使用了第二种情况。

  1. 如果您在生产环境中遇到此问题,并且可以轻松地将新代码部署到生产环境,则可以使用以下解决方案:

    在调用API之前,您可以添加以下代码行:

    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; // .NET 4.5

  2. 如果您无法部署新代码并且想要使用与生产环境中相同的代码来解决此问题,则可以通过更改配置文件中的某些设置来完成。

    您可以在配置文件中添加以下任一选项之一:

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

或者
<runtime>
  <AppContextSwitchOverrides value="Switch.System.Net.DontEnableSystemDefaultTlsVersions=false"
</runtime>

选项一对我很有帮助,非常感谢! - Soul

1

以下是我解决问题的故障排除步骤。

  1. 安装IISCrypto.exe,并在我的本地服务器和客户端上关闭TSL 1.0/1.1,只保留TSL 1.2启用。
  2. 在我的.NET应用程序web.conf中进行设置。
 <system.web>
    <compilation debug="true" targetFramework="4.8" /> 
    <httpRuntime targetFramework="4.8" />
  1. 工具 > NuGet 包管理器 > 管理解决方案的 NuGet 包。

检查已安装的 MySql.Data 和 MySql.Web 版本(为 6.9.9.0)

安装并更新 MySql.Data 和 MySql.Web 至版本 8.0.23

此时,我的本地 .NET Web 服务器可以与本地 MySql 服务器通信。但是,在部署到生产服务器后(仅启用 TLS 1.2),会出现不同的错误消息。

 Fail to load MySql.Data assembly

 WRN: Assembly binding logging is turned OFF.

检查生产服务器中...\myapp\bin下的MySql.Web.dll和MySql.Data.dll。发现MySql.Data.dll仍然是6.9版本。 将MySql.Data.dll v.8.0.23从我的本地bin文件夹复制并粘贴到生产服务器上,这样就解决了生产服务器上的问题。

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