在WinRT应用程序中,我如何使用TLS1.2连接?

4
我有一个Windows Store应用程序,它是一个WinRT手机/桌面应用程序(即不是UWP应用程序),针对Windows 8.1及以上版本。该应用已经在商店上架多年,但最近无法使用HTTPS连接各种Web API和网站(包括YouTube以及我的网站)。我还有一个WPF版本的这个应用程序,最近这个应用程序也发生了同样的问题,为了解决它,我使用了System.Net.ServicePointManager。不幸的是,在我的WinRT环境中,System.Net不包括ServicePointManager。在我的WPF应用程序中,我使用了相同的方法,运行良好。
ServicePointManager.ServerCertificateValidationCallback = delegate
{
    Debug.WriteLine("returning true (the ssl is valid)");
    return true;
};

// our server is using TLS 1.2
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

在对互联网进行研究时,似乎.NET 4.6应该包含“ServicePointManager”,但我在WinRT开发环境中没有看到任何更改(甚至无法查看)我的.NET版本的方法。
我继续查找并发现可以使用“StreamSocket”与TLS1.2连接......但这似乎主要是设计用于启用蓝牙通信或通过主机名连接到Web端点,而这对我来说是不够的。我需要连接到一个实际的网站,而不仅仅是基本级别的域名。
为了尝试这个,我做了以下事情:
StreamSocket socket = new StreamSocket();
string serverServiceName = "https";
socket.Control.KeepAlive = false;
url = "inadaydevelopment.com";
HostName serverHost = new HostName(url);
await socket.ConnectAsync(serverHost, serverServiceName, SocketProtectionLevel.Tls12);
text = await ReadDataFromSocket(socket);

如果需要,我可以包含ReadDataFromSocket()的代码,但是当我将其指向https://google.com时,它似乎可以正常工作,从套接字中读取预期的数据。然而,我似乎无法找到指向任何有用内容的方法。Inadaydevelopment.com的主页不是我想要的,我想要消耗托管在该服务器上的Web API,但似乎找不到方法来实现这一点。

由于ConnectAsync()方法的第一个参数只是HostName,因此第二个参数(remoteServiceName)必须是连接到我正在尝试连接的实际API或网页的方式。根据文档,它是远程网络目标的服务名称或TCP端口号...我还没有看到这个参数的任何示例值,除了https和各种数值,这两个值都无法让我到达我正在尝试连接的API端点或网页。

那么,经过这么长的前言,我的问题可以简化为这个

在我的WinRT应用程序中,是否有一种使用System.Net.ServicePointManager的方法,就像我在我的WPF应用程序中那样?如果是,如何实现?

如果不行,如何使用StreamSocket连接到我想要连接的确切网络服务或网页,而不仅仅是顶级主机?

如果这不可能,还能通过其他方式使用TLS1.2来消耗Web内容吗?

提前感谢任何帮助或建议。

1个回答

2

使用 Windows.Web.Http API 替代 System.Net.Http API。

System.Net.Http 不支持 TLS1.2,但是 WinRT 应用程序中的 Windows.Web.Http 支持。


1
谢谢,我会试试! - Kyle Humfeld
我终于有机会回到这个项目了,你的建议起作用了!非常感谢!这个问题我已经悬赏了一周,但是你的答案太晚了。如果有办法让我把奖励给你,请告诉我该怎么做,我很乐意帮你!=) - Kyle Humfeld
1
对于后来者,这是我用来查找具体信息的 MS 文档页面:https://learn.microsoft.com/en-us/dotnet/api/system.net.http.httpclient?view=net-5.0 - Kyle Humfeld
我实际上是在你设置悬赏时回答了这个问题,这就是我找到这个问题的方式。 - vvvv4d
1
非常抱歉,我没有在它过期之前看到并授予它!事实证明,我可以重新开放悬赏并在23小时内授予给您。 - Kyle Humfeld

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接