System.ComponentModel.Win32Exception: 客户端和服务器无法通信,因为它们不具备通用算法

System.ComponentModel.Win32Exception: The client and server cannot communicate, because they do not possess a common algorithm

上个月,我更新了一个客户站点,使其达到安全标准。没有任何问题,但是本周(05/10 @ 上午 10 点左右)我开始收到详细说明以下内容的例外情况:

System.ComponentModel.Win32Exception: The client and server cannot communicate, because they do not possess a common algorithm

我的 AWS MySQL RDS 的连接字符串已包含在内,从一开始就包含 SSLMode=Required。

我花了很长时间试图找出造成这种情况的根本原因,最后将数据库上的 SSLMode 设置为 none。

我得出的唯一结论是网站上的 SSL 证书与强制我的 MySQL 连接需要 SSLMode 之间存在冲突。

我已将网站更新为 .net 4.6。* 无济于事....

欢迎提出任何想法或建议....

我正在使用:MySQL 连接器,AWS MySQL 5.6,.net 4.6

内部异常:

 System.Data.Entity.Core.ProviderIncompatibleException: An error occurred accessing the database. This usually means that the connection to the database failed. Check that the connection string is correct and that the appropriate DbContext constructor is being used to specify it or find it in the application's config file. See http://go.microsoft.com/fwlink/?LinkId=386386 for information on DbContext and connections. See the inner exception for details of the failure. ---> System.Data.Entity.Core.ProviderIncompatibleException: The provider did not return a ProviderManifestToken string. ---> System.Security.Authentication.AuthenticationException: A call to SSPI failed, see inner exception. ---> System.ComponentModel.Win32Exception: The client and server cannot communicate, because they do not possess a common algorithm
   --- End of inner exception stack trace ---
   at System.Net.Security.SslState.StartSendAuthResetSignal(ProtocolToken message, AsyncProtocolRequest asyncRequest, Exception exception)
   at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)

请注意,我对 MySQL 连接器或 AWS 没有任何线索。说到这里,我在做一个猜测:

从错误消息中,我们最终可以得出结论,客户端和服务器无法就密码套件达成一致。如果您还没有听说过该主题:

SSL 是一种可以使用大量不同的密钥交换、加密和 MAC 算法的协议。某些(密钥交换、加密、MAC)算法(方法)的元组称为密码套件。建立 SSL 连接时,服务器和客户端需要就特定的密码套件达成一致,该密码套件将用于交换密钥、加密和验证连接。

这背后的基本原理是可以很容易地引入和使用新的、更安全的密码,而无需更改 SSL 规范本身,并且可以轻松删除旧的、不安全的、损坏的密码,而无需更改 SSL 规范本身。

这意味着服务器的所有者可以说:"I offer SSL to my clients, but only with cipher suites X, Y and Z"。如果客户端尝试连接,但仅支持密码套件 A、B 和 C,则连接将失败。

现在,有时会弃用密码套件,因为它被认为是不安全的。在这种情况下,该密码套件通常会被 O/S 收到的安全更新悄悄禁用,这就是您可能遇到的情况:

更新服务器后,一个或多个 SSL 密码套件可能已被禁用,通过更新 MySQL 或更新 O/S 本身或提供的库应用程序的加密服务。这可能会导致您(客户端)和服务器不再拥有通用密码套件的情况。

也可能有人故意禁用了服务器上的某些密码套件(即手动禁用,即不是 "collateral damage" 安装更新)。

此外,也可能是相反的情况:如果您在您的机器(客户端)上安装了更新或禁用了某些密码套件,则您的客户端和服务器可能不会可以再连接了。

要确定如何对此进行调试,我们需要更多地了解您的配置。不过,有一个通用提示:

在 SSL 握手期间,客户端向服务器发送问候,反之亦然。此问候中的客户端和服务器提供了它们支持的密码套件列表。由于客户端和服务器问候未加密,您可以使用 Wireshark 等工具轻松嗅探它们。然后你可以比较客户端和服务器支持的密码套件列表,并检查是否至少有一个共同的密码套件。

如果没有,您可能已经找到问题所在。在这种情况下,您必须更改客户端或服务器端的配置,以便客户端和服务器再次拥有至少一个共同的密码套件。如果您在这方面需要帮助,请回来,但请先像上面建议的那样分析情况。