【问题标题】:XmlReader.Create error "Could not create SSL/TLS secure channel"XmlReader.Create 错误“无法创建 SSL/TLS 安全通道”
【发布时间】:2018-08-12 02:59:17
【问题描述】:

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

在我首先创建和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 的提要现在在上述代码的 first 行生成 TLS 错误:

System.Net.WebException:请求被中止:无法创建 SSL/TLS 安全通道。
在 System.Net.HttpWebRequest.GetResponse() 在 System.Xml.XmlDownloadManager.GetNonFileStream(Uri uri,ICredentials 凭据,IWebProxy 代理,RequestCachePolicy cachePolicy)
在 System.Xml.XmlDownloadManager.GetStream(Uri uri、ICredentials 凭据、IWebProxy 代理、RequestCachePolicy 缓存策略)
在 System.Xml.XmlUrlResolver.GetEntity(Uri absoluteUri,字符串角色,ObjectToReturn 类型)
在 System.Xml.XmlTextReaderImpl.FinishInitUriString() 在 System.Xml.XmlTextReaderImpl..ctor(字符串 uriStr,XmlReaderSettings 设置,XmlParserContext 上下文,XmlResolver uriResolver)
在 System.Xml.XmlReaderSettings.CreateReader(字符串 inputUri,XmlParserContext inputContext)
在 System.Xml.XmlReader.Create(字符串 inputUri,XmlReaderSettings 设置,XmlParserContext inputContext)
在 System.Xml.XmlReader.Create(String inputUri)

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

你知道问题的原因吗?

【问题讨论】:

  • 你使用的是4.5以下的.Net framework版本吗?

标签: asp.net vb.net github xmlreader


【解决方案1】:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

.NET 4.5.1

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

【讨论】:

    【解决方案2】:

    服务器控制最终协商的协议。 Stackoverflow 服务器只需要 TLS v1,如下面的 wireshark 捕获所示。此跟踪是在 .Net 框架版本 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。 但是,如果可以,只需升级到较新的框架版本即可轻松完成。

    更新

    有一个适用于 .Net 3.5 的补丁:

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

    【讨论】:

    • ServicePointManager.SecurityProtocol = DirectCast(3072, SecurityProtocolType) 在我的项目中就像一个魅力,所以这绝对是正确的解决方案。非常感谢您的深入调查。
    • SecurityProtocolType.Tls12 - 代替 DirectCast
    • @Jimmyt1998 仅适用于 .网4.5+。在此之前,没有 Tls12 的枚举值。
    猜你喜欢
    • 2018-04-06
    • 2017-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 2014-12-26
    • 2017-02-10
    • 2017-08-22
    相关资源
    最近更新 更多