本文转自: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) 都是旨在为网络通信提供身份验证和加密功能的加密协议。这些协议专门用于在发送和接收网络数据时防止发生窃听和篡改。 这些协议使用一种客户端-服务器模型进行协议交换。这些协议还会使用数字证书和证书颁发机构来验证服务器是否与其自称的身份相符。TLS 协议记录在 IETF RFC 5246 中。 早期的 SSL 协议由 Netscape Communications 记录。 SSL 通常用于指这两种协议。

StreamSocket 对象可以配置用于在客户端和服务器之间使用 SSL/TLS 进行通信。对 SSL/TLS 的支持仅限于在 SSL/TLS 协商中将 StreamSocket 对象用作客户端。当系统接受一个连接以在被创建的 StreamSocket 上启用 SSL/TLS 时,由于作为服务器的 SSL/TLS 协商没有为 StreamSocket 实现,所以StreamSocketListener 现在不能使用 SSL/TLS 用于被创建的 StreamSocket。 SSL/TLS 的客户端支持不包括使用客户端证书的功能。

有以下两种方法可以借助 SSL/TLS 确保 StreamSocket 连接的安全:

使用 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 的所有网络通信都将被加密。

C#
C++

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 的所有网络通信都将被加密。

C#
C++

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 应用商店应用)...相关推荐

  1. 手机与服务器协议失败,无法连接到服务器。 协议: POP3, 端口: 110, 安全(SSL): 否, 套接字错误: 10060, 错误号: 0x800CCC0E...

    无法连接到服务器. 协议: POP3, 端口: 110, 安全(SSL): 否, 套接字错误: 10060, 错误号: 0x800CCC0E0 珰甫安_UG52013.07.30浏览122次分享举报 ...

  2. WCF分布式开发常见错误(10):套接字连接中断,The socket connection was aborted

    (使用Windows Service作为宿主的时候也会出现这样的情况,搜索的) 我们这里是自定义托管宿主,在进行WCF编程开发过程时,使用NetTcpBinding绑定协议,作为通讯协议,可能会引发这 ...

  3. 打开VM虚拟机,遇见问题“无法连接MKS:套接字连接次数太多;正在放弃。”

    问题 "无法连接MKS:套接字连接次数太多:正在放弃." 解决办法 右键"开始" 选择"计算机管理" 在"服务"里找到V ...

  4. VmWare工作笔记001---弹出错误提示无法连接mks:套接字连接尝试次数太多

    技术交流QQ群[JAVA,.NET,BigData,AI]:170933152 弹出错误提示无法连接mks:套接字连接尝试次数太多,这时我们点击确定按钮. 这个直接到服务中,看看有没有VMware的服 ...

  5. Win 7 安装VMware Workstation Pro 14出现 “Intel VT-x禁用”问题以及“无法连接 MKS: 套接字连接尝试次数太多;正在放弃”问题的实质性解决

    Win 7 安装VMware Workstation Pro 14出现 "Intel VT-x禁用"问题以及"无法连接 MKS: 套接字连接尝试次数太多:正在放弃&quo ...

  6. 【苹果群发】内容Apple推送iMessage服务器和iOS手机操作系统之间的套接字连接PushNotificationDemo

    推荐内容IMESSGAE相关 作者推荐内容 iMessage苹果推软件 *** 点击即可查看作者要求内容信息 作者推荐内容 1.家庭推内容 *** 点击即可查看作者要求内容信息 作者推荐内容 2.相册 ...

  7. python出现套接字创建不成功_python套接字连接在Mac上被拒绝但在Windows

    这不是connection refused的重复.此问题询问MacOS和Windows之间的区别.此外,Mac上的防火墙已关闭. 我正在尝试通过套接字与设备通信.代码用python编写.出于某种原因, ...

  8. C# 套接字编程:Scoket,我用Scoket做的C# Windows应用程序如下:

    首先请允许我做一个截图: 以上,是我服务端设计 我们知道:服务器端口数最大可以有65535个,但是实际上常用的端口才几十个,由此可以看出未定义的端口相当多.因此,我们可以通过程序随机获取一个当前可用的 ...

  9. android蓝牙连接回调没反应,Android蓝牙套接字连接无法正常工作

    我正在开发一个单独的BluetoothHelper课程.在connectToBTDevice()方法中,调用一个新线程,在线程中,蓝牙套接字试图连接到蓝牙设备.不幸的是,它开始很好,但退出时发出警告S ...

最新文章

  1. 11月14号站立会议(从即日14号起到24号截至为final阶段工作期)
  2. 大数据薪资一再飙升 学习大数据需要哪些基础?
  3. 用sklearn mysql_Sklearn之Linear Regression
  4. Android自定义View构造函数详解
  5. 计算机网络与传统的通信网络的最大区别,3G,4G技术3G与传统通信技术的主要区别?主要特色?另对4G稍 爱问知识人...
  6. java httpresponse headres属性,Http Header里的Content-Type - 飞鸿影~ - 博客园
  7. 本地环境测试二级域名
  8. dotween的数值变化_Unity-Dotween
  9. adb查看android手机设备型号、品牌、机型等信息
  10. 手把手教你用ArcGIS做张降雨量分布专题图
  11. 葛道辉,李洪升,张亮,等. 轻量级神经网络架构综述
  12. 全国软考——软件评测师有感
  13. Magento后台添加商品(Simple Product和Configurable Product)
  14. 一版张小龙没见过的微信『高仿Flutter版微信』
  15. 英语听力自动断句程序
  16. 我的大学 --- 郭天祥【1】
  17. (29)Verilog实现倍频【方法二】
  18. 各种快捷的格式转换:图片转.ico,去图片白底
  19. 人工智能研究的内容:_更深入:人工智能研究的思想史
  20. 坐标反算c语言程序,道路坐标正反算无限个拐点计算器测量程序(新20070825)

热门文章

  1. 关于 TStringList.Assign - 回复 u9cm 的问题
  2. No subject
  3. 1.2.3 TCP/IP参考模型和五层参考模型
  4. hbuilder能断点吗_知乎点赞破4万!这些PPT小秘密你知道吗?
  5. 大话文本分类之Fnet
  6. 突然想到一个可以减少fc层权重数的方法
  7. 机器翻译Seq2Seq模型的启发-人工神经网络系统-诞生
  8. JavaScriptjQuery.变量作用域
  9. ​shell-7.shell 字符串的使用
  10. C# SQLite数据库 访问封装类