使用非托管可执行文件时设置 ServicePointManager.SecurityProcol 的正确方法
Proper way to set ServicePointManager.SecurityProcol when using an unmanaged executable
我有一个非托管 (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,并在其他任何事情之前在非托管程序中调用它;然后将正确设置 SecurityProtocol 以调用所有其他 DLL。这很好用,但我不想为此向我的项目添加另一个依赖项。
- 通过添加行
<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
添加为默认协议的官方方式。
我有一个非托管 (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,并在其他任何事情之前在非托管程序中调用它;然后将正确设置 SecurityProtocol 以调用所有其他 DLL。这很好用,但我不想为此向我的项目添加另一个依赖项。
- 通过添加行
<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
添加为默认协议的官方方式。