1

在 Windows 10(版本 10.0.19041)上运行的 .NET 4.8 应用程序使用注册表启用了 TLS 1.3,按照如何在 Windows 10 中启用 TLS 1.3

但是运行以下代码:

 try
            {                
                System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls13;
                using (var client = new WebClient())
                { 
                    var img = client.DownloadData("URL of an image - Only TLS 1.3 at client side - removed for privacy purposes");
                    MemoryStream ms = new MemoryStream(img);
                    Image i = Image.FromStream(ms);
                    i.Save(AppDomain.CurrentDomain.BaseDirectory+"/img1.jpeg");
                }
            }
            catch(Exception ex)
            {
                logger.Log(LogLevel.Error, ex.ToString());
            }

产生以下 - 异常 StackTrace:

2020-10-05 12:40:52.4779 ERROR System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a receive. ---> System.IO.IOException: Cannot determine the frame size or a corrupted frame was received.
   at System.Net.Security._SslStream.StartFrameBody(Int32 readBytes, Byte[] buffer, Int32 offset, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security._SslStream.StartFrameHeader(Byte[] buffer, Int32 offset, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security._SslStream.StartReading(Byte[] buffer, Int32 offset, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security._SslStream.ProcessRead(Byte[] buffer, Int32 offset, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security._SslStream.Read(Byte[] buffer, Int32 offset, Int32 count)
   at System.Net.TlsStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   at System.Net.PooledStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   at System.Net.Connection.SyncRead(HttpWebRequest request, Boolean userRetrievedStream, Boolean probeRead)

我发现了一个与 .NET 5.0 相关的问题,但是我不知道该问题是否已修复或将针对 .NET 4.8 https://github.com/dotnet/runtime/issues/1720修复

4

1 回答 1

4

来自.NET Framework 文档问题的传输层安全性 (TLS) 最佳实践,日期为 2020 年 8 月 21 日:

.NET Framework 尚不支持 TLS 1.3。这是我们将很快开始工作的事情(cc @wfurt)。底线是,要使用 TLS 1.3,我们必须使用新的 Windows API,因此我们必须在 .NET Framework 中更改我们的代码,并且由于 TLS 1.3 的其他要求(在TLS 1.2 及更低版本)。

另请注意,具有 TLS 1.3(非实验性支持)的 Windows 10 仅在最近发布,我认为仅在 Windows 10 Insider 版本中(@wfurt 有更多详细信息)。

在 .NET Core中,我们最近在即将到来的 .NET 5 RC1 版本中实现了 TLS 1.3 支持。您可以在那里试用(当然,在支持它的 OS 版本上)。

.NET 5 RC1已发布并具有生产就绪的上线许可证。

于 2020-10-05T20:14:36.563 回答