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

In a in WinRT app, how do I connect using TLS1.2?

我有一个 Windows Store 应用程序,它是一个 WinRT Phone/Desktop 应用程序(即不是 UWP 应用程序),针对 Windows 8.1 及更高版本。

它已经在商店上架好几年了,但最近它无法使用 HTTPS 连接各种网络 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 端点的通信而设计的,但是 only by hostname... 这对我来说不够。我需要连接到实际网站,而不仅仅是基础域。

为此,我做了以下操作:

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 的主页不是我想要的;我想使用托管在该服务器上的网络 API,但似乎找不到方法。

由于 ConnectAsync() 方法的第一个参数只是 HostName,第二个参数 (remoteServiceName) 必须是连接到实际 API 或我正在尝试连接的网页。根据 the docs,即 The service name or TCP port number of the remote network destination... 除了 https 和各种数值外,我还没有看到此参数的任何示例值,这两个都不会让我进入 API 我正在尝试连接的端点或网页。

所以,去掉那个超长的序言,我的问题归结为这个

有没有办法让我像在 WPF 应用程序中那样在 WinRT 应用程序中使用 System.Net.ServicePointManager?如果是,怎么做?

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

如果这不可能,我还可以通过什么其他方式使用 TLS1.2 使用 Web 内容?

在此先感谢您的帮助或建议。

使用Windows.Web.HttpAPI代替System.Net.HttpAPI。

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