[转]如何借助 TLS/SSL 确保套接字连接的安全(使用 C#/VB/C++ 和 XAML 的 Windows 应用商店应用)...
本文转自:http://msdn.microsoft.com/zh-cn/library/windows/apps/jj150597.aspx
本主题将展示在使用 StreamSocket 功能时,如何使 Windows 应用商店应用可以保护 TLS/SSL 流套接字连接。
你需要了解的内容
技术
- Windows.Networking.Sockets
使用套接字和 WebSocket 启用网络通信。
先决条件
- 在本主题中,以下示例都来自 C# 和 C++。建议对套接字和 SSL/TLS 的使用有一个基本的了解。
SSL/TLS 连接概述
有以下两种方法可以借助 SSL/TLS 确保 StreamSocket 连接的安全:
- ConnectAsync - 建立到网络服务的初始连接并立即协商对所有通信使用 SSL/TLS。
- UpgradeToSslAsync - 先不加密连接到网络服务。应用可以发送或接收数据。然后升级连接,对此后所有通信使用 SSL/TLS。
使用 ConnectAsync
建立与网络服务的初始连接并立即协商对所有通信使用 SSL/TLS。有两种 ConnectAsync 方法支持传递protectionLevel 参数:
- ConnectAsync(EndpointPair, SocketProtectionLevel) - 在 StreamSocket 对象上启动异步操作以连接到EndpointPair 对象和 SocketProtectionLevel 所指定的远程网络目标。
- ConnectAsync(HostName, String, SocketProtectionLevel) - 在 StreamSocket 对象上启动异步操作以连接到由远程主机名、远程服务名和 SocketProtectionLevel 所指定的远程目标。
如果 protectionLevel 参数被设置为 Windows.Networking.Sockets.SocketProtectionLevel.Ssl,当调用上述任一ConnectAsync 方法时,StreamSocket 必须使用 SSL/TLS 用于加密。此值需要加密而且绝不允许使用 NULL 密码。
一般来说,使用这些 ConnectAsync 方法的顺序都是相同的。
- 创建一个 StreamSocket。
- 如果需要在套接字上使用高级选项,请使用 StreamSocket.Control 属性获取与 StreamSocket 对象 相关联的StreamSocketControl 实例。 针对 StreamSocketControl 设置一个属性。
- 调用上述 ConnectAsync 方法之一以启动连接到远程目标的操作,并立即协商使用 SSL/TLS。
以下示例将会创建 StreamSocket,并尝试建立与网络服务的连接并立即协商使用 SSL/TLS。如果协商成功,则在客户端和网络服务器之间使用 StreamSocket 的所有网络通信都将被加密。
using Windows.Networking; using Windows.Networking.Sockets;// Define some variables and set valuesStreamSocket clientSocket = new StreamSocket();HostName serverHost = new HostName("www.contoso.com");string serverServiceName = "https";// For simplicity, the sample omits implementation of the// NotifyUser method used to display status and error messages // Try to connect to contoso using HTTPS (port 443)try {// Call ConnectAsync method with SSLawait clientSocket.ConnectAsync(serverHost, serverServiceName, SocketProtectionLevel.Ssl);NotifyUser("Connected");}catch (Exception exception) {// If this is an unknown status it means that the error is fatal and retry will likely fail.if (SocketError.GetStatus(exception.HResult) == SocketErrorStatus.Unknown) {throw;}NotifyUser("Connect failed with error: " + exception.Message);// Could retry the connection, but for this simple example// just close the socket.clientSocket.Dispose();clientSocket = null; }// Add code to send and receive data using the clientSocket// and then close the clientSocket
使用 UpgradeToSslAsync
先不加密建立与网络服务的初始连接。应用可以发送或接收数据。然后升级连接,对此后所有通信使用 SSL/TLS。使用如下方法:
- UpgradeToSslAsync - 启动一个异步操作以升级到在 StreamSocket 对象上使用 SSL。
UpgradeToSslAsync 方法有两个参数。protectionLevel 参数表示所需的保护级别。validationHostName 参数是在升级到 SSL 时用于进行验证的远程网络目标的主机名。 通常情况下,validationHostName 将是应用最初建立连接时所使用的相同主机名。如果 protectionLevel 参数被设置为 Windows.System.Socket.SocketProtectionLevel.Ssl,当调用上述任一 UpgradeToSslAsync 方法时,StreamSocket 必须使用 SSL/TLS 用于加密。此值需要加密而且绝不允许使用 NULL 密码。
一般来说,使用 UpgradeToSslAsync 方法的顺序都是:
- 创建一个 StreamSocket。
- 如果需要在套接字上使用高级选项,请使用 StreamSocket.Control 属性获取与 StreamSocket 对象 相关联的StreamSocketControl 实例。 针对 StreamSocketControl 设置一个属性。
- 如果任何数据需要以不加密的形式进行发送和接收,则立即发送。
- 调用 UpgradeToSslAsync 方法以启动将连接升级为使用 SSL/TLS。
以下示例将会创建 StreamSocket,并尝试建立与网络服务的连接、发送一些初始数据,然后协商使用 SSL/TLS。如果协商成功,则在客户端和网络服务器之间使用 StreamSocket 的所有网络通信都将被加密。
using Windows.Networking; using Windows.Networking.Sockets; using Windows.Storage.Streams;// Define some variables and set valuesStreamSocket clientSocket = new StreamSocket();HostName serverHost = new HostName("www.contoso.com");string serverServiceName = "http";// For simplicity, the sample omits implementation of the// NotifyUser method used to display status and error messages // Try to connect to contoso using HTTP (port 80)try {// Call ConnectAsync method with a plain socketawait clientSocket.ConnectAsync(serverHost, serverServiceName, SocketProtectionLevel.PlainSocket);NotifyUser("Connected");}catch (Exception exception) {// If this is an unknown status it means that the error is fatal and retry will likely fail.if (SocketError.GetStatus(exception.HResult) == SocketErrorStatus.Unknown) {throw;}NotifyUser("Connect failed with error: " + exception.Message, NotifyType.ErrorMessage);// Could retry the connection, but for this simple example// just close the socket.clientSocket.Dispose();clientSocket = null; return;}// Now try to sent some dataDataWriter writer = new DataWriter(clientSocket.OutputStream);string hello = "Hello World ☺ ";Int32 len = (int) writer.MeasureString(hello); // Gets the UTF-8 string length.writer.WriteInt32(len);writer.WriteString(hello);NotifyUser("Client: sending hello");try {// Call StoreAsync method to store the hello messageawait writer.StoreAsync();NotifyUser("Client: sent data");writer.DetachStream(); // Detach stream, if not, DataWriter destructor will close it.}catch (Exception exception) {NotifyUser("Store failed with error: " + exception.Message);// Could retry the store, but for this simple example// just close the socket.clientSocket.Dispose();clientSocket = null; return;}// Now upgrade the client to use SSLtry {// Try to upgrade to SSLawait clientSocket.UpgradeToSslAsync(SocketProtectionLevel.Ssl, serverHost);NotifyUser("Client: upgrade to SSL completed");// Add code to send and receive data // The close clientSocket when done}catch (Exception exception) {// If this is an unknown status it means that the error is fatal and retry will likely fail.if (SocketError.GetStatus(exception.HResult) == SocketErrorStatus.Unknown) {throw;}NotifyUser("Upgrade to SSL failed with error: " + exception.Message);clientSocket.Dispose();clientSocket = null; return;}
备注
SocketProtectionLevel 枚举 有三个可能的值:
- PlainSocket - 一个未加密的纯套接字。
- Ssl - 一个必须使用 SSL/TLS 进行加密的套接字。此值需要加密而且绝不允许使用 NULL 密码。
- SslAllowNullEncryption - 一个首选使用 SSL/TLS 进行加密的套接字。该值首选使用完全加密,但允许基于服务器的配置使用 NULL 密码(即不加密)。
通常不使用 SslAllowNullEncryption 值,因为它允许使用 NULL 密码,这就意味着不加密,所以网络通信可能也不加密。SslAllowNullEncryption 值允许 SSL/TLS 协商,以根据服务器数字证书和证书颁发机构对服务器进行验证。
如果使用 SslAllowNullEncryption 值,那么实际上使用 ConnectAsync 或 UpgradeToSslAsync 协商得到的 SSL 强度可通过获取 StreamSocketinformation.ProtectionLevel 属性来确定。
相关主题
- 其他使用套接字进行连接使用套接字进行连接(使用 JavaScript 和 HTML 的 Windows 应用商店应用)如何借助 TLS/SSL 确保套接字连接的安全(使用 JavaScript 和 HTML 的 Windows 应用商店应用)如何使用高级套接字控件快速入门:使用流套接字进行连接参考SocketProtectionLevelStreamSocketStreamSocket.ConnectAsyncStreamSocket.UpgradeToSslAsyncStreamSocketinformation.ProtectionLevelWindows.Networking.Sockets
转载于:https://www.cnblogs.com/freeliver54/p/3623257.html
[转]如何借助 TLS/SSL 确保套接字连接的安全(使用 C#/VB/C++ 和 XAML 的 Windows 应用商店应用)...相关推荐
- 手机与服务器协议失败,无法连接到服务器。 协议: POP3, 端口: 110, 安全(SSL): 否, 套接字错误: 10060, 错误号: 0x800CCC0E...
无法连接到服务器. 协议: POP3, 端口: 110, 安全(SSL): 否, 套接字错误: 10060, 错误号: 0x800CCC0E0 珰甫安_UG52013.07.30浏览122次分享举报 ...
- WCF分布式开发常见错误(10):套接字连接中断,The socket connection was aborted
(使用Windows Service作为宿主的时候也会出现这样的情况,搜索的) 我们这里是自定义托管宿主,在进行WCF编程开发过程时,使用NetTcpBinding绑定协议,作为通讯协议,可能会引发这 ...
- 打开VM虚拟机,遇见问题“无法连接MKS:套接字连接次数太多;正在放弃。”
问题 "无法连接MKS:套接字连接次数太多:正在放弃." 解决办法 右键"开始" 选择"计算机管理" 在"服务"里找到V ...
- VmWare工作笔记001---弹出错误提示无法连接mks:套接字连接尝试次数太多
技术交流QQ群[JAVA,.NET,BigData,AI]:170933152 弹出错误提示无法连接mks:套接字连接尝试次数太多,这时我们点击确定按钮. 这个直接到服务中,看看有没有VMware的服 ...
- Win 7 安装VMware Workstation Pro 14出现 “Intel VT-x禁用”问题以及“无法连接 MKS: 套接字连接尝试次数太多;正在放弃”问题的实质性解决
Win 7 安装VMware Workstation Pro 14出现 "Intel VT-x禁用"问题以及"无法连接 MKS: 套接字连接尝试次数太多:正在放弃&quo ...
- 【苹果群发】内容Apple推送iMessage服务器和iOS手机操作系统之间的套接字连接PushNotificationDemo
推荐内容IMESSGAE相关 作者推荐内容 iMessage苹果推软件 *** 点击即可查看作者要求内容信息 作者推荐内容 1.家庭推内容 *** 点击即可查看作者要求内容信息 作者推荐内容 2.相册 ...
- python出现套接字创建不成功_python套接字连接在Mac上被拒绝但在Windows
这不是connection refused的重复.此问题询问MacOS和Windows之间的区别.此外,Mac上的防火墙已关闭. 我正在尝试通过套接字与设备通信.代码用python编写.出于某种原因, ...
- C# 套接字编程:Scoket,我用Scoket做的C# Windows应用程序如下:
首先请允许我做一个截图: 以上,是我服务端设计 我们知道:服务器端口数最大可以有65535个,但是实际上常用的端口才几十个,由此可以看出未定义的端口相当多.因此,我们可以通过程序随机获取一个当前可用的 ...
- android蓝牙连接回调没反应,Android蓝牙套接字连接无法正常工作
我正在开发一个单独的BluetoothHelper课程.在connectToBTDevice()方法中,调用一个新线程,在线程中,蓝牙套接字试图连接到蓝牙设备.不幸的是,它开始很好,但退出时发出警告S ...
最新文章
- 11月14号站立会议(从即日14号起到24号截至为final阶段工作期)
- 大数据薪资一再飙升 学习大数据需要哪些基础?
- 用sklearn mysql_Sklearn之Linear Regression
- Android自定义View构造函数详解
- 计算机网络与传统的通信网络的最大区别,3G,4G技术3G与传统通信技术的主要区别?主要特色?另对4G稍 爱问知识人...
- java httpresponse headres属性,Http Header里的Content-Type - 飞鸿影~ - 博客园
- 本地环境测试二级域名
- dotween的数值变化_Unity-Dotween
- adb查看android手机设备型号、品牌、机型等信息
- 手把手教你用ArcGIS做张降雨量分布专题图
- 葛道辉,李洪升,张亮,等. 轻量级神经网络架构综述
- 全国软考——软件评测师有感
- Magento后台添加商品(Simple Product和Configurable Product)
- 一版张小龙没见过的微信『高仿Flutter版微信』
- 英语听力自动断句程序
- 我的大学 --- 郭天祥【1】
- (29)Verilog实现倍频【方法二】
- 各种快捷的格式转换:图片转.ico,去图片白底
- 人工智能研究的内容:_更深入:人工智能研究的思想史
- 坐标反算c语言程序,道路坐标正反算无限个拐点计算器测量程序(新20070825)