VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > c#编程 >
  • C#网络编程SSL/TLS协议(HTTPS、WSS、TLS 1.3)

第17章 加密与解密
17.2 SSL/TLS协议(HTTPS、WSS、TLS 1.3)
一、为什么要搞SSL/TLS?我踩过的“明文裸奔坑”
刚上线一个HTTP接口,用来接收用户的支付信息——结果用Wireshark抓包一看,用户的银行卡号、密码全是明文,吓得我连夜改成HTTPS。改成HTTPS后,抓包只能看到乱码,再也不用担心数据泄露了。这节我vb.net教程C#教程python教程SQL教程access 2010教程把自己从“明文传输”到“加密传输”的踩坑经验揉进去,用大白话讲透SSL/TLS协议的原理,结合C#代码逐行讲解HTTPS、WSS的实战用法,以及TLS 1.3的新特性,让你的网络程序像银行系统一样安全。

二、先搞懂SSL/TLS的核心:“加密握手+安全传输”
SSL/TLS是在TCP之上的加密协议——先通过握手协商加密方式和密钥,再用协商好的密钥加密传输数据,确保数据在传输过程中不被窃取、篡改、冒充。

类比:SSL/TLS就像你和朋友打电话——先拨通电话(TCP握手),然后说“我们用暗号说话吧”(SSL/TLS握手,协商加密方式和密钥),之后所有对话都用暗号(加密传输),即使被别人偷听,也听不懂内容。

三、SSL/TLS握手流程:从“陌生”到“信任”
SSL/TLS握手的核心是验证服务器身份、协商加密套件、交换对称密钥,以TLS 1.2为例,握手流程分为4步:

客户端问候:客户端向服务器发送支持的SSL/TLS版本、加密套件列表、随机数;

服务器问候:服务器选择SSL/TLS版本、加密套件,发送随机数、服务器证书(包含公钥);

证书验证:客户端验证服务器证书的真实性(比如是否由可信CA签发,是否过期,域名是否匹配);

密钥交换:客户端用服务器的公钥加密对称密钥,发送给服务器;服务器用私钥解密得到对称密钥;

会话加密:双方用对称密钥加密后续的所有数据。

TLS 1.3优化:握手次数从2-RTT(往返时间)降到1-RTT甚至0-RTT,握手时间从几百毫秒降到几十毫秒,性能提升50%以上。

四、HTTPS实战:用C#调用HTTPS接口
HTTPS是HTTP+SSL/TLS的组合,用SSL/TLS加密HTTP请求和响应,确保数据安全。C#中用HttpClient调用HTTPS接口非常简单,下面是实战代码:

  1. 基础用法:调用HTTPS接口

    csharp

using System;

using System.Net.Http;

using System.Threading.Tasks;

 

// 顶级语句(.NET 6+支持)

var url = "https://api.example.com/user/1";

 

// 创建HttpClient(注意:HttpClient应该单例,不要每次创建新的)

using var httpClient = new HttpClient();

 

try

{

    // 发送GET请求

    var response = await httpClient.GetAsync(url);

    // 确保请求成功

    response.EnsureSuccessStatusCode();

    // 读取响应内容

    var content = await response.Content.ReadAsStringAsync();

    Console.WriteLine("HTTPS响应内容:");

    Console.WriteLine(content);

}

catch (HttpRequestException ex)

{

    Console.WriteLine($"请求失败:{ex.Message}");

}

代码逐行讲:

HttpClient单例:HttpClient是线程安全的,应该单例使用,不要每次创建新的——每次创建新的HttpClient会占用大量端口,导致端口耗尽;

GetAsync:发送HTTPS GET请求,自动处理SSL/TLS握手,加密传输数据;

EnsureSuccessStatusCode:如果响应状态码不是200-299,抛出HttpRequestException,方便处理错误;

ReadAsStringAsync:异步读取响应内容,适合大响应,不会阻塞线程。

  1. 进阶用法:忽略证书错误(开发环境用)
    开发环境中,有时候服务器用的是自签名证书,HttpClient会抛出证书验证错误,这时候可以忽略证书错误(生产环境绝对不能用):

    csharp

using var handler = new HttpClientHandler();

// 忽略证书错误(开发环境用,生产环境禁用)

handler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true;

 

using var httpClient = new HttpClient(handler);

// 后续请求和之前一样...

代码逐行讲:

ServerCertificateCustomValidationCallback:自定义证书验证回调,返回true表示信任所有证书,不管是否有效——生产环境必须验证证书,否则会被中间人攻击。

  1. 高级用法:创建HTTPS服务器(Kestrel)
    用ASP.NET Core创建HTTPS服务器,配置证书:

    csharp

      
var builder = WebApplication.CreateBuilder(args);

 

// 配置Kestrel使用HTTPS

builder.WebHost.ConfigureKestrel(options =>

{

    options.ListenAnyIP(5001, listenOptions =>

    {

        // 使用自签名证书(开发环境用)

        listenOptions.UseHttps("localhost.pfx", "password123");

        // 或者使用系统证书存储的证书

        // listenOptions.UseHttps(storeName: StoreName.My, storeLocation: StoreLocation.LocalMachine, subjectName: "example.com");

    });

});

 

var app = builder.Build();

 

app.MapGet("/", () => "Hello HTTPS!");

 

app.Run();

代码逐行讲:

UseHttps:配置Kestrel使用HTTPS,参数可以是PFX证书文件路径和密码,或者系统证书存储的证书;

自签名证书:开发环境可以用dotnet dev-certs https命令生成自签名证书,生产环境必须使用CA签发的证书。

五、WSS实战:用C#连接WSS服务器
WSS是WebSocket+SSL/TLS的组合,用SSL/TLS加密WebSocket的消息传输,适合实时通信(比如聊天、通知)。C#中用System.Net.WebSockets.ClientWebSocket连接WSS服务器:

  1. 连接WSS服务器,发送接收消息

    csharp

      
using System;

using System.Net.WebSockets;

using System.Text;

using System.Threading;

using System.Threading.Tasks;

 

// 顶级语句

var uri = new Uri("wss://echo.websocket.org"); // 公共WSS测试服务器

using var clientWebSocket = new ClientWebSocket();

 

try

{

    // 连接WSS服务器

    await clientWebSocket.ConnectAsync(uri, CancellationToken.None);

    Console.WriteLine("已连接到WSS服务器");

 

    // 发送消息

    var message = "Hello WSS!";

    var buffer = Encoding.UTF8.GetBytes(message);

    await clientWebSocket.SendAsync(

        new ArraySegment<byte>(buffer),

        WebSocketMessageType.Text,

        endOfMessage: true,

        CancellationToken.None);

    Console.WriteLine($"发送消息:{message}");

 

    // 接收消息

    var receiveBuffer = new byte[1024];

    var result = await clientWebSocket.ReceiveAsync(

        new ArraySegment<byte>(receiveBuffer),

        CancellationToken.None);

    var receivedMessage = Encoding.UTF8.GetString(receiveBuffer, 0, result.Count);

    Console.WriteLine($"接收消息:{receivedMessage}");

 

    // 关闭连接

    await clientWebSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "关闭连接", CancellationToken.None);

}

catch (WebSocketException ex)

{

    Console.WriteLine($"WebSocket错误:{ex.Message}");

}

代码逐行讲:

ClientWebSocket:C#内置的WebSocket客户端,支持WSS;

ConnectAsync:连接WSS服务器,自动处理SSL/TLS握手;

SendAsync:发送消息,WebSocketMessageType.Text表示文本消息,endOfMessage: true表示这是完整的消息;

ReceiveAsync:接收消息,返回的Result包含消息类型、是否结束、接收的字节数;

CloseAsync:正常关闭连接,发送关闭帧。

六、TLS 1.3:更快、更安全的SSL/TLS
TLS 1.3是2018年发布的SSL/TLS新版本,对比TLS 1.2有以下核心优化:

握手更快:从2-RTT降到1-RTT甚至0-RTT,握手时间从几百毫秒降到几十毫秒;

更安全:移除了所有不安全的加密套件(比如RC4、3DES),只支持AES-GCM、ChaCha20-Poly1305等安全套件;

更简单:握手流程简化,减少了冗余步骤,代码实现更简单,漏洞更少;

0-RTT复用:重复连接时,不需要重新握手,直接发送数据,性能提升显著。

  1. C#启用TLS 1.3
    在C#中,.NET 5+支持TLS 1.3,只需要在HttpClientHandler或SslStream中设置SslProtocols.Tls13:

    csharp

using var handler = new HttpClientHandler();

// 启用TLS 1.3,同时兼容TLS 1.2

handler.SslProtocols = SslProtocols.Tls13 | SslProtocols.Tls12;

 

using var httpClient = new HttpClient(handler);

// 后续请求和之前一样...

注意:服务器必须支持TLS 1.3,否则会自动降级到TLS 1.2。现在大部分主流服务器(Nginx、Apache、Kestrel)都已经支持TLS 1.3。

七、基础知识拓展

  1. 证书类型与验证

证书类型:

DV证书(域名验证):只验证域名所有权,颁发快,适合个人网站;

OV证书(组织验证):验证组织身份,适合企业网站;

EV证书(增强验证):最高级别的验证,浏览器地址栏会显示绿色企业名称,适合银行、电商网站;

证书链验证:服务器证书由CA签发,CA的证书由根CA签发,根CA证书内置在浏览器中——验证时会从服务器证书往上追溯,直到根CA证书,确保整个链都是可信的;

常见证书错误:证书过期、域名不匹配、证书链不完整、证书被吊销——这些错误都会导致浏览器或客户端拒绝连接。

  1. 常见SSL/TLS优化技巧

启用OCSP Stapling:服务器把证书的吊销状态(OCSP响应)一起发送给客户端,减少客户端的OCSP查询时间,提升握手速度;

会话复用:复用之前的SSL/TLS会话,不需要重新握手,提升性能;

启用HSTS:强制浏览器用HTTPS访问网站,防止HTTP劫持;

选择高效的加密套件:优先选择AES-GCM、ChaCha20-Poly1305等加密套件,这些套件是AEAD(认证加密带关联数据),同时提供加密和完整性验证,性能更高。

  1. 排查SSL/TLS错误的工具

Wireshark:抓包分析SSL/TLS握手流程,查看是否有握手失败、证书错误;

OpenSSL:用openssl s_client -connect example.com:443命令测试SSL/TLS连接,查看证书信息、加密套件;

SSL Labs Server Test:在线测试服务器的SSL/TLS配置,给出安全评分和优化建议(https://www.ssllabs.com/ssltest/)。

八、总结:SSL/TLS是网络安全的“护城河”

HTTPS:用SSL/TLS加密HTTP请求和响应,确保数据安全,是所有网站的标配;

WSS:用SSL/TLS加密WebSocket消息,适合实时通信场景;

TLS 1.3:更快、更安全的SSL/TLS版本,应该优先启用;

最佳实践:使用CA签发的证书,启用TLS 1.3,禁用旧的协议(SSL 3.0、TLS 1.0、TLS 1.1),启用HSTS和OCSP Stapling。

下一节我们会学习网络编程的高级特性:微服务通信、API网关、服务发现,让你的网络程序更灵活、更可扩展。

 本站原创,转载请注明出处:https://www.xin3721.com/ArticlecSharp/c49533.ht


相关教程