1

好的,这一直是一个持续存在的问题。我已经试验了几个月,到目前为止,我可以让我的应用程序与 Windows Server 2008 R2 通信的唯一方法是在组策略中启用“使用 FIPS 兼容算法进行加密、散列和签名”设置客户端和服务器机器。一旦打开(在客户端和服务器的注册表中启用了 TLS 1.2 并禁用了 TLS 1.0),它就可以工作了。

但是,我的困境是我不需要FIPS 合规性,并且基于微软的建议以及我必须升级和更改大量代码以使我的所有应用程序符合 FIPS 的事实(更不用说不确定性)是否所有正在使用的第三方应用程序都符合客户端),我希望有一个更好的解决方案。

作为记录,我试图进行通信的应用程序是 MS Web Deploy 3.6、.NET Remoting over HTTPS/IIS 和 ClickOnce 部署。

我突然意识到,当我在服务器上启用 TLS 1.2而不启用 FIPS 模式时,浏览器可以与之通信。所以,显然有一些方法可以在没有这个设置的情况下完成工作,我只是还没有找到它。

我查看了这个答案这个答案,但这似乎是一个无法在配置文件中设置的低级设置,因此它在我的 3 种情况下至少有 2 种不起作用(它可能适用于 .NET远程处理,我还没试过)。但是缺乏示例令人震惊-也许这就是答案,但我不知道如何使用它。

一个可接受的解决方案是仅为某些用户启用 FIPS 合规性,因此我可以单独配置每个应用程序,但由于我能找到的只是机器范围的设置,我不知所措。

我想出的另一种可能的解决方案是使用 VPN 连接到服务器,这样我的应用程序就不需要加密协议来进行通信。但是,由于我使用的是 Windows Server 2008 R2 Web 版(不支持 VPN),所以我坚持使用 3rd 方解决方案(希望支持 TLS 1.2)或在新操作系统上重建我的服务器。

我的问题是:如何让编译的 .NET 应用程序(例如 MS Web Deploy 3.6 )在启用 FIPS 合规性的情况下通过 TLS 1.2 进行通信,就像浏览器一样

4

1 回答 1

1

我的回答基于文章中的信息:Transport Layer Security (TLS) best practice with the .NET Framework,并且似乎依赖于安装 .NET 4.7 或更高版本,而最初提出此问题时该版本并不存在。

我的测试是在 2016 年的服务器上完成的,使用 .NET 4.7 作为客户端和服务器,与自身通信。客户端 EXE 的目标是 .NET 4.7 之前的版本。在这种情况下,如果注册表中不存在以下值,则它们似乎默认为 0。

[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v2.0.50727]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v2.0.50727]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001

添加这些值后,我不再需要启用 FIPS 以使 TLS 1.2 工作。

于 2018-05-31T22:59:11.257 回答