【问题标题】:In a in WinRT app, how do I connect using TLS1.2?在 WinRT 应用程序中,如何使用 TLS1.2 进行连接?
【发布时间】:2021-03-24 20:12:19
【问题描述】:

我有一个 Windows 应用商店应用,它是 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;

在围绕 Internet 进行一些研究时,似乎 .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 或网页的方式。根据the docs,即The service name or TCP port number of the remote network destination...,除了https 和各种数值之外,我没有看到此参数的任何示例值,这两者都不会让我进入我正在尝试的API 端点或网页连接到。

所以,在结束了超长的序言之后,我的问题归结为这个

我是否可以像在 WPF 应用程序中那样在 WinRT 应用程序中使用 System.Net.ServicePointManager?如果有,怎么做?

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

如果这不可行,我可以通过哪些其他方式使用 TLS1.2 消费网页内容?

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

【问题讨论】:

    标签: windows-runtime tls1.2 winrt-async stream-socket-client servicepointmanager


    【解决方案1】:

    使用Windows.Web.Http API 而不是System.Net.Http API。

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

    【讨论】:

    • 谢谢,我试试看!
    • 我终于有机会回到这个项目,你的建议奏效了!非常感谢!我在这个问题上悬赏了一周,但你的答案来得太晚了。无论如何,如果我有办法将它授予您,请告诉我该怎么做,我很乐意为您服务! =)
    • 对于事后出现的其他人,这是我用来查找细节的 MS 文档页面:docs.microsoft.com/en-us/dotnet/api/…
    • 我实际上是在您获得赏金时回答的,这就是我发现这个问题的方式。
    • 非常抱歉我没有看到它并在它过期之前奖励它!原来我可以在 23 小时内重新开放赏金并奖励给你。
    猜你喜欢
    • 2017-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    • 2015-01-14
    • 2015-04-09
    • 1970-01-01
    相关资源
    最近更新 更多