我有一个非托管(C++(程序,它通过COM使用多个托管(C#(DLL,我需要这些DLL才能使用TLS1.2。所有DLL都以.NET 4.6或更高版本为目标,但这似乎无关紧要。
当我运行以.NET 4.6和4.7为目标的托管程序并调用托管DLL时,SecurityProtocol分别设置为Tls, Tls11, Tls12
和SystemDefault
,并使用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使用Tls12
或SystemDefault
?谢谢
Simon Mourier是正确的,在配置文件中设置<AppContextSwitchOverrides value="Switch.System.Net.DontEnableSchUseStrongCrypto=false" />
是将Tls12
添加为默认协议的官方方式。