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坑:从浏览器红叉到性能飙升
刚做第一个HTTPS网站时,用了自签名证书,结果浏览器显示红叉,用户不敢访问,第一天流失了30%的用户;后来花2000块买了正规证书,又没配置证书链,导致IE11等旧浏览器还是显示“不安全”;再后来用TLS 1.0,被安全扫描出“POODLE漏洞”,要求72小时整改,否则停止服务;最后升级到TLS 1.3,网站加载速度从2秒降到0.5秒,性能提升4倍,同时安全评分从C升到A+。这节我把自己从“浏览器红叉”到“TLS 1.3性能飙升”的踩坑经验揉进去,用大白话讲透SSL/TLS的核心原理,HTTPS的握手过程,WSS的实现,TLS 1.3的优化,结合C#实战代码逐行讲解ASP.NET Core HTTPS配置、SignalR WSS实现、TLS 1.3启用,以及常见坑和最vb.net教程C#教程python教程SQL教程access 2010教程佳实践,让你的网站既安全又快。
二、大白话讲透SSL/TLS:“给网络通信加个‘加密隧道’”
SSL/TLS是一种安全协议,用于在客户端和服务器之间建立加密隧道,保证数据传输的机密性、完整性和真实性——就像你和朋友用加密电话聊天,别人听不到你们说什么,也不能篡改你们的对话,还能确认对方是真的朋友,不是骗子。
核心作用(拓展知识)
1.机密性:用对称加密加密传输的数据,防止被窃听;
2.完整性:用哈希算法验证数据,防止被篡改;
3.真实性:用数字证书验证服务器身份,防止被钓鱼。
HTTPS的本质:“HTTP + SSL/TLS”
HTTPS就是在HTTP协议上套了一层SSL/TLS加密隧道,它的核心是握手过程——客户端和服务器协商加密算法、交换密钥、验证身份,然后用对称加密传输数据。
TLS 1.3 vs TLS 1.2:性能提升10倍的秘密
TLS 1.3是2018年发布的最新版本,比TLS 1.2快很多,核心优化是:
1.握手次数从3次降到1次:TLS 1.2需要3次握手,耗时100ms;TLS 1.3只需要1次握手,耗时10ms;
2.删除了不安全的算法:比如RC4、3DES,只保留AES-GCM、ChaCha20等安全算法;
3.0-RTT握手:客户端第二次连接服务器时,不需要重新握手,直接发送数据,耗时0ms;
4.加密更早:TLS 1.3在握手的第一个消息就开始加密,防止中间人攻击。
类比:TLS 1.2就像你去银行取钱,需要填表格、排队、验证身份,耗时10分钟;TLS 1.3就像你用手机银行取钱,直接输入密码,耗时1分钟;0-RTT就像你用指纹支付,直接完成,耗时0秒。
三、实战1:ASP.NET Core配置HTTPS(从开发到生产)
HTTPS是现代网站的标配,ASP.NET Core从3.0开始默认支持HTTPS,下面讲从开发到生产的完整配置。

  1. 开发环境:用自签名证书
    ASP.NET Core默认会生成自签名证书,也可以自己生成:
    bash
	# 生成自签名证书,存储到当前用户的证书存储区
	dotnet dev-certs https --trust

--trust:信任证书,浏览器不会显示红叉(仅开发环境)。
2. ASP.NET Core HTTPS配置(Program.cs)
csharp

	using Microsoft.AspNetCore.Server.Kestrel.Core;
	
	var builder = WebApplication.CreateBuilder(args);
	
	// 1. 配置Kestrel服务器的HTTPS
	builder.WebHost.ConfigureKestrel(options =>
	{
	// 监听443端口(HTTPS默认端口)
	options.ListenAnyIP(443, listenOptions =>
	{
	// 配置HTTPS证书
	listenOptions.UseHttps(options =>
	{
	// 从证书存储区加载证书(开发环境)
	options.ServerCertificate = builder.Configuration.GetValue<string>("Certificates:Path") != null
	? new System.Security.Cryptography.X509Certificates.X509Certificate2(
	builder.Configuration.GetValue<string>("Certificates:Path"),
	builder.Configuration.GetValue<string>("Certificates:Password"))
	: null;
	// 启用TLS 1.3和TLS 1.2,禁用旧版本
	options.SslProtocols = System.Security.Authentication.SslProtocols.Tls13 | System.Security.Authentication.SslProtocols.Tls12;
	// 启用OCSP Stapling,减少证书验证时间
	options.EnableOcspStapling = true;
	// 配置加密套件,优先用安全的AES-GCM
	options.CipherSuitesPolicy = new CipherSuitesPolicy(
	new[] {
	TlsCipherSuite.TLS_AES_256_GCM_SHA384,
	TlsCipherSuite.TLS_CHACHA20_POLY1305_SHA256,
	TlsCipherSuite.TLS_AES_128_GCM_SHA256
	});
	});
	});
	// 监听80端口(HTTP),重定向到HTTPS
	options.ListenAnyIP(80);
	});
	
	// 2. 添加HTTPS重定向中间件
	builder.Services.AddHttpsRedirection(options =>
	{
	options.HttpsPort = 443;
	options.RedirectStatusCode = StatusCodes.Status301MovedPermanently; // 永久重定向,利于SEO
	});
	
	// 3. 添加HSTS(HTTP Strict Transport Security),强制浏览器用HTTPS
	builder.Services.AddHsts(options =>
	{
	options.Preload = true; // 提交到HSTS预加载列表,新浏览器默认用HTTPS
	options.IncludeSubDomains = true; // 所有子域名都用HTTPS
	options.MaxAge = TimeSpan.FromDays(365); // 浏览器记住1年
	});
	
	builder.Services.AddControllersWithViews();
	
	var app = builder.Build();
	
	// 4. 启用HSTS(仅生产环境)
	if (!app.Environment.IsDevelopment())
	{
	app.UseHsts();
	}
	
	// 5. 启用HTTPS重定向
	app.UseHttpsRedirection();
	
	app.UseStaticFiles();
	app.UseRouting();
	app.UseAuthorization();
	
	app.MapControllerRoute(
	name: "default",
	pattern: "{controller=Home}/{action=Index}/{id?}");
	
	app.Run();

代码逐行讲解:
1.Kestrel配置:
1.ListenAnyIP(443):监听443端口,HTTPS默认端口;
2.UseHttps:配置HTTPS证书,生产环境从文件加载证书,开发环境用默认证书;
3.SslProtocols:仅启用TLS 1.3和TLS 1.2,禁用TLS 1.0和1.1(有漏洞);
4.EnableOcspStapling:启用OCSP Stapling,服务器提前获取证书的有效性,减少浏览器验证证书的时间;
5.CipherSuitesPolicy:配置加密套件,优先用安全的AES-GCM和ChaCha20(适合移动设备);
2.HTTPS重定向:把HTTP请求重定向到HTTPS,用301永久重定向,利于SEO;
3.HSTS:强制浏览器用HTTPS,即使用户输入HTTP,浏览器也会自动跳转到HTTPS,防止中间人攻击;
1.Preload:提交到HSTS预加载列表,新浏览器默认用HTTPS访问你的网站;
2.IncludeSubDomains:所有子域名都用HTTPS,比如blog.example.com;
3.MaxAge:浏览器记住1年,1年内访问你的网站都会用HTTPS。
我踩过的坑:开发环境用自签名证书,生产环境忘记配置正规证书,导致浏览器显示红叉——生产环境必须用CA颁发的正规证书,不能用自签名证书!
3. 生产环境:用Let's Encrypt免费证书
Let's Encrypt是免费的CA,提供90天有效期的证书,用Certbot自动续期:
bash

	# 安装Certbot
	sudo apt install certbot python3-certbot-nginx
	# 生成证书,自动配置Nginx
	sudo certbot --nginx -d example.com -d www.example.com
	# 自动续期证书
	sudo certbot renew --dry-run

拓展知识:数字证书的验证过程
浏览器验证服务器证书的过程:
1.服务器发送证书给客户端;
2.客户端验证证书的有效期、签名、域名;
3.客户端验证证书链,从服务器证书到根CA证书;
4.客户端用根CA证书验证服务器证书的签名,确保证书是真的;
5.如果验证通过,客户端和服务器开始加密通信。
四、实战2:WSS(WebSocket over TLS)实现实时通信
WSS是WebSocket over TLS,就是加密的WebSocket,适合实时通信场景(比如聊天、实时监控),比HTTP更高效,因为是长连接,不需要每次请求都握手。

  1. ASP.NET Core SignalR实现WSS
    SignalR是ASP.NET Core的实时通信库,支持WSS。
    步骤1:创建SignalR Hub
    csharp
	// ChatHub.cs
	using Microsoft.AspNetCore.SignalR;
	
	namespace WssDemo.Hubs;
	
	public class ChatHub : Hub
	{
	// 客户端调用这个方法发送消息
	public async Task SendMessage(string user, string message)
	{
	// 把消息发送给所有客户端
	await Clients.All.SendAsync("ReceiveMessage", user, message);
	}
	
	// 客户端连接时触发
	public override async Task OnConnectedAsync()
	{
	await Clients.Caller.SendAsync("ReceiveMessage", "系统", "欢迎加入聊天!");
	await base.OnConnectedAsync();
	}
	
	// 客户端断开连接时触发
	public override async Task OnDisconnectedAsync(Exception? exception)
	{
	await Clients.Caller.SendAsync("ReceiveMessage", "系统", "已断开连接!");
	await base.OnDisconnectedAsync(exception);
	}
	}
步骤2:配置SignalR(Program.cs)
csharp 
	// 在Program.cs中添加SignalR
	builder.Services.AddSignalR();
	
	// 在app.MapHub<ChatHub>("/chatHub");之前添加
	app.MapHub<ChatHub>("/chatHub");

步骤3:客户端连接WSS(JavaScript)
html

	<!-- wwwroot/index.html -->
	<!DOCTYPE html>
	<html>
	<head>
	<title>WSS聊天</title>
	<script src="https://cdnjs.cloudflare.com/ajax/libs/microsoft-signalr/7.0.0/signalr.min.js"></script>
	</head>
	<body>
	<input type="text" id="userInput" placeholder="用户名" />
	<input type="text" id="messageInput" placeholder="消息" />
	<button onclick="sendMessage()">发送</button>
	<div id="messages"></div>
	
	<script>
	// 连接WSS,注意URL是wss://,不是ws://
	const connection = new signalR.HubConnectionBuilder()
	.withUrl("wss://localhost:443/chatHub")
	.withAutomaticReconnect() // 自动重连
	.build();
	
	// 接收消息
	connection.on("ReceiveMessage", (user, message) => {
	const div = document.createElement("div");
	div.textContent = `${user}: ${message}`;
	document.getElementById("messages").appendChild(div);
	});
	
	// 启动连接
	connection.start().catch(err => console.error(err.toString()));
	
	// 发送消息
	function sendMessage() {
	const user = document.getElementById("userInput").value;
	const message = document.getElementById("messageInput").value;
	connection.invoke("SendMessage", user, message).catch(err => console.error(err.toString()));
	}
	</script>
	</body>
	</html>

代码逐行讲解:
1.withUrl("wss://localhost:443/chatHub"):连接WSS,URL必须是wss://,不是ws://,否则浏览器会阻止;
2.withAutomaticReconnect():自动重连,客户端断开连接后自动尝试重连;
3.connection.on("ReceiveMessage"):接收服务器发送的消息;
4.connection.invoke("SendMessage"):调用服务器的SendMessage方法,发送消息。
我踩过的坑:开发环境用自签名证书,浏览器阻止WSS连接,因为证书不被信任——解决方法是在浏览器中导入自签名证书,或者在开发环境中用http://localhost:5000/chatHub(ws://),但生产环境必须用wss://。
2. 测试WSS连接
用浏览器打开https://localhost:443,输入用户名和消息,点击发送,就能看到实时聊天效果。用Chrome开发者工具的“Network”标签,选择“WS”,可以看到WSS连接的状态和消息。
五、实战3:启用TLS 1.3,性能提升10倍
TLS 1.3比TLS 1.2快很多,下面讲如何在ASP.NET Core中启用TLS 1.3,以及如何测试。

  1. 启用TLS 1.3(Program.cs)
    在Kestrel配置中添加:
    csharp
    options.SslProtocols = System.Security.Authentication.SslProtocols.Tls13 | System.Security.Authentication.SslProtocols.Tls12;
  2. 测试TLS 1.3
    用openssl命令测试:
    bash
	# 测试TLS 1.3
	openssl s_client -connect example.com:443 -tls1_3
	# 测试TLS 1.2
	openssl s_client -connect example.com:443 -tls1_2

用在线工具测试:SSL Labs的SSL Test(https://www.ssllabs.com/ssltest/),可以测试你的网站的TLS版本、证书、加密套件,给出安全评分。
拓展知识:0-RTT握手的作用
0-RTT握手是TLS 1.3的特性,客户端第二次连接服务器时,不需要重新握手,直接发送数据,耗时0ms——适合频繁连接的场景(比如手机APP),性能提升非常明显。
六、总结:SSL/TLS最佳实践

  1. 禁用旧版本的TLS
    禁用TLS 1.0和1.1,因为它们有漏洞(比如POODLE、BEAST),只启用TLS 1.3和TLS 1.2。
  2. 使用HSTS
    启用HSTS,强制浏览器用HTTPS,防止中间人攻击,提交到HSTS预加载列表。
  3. 使用OCSP Stapling
    启用OCSP Stapling,减少浏览器验证证书的时间,提升网站加载速度。
  4. 使用安全的加密套件
    优先用AES-GCM、ChaCha20等安全的加密套件,禁用RC4、3DES等不安全的加密套件。
  5. 定期更新证书
    证书有效期不要超过90天(Let's Encrypt的证书是90天),自动续期,避免证书过期导致网站无法访问。
  6. 测试TLS配置
    用SSL Labs的SSL Test定期测试你的网站的TLS配置,确保安全评分是A+。
    TLS 1.3 vs TLS 1.2对比:
特性 TLS 1.3 TLS 1.2
握手时间 10ms(1次握手) 100ms(3次握手)
0-RTT握手 支持 不支持
加密套件 仅保留安全的算法 包含不安全的算法
性能 快10倍 一般
安全性 高(无已知漏洞) 中(有已知漏洞)

下一节我们会学习网络编程的安全防护:防火墙、入侵检测、DDoS防护,让你的网站更安全。

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


相关教程