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后,浏览器终于显示“安全”,但又遇到新问题:TLS 1.2握手慢,第一次请求延迟高达500ms,并发高时服务器CPU使用率飙升。最后升级到TLS 1.3,握手延迟降到100ms以内,CPU使用率降了30%。这节我把自己从“明文裸奔”到“加密提速”的踩坑经验揉进去,用大白话vb.net教程C#教程python教程SQL教程access 2010教程
讲透SSL/TLS的核心原理,结合C#实战代码逐行讲解HTTPS、WSS、TLS 1.3的用法,以及常见坑和最佳实践,让你的网络程序既安全又快。
二、先搞懂SSL/TLS的核心:“给HTTP/WebSocket加个加密隧道”
SSL/TLS是安全传输层协议——它在应用层(HTTP、WebSocket)和传输层(TCP)之间加了一个“加密隧道”,数据在隧道里加密传输,别人看不到、改不了、伪造不了。
类比:HTTP就像你用明文写信,路上任何人都能偷看、篡改;HTTPS就像你把信放在加密的信封里,只有收件人能打开,路上的人看不到内容,也改不了(改了信封会损坏)。SSL/TLS就是这个“加密信封”的制作和打开规则。
关键概念区分:
SSL:旧版本(SSL 2.0、3.0),已经被淘汰,有安全漏洞;
TLS:SSL的升级版,现在用TLS 1.2(兼容旧系统)和TLS 1.3(最新最快);
HTTPS:HTTP over TLS,加密的HTTP;
WSS:WebSocket over TLS,加密的WebSocket;
TLS 1.3:2018年发布的最新版本,握手更快、加密更强、性能更好。
三、HTTPS:加密的HTTP,浏览器信任的安全协议
HTTPS是现在互联网的标准,所有网站都应该用HTTPS。C#的HttpClient默认支持HTTPS,不需要额外配置,但要注意TLS版本、证书验证等细节。

  1. 实战1:用HttpClient调用HTTPS接口,自定义证书验证(测试环境用)
    场景:测试环境用自签名证书,HttpClient默认会拒绝,需要自定义证书验证:
    csharp
	using System;
	using System.Net.Http;
	using System.Net.Security;
	using System.Security.Cryptography.X509Certificates;
	using System.Threading.Tasks;
	
	namespace HttpsDemo;
	
	class Program
	{
	static async Task Main(string[] args)
	{
	// 创建HttpClientHandler,自定义证书验证
	var handler = new HttpClientHandler
	{
	// 忽略证书验证(仅测试环境用,生产环境绝对不能用!)
	ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true,
	// 启用TLS 1.3和TLS 1.2,禁用旧版本
	SslProtocols = System.Security.Authentication.SslProtocols.Tls13 | System.Security.Authentication.SslProtocols.Tls12
	};
	
	using var httpClient = new HttpClient(handler);
	// 调用HTTPS接口
	var response = await httpClient.GetAsync("https://localhost:5001/api/data");
	response.EnsureSuccessStatusCode();
	var content = await response.Content.ReadAsStringAsync();
	Console.WriteLine("HTTPS响应:");
	Console.WriteLine(content);
	}
	}

代码逐行讲解:
1.ServerCertificateCustomValidationCallback:自定义证书验证逻辑——返回true表示信任所有证书,仅测试环境用,生产环境必须验证证书合法性,否则会被中间人攻击;
2.SslProtocols:指定支持的TLS版本——只启用TLS 1.3和1.2,禁用TLS 1.0、1.1(已经被淘汰,有安全漏洞);
3.HttpClientHandler:HttpClient的底层处理器,负责处理HTTP连接、证书验证、TLS配置等。
2. 实战2:用Kestrel搭建HTTPS服务器,启用TLS 1.3
场景:用ASP.NET Core搭建HTTPS服务器,启用TLS 1.3,用自签名证书测试:
csharp

	// Program.cs(ASP.NET Core 8.0顶级语句)
	var builder = WebApplication.CreateBuilder(args);
	
	// 配置Kestrel服务器,启用HTTPS和TLS 1.3
	builder.WebHost.ConfigureKestrel(options =>
	{
	options.ListenAnyIP(5001, listenOptions =>
	{
	// 用自签名证书测试(生产环境用CA颁发的证书)
	listenOptions.UseHttps("localhost.pfx", "password123");
	// 启用TLS 1.3,优先用TLS 1.3
	listenOptions.Protocols = Microsoft.AspNetCore.Server.Kestrel.Core.HttpProtocols.Http1AndHttp2AndHttp3;
	listenOptions.SslProtocols = System.Security.Authentication.SslProtocols.Tls13 | System.Security.Authentication.SslProtocols.Tls12;
	});
	});
	
	builder.Services.AddControllers();
	var app = builder.Build();
	
	app.MapControllers();
	app.Run();

生成自签名证书的命令(PowerShell):

powershell 
	New-SelfSignedCertificate -DnsName "localhost" -CertStoreLocation "cert:LocalMachineMy" -KeyAlgorithm RSA -KeyLength 2048 -KeyExportPolicy Exportable -NotAfter (Get-Date).AddYears(1)
	# 导出证书为PFX文件
	$cert = Get-ChildItem -Path "cert:LocalMachineMy$((New-SelfSignedCertificate -DnsName "localhost").Thumbprint)"
	Export-PfxCertificate -Cert $cert -FilePath "localhost.pfx" -Password (ConvertTo-SecureString "password123" -AsPlainText -Force)
  1. HTTPS握手过程:从“陌生”到“信任”的对话
    TLS 1.2握手过程(3-RTT,慢):
    1.Client Hello:客户端告诉服务器自己支持的TLS版本、加密套件、随机数;
    2.Server Hello:服务器选择TLS版本、加密套件,返回随机数、证书;
    3.Certificate Verify:客户端验证证书合法性,生成对称密钥,用服务器公钥加密发送;
    4.Finished:服务器用私钥解密得到对称密钥,双方用对称密钥加密传输数据。
    TLS 1.3握手过程(1-RTT,快):
    1.Client Hello:客户端告诉服务器自己支持TLS 1.3、加密套件、随机数、会话Ticket(如果有之前的会话);
    2.Server Hello + Finished:服务器选择TLS 1.3、加密套件,返回随机数、证书、对称密钥(用客户端公钥加密),直接发送Finished消息;
    3.Finished:客户端用对称密钥加密发送Finished消息,双方开始加密传输数据。
    TLS 1.3的优势:握手从3-RTT降到1-RTT,第一次请求延迟减少60%以上;支持0-RTT会话恢复(如果有之前的会话,不需要握手,直接发送数据);移除了旧的加密套件,只保留安全的(比如AES-GCM、ChaCha20-Poly1305);性能更好,CPU使用率更低。
    四、WSS:加密的WebSocket,实时通信的安全选择
    WSS是WebSocket over TLS,加密的WebSocket——适合实时通信场景(比如聊天、通知、游戏),避免数据被窃听、篡改。C#的System.Net.WebSockets命名空间支持WSS。
  2. 实战:用C#实现WSS服务器和客户端
    服务器端(用ASP.NET Core):
    csharp
	// Program.cs
	var builder = WebApplication.CreateBuilder(args);
	builder.WebHost.ConfigureKestrel(options =>
	{
	options.ListenAnyIP(5002, listenOptions =>
	{
	listenOptions.UseHttps("localhost.pfx", "password123");
	listenOptions.SslProtocols = System.Security.Authentication.SslProtocols.Tls13;
	});
	});
	
	var app = builder.Build();
	
	// 配置WSS端点
	app.Map("/ws", async context =>
	{
	if (!context.WebSockets.IsWebSocketRequest)
	{
	context.Response.StatusCode = StatusCodes.Status400BadRequest;
	return;
	}
	
	// 接受WSS连接
	using var webSocket = await context.WebSockets.AcceptWebSocketAsync();
	Console.WriteLine("客户端已连接");
	
	var buffer = new byte[1024 * 4];
	WebSocketReceiveResult result;
	do
	{
	// 接收WSS消息
	result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
	Console.WriteLine($"收到消息:{System.Text.Encoding.UTF8.GetString(buffer, 0, result.Count)}");
	// 发送WSS响应
	var response = System.Text.Encoding.UTF8.GetBytes("收到消息:" + System.Text.Encoding.UTF8.GetString(buffer, 0, result.Count));
	await webSocket.SendAsync(new ArraySegment<byte>(response, 0, response.Length), result.MessageType, result.EndOfMessage, CancellationToken.None);
	} while (!result.CloseStatus.HasValue);
	
	await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
	});
	
	app.Run();

客户端:
csharp

	using System;
	using System.Net.WebSockets;
	using System.Text;
	using System.Threading;
	using System.Threading.Tasks;
	
	namespace WssClientDemo;
	
	class Program
	{
	static async Task Main(string[] args)
	{
	using var client = new ClientWebSocket();
	// 忽略自签名证书(仅测试环境用)
	client.Options.RemoteCertificateValidationCallback = (sender, cert, chain, sslPolicyErrors) => true;
	// 启用TLS 1.3
	client.Options.SslProtocols = System.Security.Authentication.SslProtocols.Tls13;
	
	// 连接WSS服务器
	await client.ConnectAsync(new Uri("wss://localhost:5002/ws"), CancellationToken.None);
	Console.WriteLine("已连接到WSS服务器");
	
	// 发送消息
	var message = Encoding.UTF8.GetBytes("Hello WSS!");
	await client.SendAsync(new ArraySegment<byte>(message), WebSocketMessageType.Text, true, CancellationToken.None);
	
	// 接收响应
	var buffer = new byte[1024 * 4];
	var result = await client.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
	Console.WriteLine($"收到响应:{Encoding.UTF8.GetString(buffer, 0, result.Count)}");
	
	// 关闭连接
	await client.CloseAsync(WebSocketCloseStatus.NormalClosure, "关闭连接", CancellationToken.None);
	}
	}
  1. WSS的常见坑与注意事项
    证书验证:生产环境必须用CA颁发的证书,否则客户端会拒绝连接;
    TLS版本:优先用TLS 1.3,性能更好,延迟更低;
    心跳机制:WSS连接长时间不活动会被服务器断开,需要定期发送心跳消息(比如每隔30秒发送一个空消息);
    并发处理:服务器要支持高并发,用ASP.NET Core的Kestrel服务器,配置足够的线程数。
    五、TLS 1.3的高级特性与最佳实践
  2. 0-RTT会话恢复:第一次请求就快
    TLS 1.3支持0-RTT会话恢复——如果客户端之前和服务器建立过会话,客户端可以在第一次请求时直接发送加密数据,不需要握手,延迟降到0。C#的HttpClient默认支持0-RTT:
    csharp
	var handler = new HttpClientHandler
	{
	SslProtocols = System.Security.Authentication.SslProtocols.Tls13,
	// 启用会话恢复
	UseCookies = true,
	CookieContainer = new System.Net.CookieContainer()
	};
  1. 加密套件选择:只留安全的
    TLS 1.3移除了旧的加密套件,只保留安全的:
    AES-GCM:硬件加速,性能好,适合x86/x64平台;
    ChaCha20-Poly1305:软件实现,性能好,适合ARM平台(比如手机、树莓派);
    C#会自动根据平台选择最优的加密套件,不需要手动配置。
  2. 性能优化:HTTP/3 + TLS 1.3
    HTTP/3是基于QUIC的HTTP协议,QUIC是基于UDP的传输协议,比TCP更快,结合TLS 1.3,性能提升更明显。ASP.NET Core 8.0支持HTTP/3:
    csharp
	builder.WebHost.ConfigureKestrel(options =>
	{
	options.ListenAnyIP(5001, listenOptions =>
	{
	listenOptions.UseHttps("localhost.pfx", "password123");
	listenOptions.Protocols = Microsoft.AspNetCore.Server.Kestrel.Core.HttpProtocols.Http1AndHttp2AndHttp3;
	});
	});

六、常见坑与避坑指南
1.TLS版本过低:禁用TLS 1.0、1.1,只启用TLS 1.2和1.3——浏览器已经不支持TLS 1.0、1.1,会提示“不安全”;
2.证书不合法:生产环境用CA颁发的证书(比如Let's Encrypt免费证书),不要用自签名证书;
3.握手慢:升级到TLS 1.3,启用会话恢复,减少握手延迟;
4.CPU使用率高:用TLS 1.3(加密更快),启用硬件加速(AES-NI),减少CPU负载;
5.中间人攻击:验证证书合法性,不要忽略证书验证(测试环境除外)。
七、总结:SSL/TLS是网络安全的“标配”
HTTPS:加密的HTTP,浏览器信任的安全协议,用TLS 1.3提升性能;
WSS:加密的WebSocket,适合实时通信,避免数据被窃听;
TLS 1.3:最新最快的TLS版本,握手快、加密强、性能好,优先用;
最佳实践:用CA颁发的证书,启用TLS 1.3和HTTP/3,验证证书合法性,定期更新证书。
下一节我们会学习网络编程的安全防护:防火墙、入侵检测、DDoS防护,让你的网络程序固若金汤。

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


相关教程