gpt4 book ai didi

c# - 使用 Azure Functions 中的 SSL3 调用外部 API

转载 作者:太空宇宙 更新时间:2023-11-03 22:55:34 26 4
gpt4 key购买 nike

我们有一个 .NET 应用程序需要与严格要求 SSL3 才能工作的 API 进行交互,但是我们不希望我们的整个网站在该安全协议(protocol)内运行。

为了在.NET框架中实现这一点,我们使用了AppDomain and, therefore, remoting 。但是,我们正在将应用程序移植到 .NET Core 2.0,并且该功能不再可供我们使用。

我们建议的解决方案是使用 Azure Functions 提供无服务器函数,该函数可以联系 API 并返回交互结果,从而充当代理。

以下是我们在函数中设置的一些代码:

// set the protocol to SSL3 app wide
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
// ignore any SSL errors
ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;

但是运行它会给我们带来以下错误:

System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a receive. ---> System.ComponentModel.Win32Exception: The client and server cannot communicate, because they do not possess a common algorithm
at System.Net.SSPIWrapper.AcquireCredentialsHandle(SSPIInterface SecModule, String package, CredentialUse intent, SecureCredential scc)
at System.Net.Security.SecureChannel.AcquireCredentialsHandle(CredentialUse credUsage, SecureCredential& secureCredential)
at System.Net.Security.SecureChannel.AcquireClientCredentials(Byte[]& thumbPrint)
at System.Net.Security.SecureChannel.GenerateToken(Byte[] input, Int32 offset, Int32 count, Byte[]& output)
at System.Net.Security.SecureChannel.NextMessage(Byte[] incoming, Int32 offset, Int32 count)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)
at System.Net.TlsStream.CallProcessAuthentication(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Net.TlsStream.ProcessAuthentication(LazyAsyncResult result)
at System.Net.TlsStream.Write(Byte[] buffer, Int32 offset, Int32 size)
at System.Net.PooledStream.Write(Byte[] buffer, Int32 offset, Int32 size)
at System.Net.ConnectStream.WriteHeaders(Boolean async)
--- End of inner exception stack trace ---
at System.Net.HttpWebRequest.GetResponse()
at Submission#0.<Run>d__1.MoveNext() in :line 15

是否可以让 Azure Functions 执行我们正在尝试执行的操作,或者我们尝试设置的设置在沙盒环境中未得到执行?

最佳答案

Azure Functions 在 Windows Worker 之上运行,就像 Web 应用程序一样,因为它们都是应用服务的一部分。下面是同一个沙箱。

如果您使用 PowerShell your way around the registry在 Kudu 中,您会发现 SSL 3.0 在系统范围内被禁用,这是任何现代服务所期望的。

SSL 3.0 Registry Keys

来自 Ivan Ristić 的优秀Bulletproof SSL 和 TLS 书籍:

DisabledByDefault — This setting is for applications that do not explicitly configure enabled protocols but use system defaults. If the entry is not present or if the value is 0, the protocol is enabled by default. If the value is 1, the protocol is disabled by default. Normally, Windows will disable SSL 2 and leave all other protocols enabled.

过去 10 年里,运行仅 SSL 3.0 API 的人已经休了太多假期。和那些人谈谈一些道理。 SSL 3.0 容易受到 BEAST 攻击,Microsoft 的实现中没有 AES,不支持 GCM、SHA256 和 SHA384 套件,也没有椭圆曲线加密技术,因此没有前向保密。

如果您依赖 SSL 3.0 晚上 sleep 没有问题,则必须使用 different TLS library来自 .NET/Windows 提供的(System.Security 和 SCHANNEL)。 OpenSSL、BoringSSL、GnuTLS、LibreSSL 如果您找到 C# 包装器或者您有足够的时间来开发自己的包装器,那么它们都是您的选择。

这里真正的解决方案是通过虚拟机代理所有请求。您可以控制操作系统,也可以控制 TLS 堆栈。然后,您可以与 Remote 使用 SSL 3.0。我不敢相信我会这么说 - 给我他们的电话号码!

更新:您现在可以使用(更多)轻量级容器实例来代理 SSL 3.0 流量。请参阅https://learn.microsoft.com/en-us/azure/container-instances/container-instances-overview

关于c# - 使用 Azure Functions 中的 SSL3 调用外部 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45560114/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com