首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HttpWebRequest总是发送TLS1.0

HttpWebRequest总是发送TLS1.0
EN

Stack Overflow用户
提问于 2019-07-31 12:51:54
回答 3查看 1.2K关注 0票数 4

我使用HttpWebRequest连接到第三方API,并获得失败(“基础连接关闭”),该API不支持用于请求的TLS版本。我在Fiddler中检查请求,并看到我的请求正在发送TLS 1.0。

我尝试过在全局ServicePointManager上设置更新的TLS / SSL版本,这是这里推荐的许多答案(并且尝试了许多不同的设置方式),但是即使在设置了请求之前,我仍然会得到相同的错误,我在Fiddler中检查并看到请求是仍然是,使用TLS 1.0!这就像我尝试使用ServicePointManager完全没有任何效果。

我提出请求的DLL是在.NET 4.6.1上,使用DLL也是在.NET 4.6.1上,所以我不认为框架版本是罪魁祸首。

任何想法或指导都是非常感谢的!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-08-02 21:15:27

在我正在开发的一个Android应用程序中,我遇到了类似的问题。

结果,我不得不特别关闭TLS 1.0,这样就可以尝试更新版本的TLS了。我认为这是一个愚蠢的问题,但我最后做了工作,所以我不打算抱怨太多。

第一篇文章包含了许多关于审核代码的页面的链接,以查看您正在使用的方法是否将您锁定到TLS1.0中,就好像您意外地硬编码了它一样。

如果使用自定义绑定,则为

  • 通过将SslProtocols设置为使用SslProtocols.None,配置WCF以允许操作系统选择最佳安全协议。
  • 或配置配置路径system.serviceModel/bindings/customBinding/binding/sslStreamSecurity:sslProtocols.所使用的协议。

如果不使用自定义绑定,并且使用配置设置WCF绑定,则设置配置路径system.serviceModel/bindings/netTcpBinding/binding/security/transport:sslProtocols.使用的协议

For .NET Framework4.6-4.6.2而不是WCF

将DontEnableSystemDefaultTlsVersions AppContext开关设置为false。请参阅通过AppContext交换机配置安全性。

使用框架4.6-4.6.2使用带有证书凭据的.NET传输安全性

您必须安装最新的OS修补程序。请参阅安全更新。

除非显式配置协议版本,否则WCF框架将自动选择TLS 1.2之前可用的最高协议。有关更多信息,请参见上一节中使用带有证书凭据的传输安全性的WCF TCP传输。

https://learn.microsoft.com/en-us/dotnet/framework/network-programming/tls

上面的页面链接到下面的链接,该链接专门用于从项目中移除TLS 1.0依赖项,以便迁移到TLS 1.2+。

https://www.microsoft.com/en-us/download/details.aspx?id=55266

  1. 标识AcquireCredentialsHandle()的所有实例。这有助于评审人员更接近于TLS可能被硬编码的代码块。
  2. 检查硬编码TLS的SecPkgContext_SupportedProtocols和SecPkgContext_ConnectionInfo结构的任何实例。
  3. 在本机代码中,将grbitEnabledProtocols的任何非零赋值设置为零。这允许操作系统使用其默认的TLS版本。
  4. 如果由于可能与本文档中显式禁用TLS 1.0/1.1所需的设置冲突,则禁用FIPS模式。有关更多信息,请参见附录B。
  5. 使用服务器2012或更高版本上的WinHTTP更新和重新编译任何应用程序。应用程序必须添加代码以通过WinHttpSetOption支持TLS 1.2。
  6. 为了涵盖所有的基础,扫描源代码和在线服务配置文件,以获得与TLS硬编码中常用的枚举类型值对应的模式: a. SecurityProtocolType b. SSLv2,SSLv23,SSLv3,TLS1,TLS 10,TLS11 c. WINHTTP_FLAG_SECURE_PROTOCOL_ d. SP_PROT_ e. NSStreamSocketSecurityLevel f. PROTOCOL_SSL或PROTOCOL_TLS

这是文件的主要内容,但更重要的是。我建议您检查一下,确保您没有意外地犯错误,或者您的遗留代码妨碍了您的前进。这可能是一个重写,而不仅仅是一个设置,所以祝你好运!

票数 3
EN

Stack Overflow用户

发布于 2019-08-02 21:09:30

框架是罪魁祸首。问题是从版本4.6开始的.NET框架不允许SSL,因为它被认为是易受攻击的。

解决方案

要解决此问题,请将服务器更新为Tls 1.0、Tls 1.1或Tls 1.2,因为SSL3.0已被证明是不安全的,容易受到贵宾狗之类的攻击。

注如果无法更新服务器,请使用AppContext类选择退出此功能。

要做到这一点,请使用以下方法之一:

Programmatically:必须是应用程序做的第一件事,因为ServicePointManager只初始化一次。在应用程序中使用以下代码示例:

代码语言:javascript
复制
private const string DisableCachingName = @"TestSwitch.LocalAppContext.DisableCaching";
        private const string DontEnableSchUseStrongCryptoName = @"Switch.System.Net.DontEnableSchUseStrongCrypto";
        AppContext.SetSwitch(DisableCachingName, true);
        AppContext.SetSwitch(DontEnableSchUseStrongCryptoName, true);

通过为应用程序使用AppConfig文件:将以下行添加到Appconfig文件中:

代码语言:javascript
复制
<AppContextSwitchOverrides value="Switch.System.Net.DontEnableSchUseStrongCrypto=true"/>

更多关于链接下面的信息。

升级到ServicePointManager Framework4.6后,无法使用SslStream或.NET API连接到服务器

票数 1
EN

Stack Overflow用户

发布于 2019-08-08 23:03:46

我认为您可能需要更改注册表设置,请按照以下参考链接进行更改

来自StackOverflow

另一个来源

微软

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57291177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档