使用非托管可执行文件时设置ServicePointManager.SecurityProcol的正确方式



我有一个非托管(C++(程序,它通过COM使用多个托管(C#(DLL,我需要这些DLL才能使用TLS1.2。所有DLL都以.NET 4.6或更高版本为目标,但这似乎无关紧要。

当我运行以.NET 4.6和4.7为目标的托管程序并调用托管DLL时,SecurityProtocol分别设置为Tls, Tls11, Tls12SystemDefault,并使用TLS1.2。当我运行非托管程序并调用同一个托管DLL时,SecurityProtocol被设置为Ssl3, Tls,并且它不使用TLS1.2。

什么不起作用:

  • 在MyProgram.exe.config中设置supportedRuntime。将<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7" /></startup>添加到配置文件对SecurityProtocol没有影响

什么是有效的,但不是最佳的:

  • 创建一个显式设置SecurityProtocol的新DLL,并在非托管程序中调用它;则将为对所有其他DLL的调用正确地设置SecurityProtocol。这很好,但我不想仅仅为了这个而在我的项目中添加另一个依赖项
  • 通过添加行<AppContextSwitchOverrides value="Switch.System.Net.DontEnableSchUseStrongCrypto=false" />在配置文件中设置AppContextSwitchOverrides将导致SecurityProtocol为Tls, Tls11, Tls12。这很有效,但看起来像是一个利用未记录(可能是无意的(行为的黑客

在运行我的非托管程序时,有没有更好的方法让托管DLL的SecurityProtocol使用Tls12SystemDefault?谢谢

Simon Mourier是正确的,在配置文件中设置<AppContextSwitchOverrides value="Switch.System.Net.DontEnableSchUseStrongCrypto=false" />是将Tls12添加为默认协议的官方方式。

相关内容

  • 没有找到相关文章

最新更新