在 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.Http
API代替System.Net.Http
API。
System.Net.Http
不支持 TLS1.2,但 Windows.Web.Http
在 WinRT 应用程序中支持。
我有一个 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.Http
API代替System.Net.Http
API。
System.Net.Http
不支持 TLS1.2,但 Windows.Web.Http
在 WinRT 应用程序中支持。