C#[转]怎样借助 TLS/SSL 确保套接字连接的安全(使用 C#/VB/C++ 和 XAML 的 Windows 应用集团应用)

备注

SocketProtectionLevel 枚举 有多少个可能的价值:

 

  • PlainSocket –
    一个休加密的纯套接字。
  • Ssl – 一个必拔取SSL/TLS 举行加密的套接字。此值需要加密而且绝不允许使用 NULL 密码。
  • SslAllowNullEncryption – 一个首选使用 SSL/TLS
    举行加密的套接字。该值首选使用完全加密,但允许基于服务器的布利用
    NULL 密码(即无加密)。

常备不下 SslAllowNullEncryption 值,因为她同意用 NULL
密码,这即代表非加密,所以网络通信可能吧不加密。SslAllowNullEncryption 值允许 SSL/TLS
协商,以依照服务器数字证书和关系颁发机构对服务器举办验证。

假使以 SslAllowNullEncryption 值,那么实际上以 ConnectAsync 或 UpgradeToSslAsync 协商拿到的 SSL 强度可通过取得 StreamSocketinformation.ProtectionLevel 属性来规定。

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。
  • UpgradeToSslAsync –
    先不加密连接到网络服务。应用可发送或接收数据。然后升级总是,对之后颇具通信使用
    SSL/TLS。

使用 UpgradeToSslAsync

预先不加密建立与网络服务的起连接。应用得发送或接收数据。然后升级总是,对后享有通信使用
SSL/TLS。使用如下方法:

 

UpgradeToSslAsync 方法时有发生一定量单参数。protectionLevel 参数表示所急需的护卫级别。validationHostName 参数是于提升至 SSL
时用来开展求证的中距离网络目标的主机名。
平日状态下,validationHostName 将是用初期建立连接时所采用的平主机名。假设 protectionLevel 参数为装置也 Windows.System.Socket.SocketProtectionLevel.Ssl,当调用上述任一 UpgradeToSslAsync 方法时,StreamSocket 必须使用 SSL/TLS
用于加密。此值需要加密而且绝不允许使用 NULL 密码。

诚如的话,使用 UpgradeToSslAsync 方法的次第都是:

 

以下示例将晤面创造 StreamSocket,并尝试成立与网络服务的连、发送一些开端数据,然后协商以
SSL/TLS。假若协议成功,则于客户端和网络服务器内采纳 StreamSocket 的保有网络通信皆以为加密。

C#

C++

 

using Windows.Networking;
using Windows.Networking.Sockets;
using Windows.Storage.Streams;

    // Define some variables and set values
    StreamSocket 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 socket
        await 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 data
    DataWriter 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 message
        await 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 SSL
    try {
        // Try to upgrade to SSL
        await 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;
    }

正文转自:http://msdn.microsoft.com/zh-cn/library/windows/apps/jj150597.aspx

使用 ConnectAsync

确立和网络服务的起连接并随即研究对富有通信使用 SSL/TLS。有有限栽 ConnectAsync 方法协理传递protectionLevel 参数:

 

如果 protectionLevel 参数为装置也 Windows.Networking.Sockets.SocketProtectionLevel.Ssl,当调用上述任一ConnectAsync 方法时,StreamSocket 必须下 SSL/TLS
用于加密。此值需要加密而且绝不允许使用 NULL 密码。

一般的话,使用那么些 ConnectAsync 方法的依次都是如出一辙之。

 

以下示例将会合创 StreamSocket,并尝试创设及网络服务的连接并顿时琢磨以
SSL/TLS。要是协商成功,则以客户端和网络服务器内采纳 StreamSocket 的享有网络通信都拿受加密。

C#

C++

 

using Windows.Networking;
using Windows.Networking.Sockets;


    // Define some variables and set values
    StreamSocket 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 SSL
        await 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

而需要领悟之内容

技术

准焦点将显示在采取 StreamSocket 效率时,如何如 Windows
应用商店应用可以保障 TLS/SSL 流套接字连接。

先决条件

  • 在按大旨中,以下示例都源于 C# 和 C++。提出针对模拟接字和 SSL/TLS
    的运有一个着力的询问。

有关大旨

其他

使模拟接字举行连接

下模拟接字举办连接(使用 JavaScript 和 HTML 的 Windows
应用集团应用)

安借助 TLS/SSL 确保套接字连接的安(使用 JavaScript 和 HTML 的
Windows
应用企业应用)

怎么样使用高级套接字控件

连忙入门:使用流套接字举办连续

参考

SocketProtectionLevel

StreamSocket

StreamSocket.ConnectAsync

StreamSocket.UpgradeToSslAsync

StreamSocketinformation.ProtectionLevel

Windows.Networking.Sockets

 

 

相关文章