XmlReader.Create 错误 "Could not create SSL/TLS secure channel"

XmlReader.Create error "Could not create SSL/TLS secure channel"

在我基于 ASP.net 的网站上,我正在从多个网站汇总我的活动提要。 其中之一是位于 https://github.com/lucamauri.atom 的 GitHub 提要:这是一个有效的提要,可以使用网络浏览器正确读取,并且从几周前开始在我的网站上正常运行。从那以后,它开始产生错误

在代码中,我首先创建 XMLReader 然后将其加载到 SyndicationFeed 对象中,如下所示:

Dim TempReader As System.Xml.XmlReader = System.Xml.XmlReader.Create(TempString)
Dim SyndFeed As SyndicationFeed = SyndicationFeed.Load(TempReader)
Dim TempItems As New List(Of SyndicationItem)
TempItems.AddRange(SyndFeed.Items.ToList.GetRange(0, Math.Min(CurrentFeed.TotalElements, SyndFeed.Items.Count)))

这适用于多个提要,但 GitHub 现在会在上述代码的 第一行 行上生成 TLS 错误:

System.Net.WebException: The request was aborted: Could not create SSL/TLS secure channel.
at System.Net.HttpWebRequest.GetResponse() at System.Xml.XmlDownloadManager.GetNonFileStream(Uri uri, ICredentials credentials, IWebProxy proxy, RequestCachePolicy cachePolicy)
at System.Xml.XmlDownloadManager.GetStream(Uri uri, ICredentials credentials, IWebProxy proxy, RequestCachePolicy cachePolicy)
at System.Xml.XmlUrlResolver.GetEntity(Uri absoluteUri, String role, Type ofObjectToReturn)
at System.Xml.XmlTextReaderImpl.FinishInitUriString() at System.Xml.XmlTextReaderImpl..ctor(String uriStr, XmlReaderSettings settings, XmlParserContext context, XmlResolver uriResolver)
at System.Xml.XmlReaderSettings.CreateReader(String inputUri, XmlParserContext inputContext)
at System.Xml.XmlReader.Create(String inputUri, XmlReaderSettings settings, XmlParserContext inputContext)
at System.Xml.XmlReader.Create(String inputUri)

我对其他 HTTPS 提要使用相同的代码(https://whosebug.com/feeds/user/69295 仅举一例),但我没有收到错误。所以这是特定于 GitHub 提要的东西,但是我又可以从我 运行 网站所在的同一台机器上的浏览器访问它,所以我迷路了。

知道问题的原因吗?

服务器控制最终协商的协议。 Whosebug 服务器仅需要 TLS v1,如下面的 wireshark 捕获所示。此跟踪是在 .Net Framework 版本 4 上完成的。

Github 提要拒绝低于 TLS v1.2 的任何内容,因此在 .Net 4.0 上失败,因为默认情况下该版本不可用。

您可以通过在 ServicePointManager 上设置 SecurityProtocol 来解决这个问题,如果您在同一台计算机上安装了 .Net 4.5+。如果你不这样做,那么你根本无法提出请求。

您可以通过使用 SecurityProtocol 的数值而不是 .Net 4 上不可用的枚举值来执行此操作。

ServicePointManager.SecurityProtocol = DirectCast(3072, SecurityProtocolType)

完成此操作后,您现在甚至可以在 .Net 4 上协商 TLS 1.2。 但是,如果可以,只需升级到较新的框架版本即可。

Update

.Net 3.5 有可用的补丁:

https://support.microsoft.com/en-us/help/3154520/support-for-tls-system-default-versions-included-in-the-net-framework

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

.NET 4.5.1

在 mvc 项目的启动 class 中设置它,xmlreader 处理 https 链接,谢谢大家。