当前位置: 首页 > news >正文

【C++网络编程】第9篇:安全网络编程(TLS/SSL)

一、SSL与TLS的关系:从起源到现代加密

1. 历史演进

  • SSL 1.0(1994年)​:由网景公司(Netscape)设计,但因存在严重漏洞从未公开发布。
  • SSL 3.0(1996年)​:首个广泛应用的版本,支持RSA密钥交换和MD5哈希算法,但后来因POODLE漏洞被逐步淘汰。
  • TLS 1.0(1999年)​:作为SSL 3.0的升级版,由IETF标准化,引入更安全的算法(如AES),但仍保留对SSL的兼容性。
  • TLS 1.2(2008年)​:支持SHA-256、AEAD加密模式,成为现代互联网的主流协议。
  • TLS 1.3(2018年)​:最新版本,大幅简化握手流程,禁用不安全的算法(如RSA密钥交换、SHA-1),并支持前向安全性(Forward Secrecy)。

关键演进点

  • 性能优化:TLS 1.3将握手时间从2-RTT减少到1-RTT(甚至0-RTT),提升用户体验。
  • ​安全性增强:移除弱加密算法(如RC4、DES),仅保留AES、ChaCha20等现代算法。

2. 核心功能解析

2.1 加密传输
  • 对称加密:使用AES-256或ChaCha20算法加密数据流,确保窃听者无法解读内容。
  • 前向安全性:每次会话生成临时密钥(如ECDHE),即使长期私钥泄露,历史通信仍安全。
2.2 身份验证
  • 数字证书:服务器(或客户端)通过X.509证书证明身份,证书包含公钥、域名、颁发机构等信息。
  • 证书验证:浏览器检查证书是否由受信任的CA签发,是否在有效期内,以及域名是否匹配。
2.3 完整性校验
  • HMAC(哈希消息认证码):防止数据在传输中被篡改,TLS 1.2使用SHA-256等算法生成消息摘要。
  • AEAD模式:TLS 1.3将加密和完整性校验合并(如AES-GCM),提升效率。

二、证书体系:信任链的构建与验证

1. CA(证书颁发机构)

  • 角色:作为受信任的第三方,CA负责审核申请者身份并签发数字证书。
  • 商业CA:如DigiCert、GlobalSign,提供OV(组织验证)和EV(扩展验证)证书,适合企业场景。
  • 免费CA:Let’s Encrypt通过自动化颁发DV(域名验证)证书,推动HTTPS普及。

2. 证书链的工作原理

2.1 层级结构:
  • 根证书:自签名的顶级证书,预置于操作系统/浏览器中(如ISRG Root X1)。
  • 中间证书:由根证书签发的次级CA证书,用于隔离风险(根证书离线存储)。
  • 服务器证书:最终用于网站的证书,由中间证书签发。
    验证流程
    浏览器从服务器证书开始,逐级验证签名链,直到找到信任的根证书。若中间证书缺失,会导致“证书链不完整”错误。

3. 自签名证书的适用场景

  • 内部测试:开发环境中无需购买CA证书,但需手动导入到受信任列表。
  • 局限性:浏览器会显示警告,且缺乏CA的吊销机制(如OCSP),不适用于生产环境。

三、OpenSSL环境配置

1. 安装OpenSSL(通过vcpkg)

vcpkg install openssl

安装完成后,在以下目录找到openssl.exe

你的vcpkg目录\installed\x64-windows\tools\openssl

注:如果没有可以执行vcpkg install openssl[tools] --recurse重新编译
将该目录添加至环境变量或在该目录直接启动PowerShell。

openssl --version

# 输出
OpenSSL 3.4.1 11 Feb 2025 (Library: OpenSSL 3.4.1 11 Feb 2025)

2. 生成自签名证书(测试用)

C++项目/
  ├── main.cpp
  ├── SecuritySocketLayer/
  │   └── 目录为空就行

SecuritySocketLayer目录中启动PowerShell执行下列相关指令

# 生成私钥(RSA 2048位)
openssl genpkey -algorithm RSA -out server.key -pkeyopt rsa_keygen_bits:2048

# 生成证书签名请求(CSR)
openssl req -new -config "你的vcpkg目录\installed\x64-windows\tools\openssl\openssl.cnf" -key server.key -out server.csr -subj "/CN=localhost"

# 自签名证书(有效期365天)
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

生成完成后的文件结构:

C++项目/
  ├── main.cpp
  ├── SecuritySocketLayer/
  │   └── server.key
  │   └── server.csr
  │   └── server.crt

四、实现TLS服务器与客户端

1. 服务器端代码

#include <iostream>
#include <cstring>  
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "libssl.lib")
#pragma comment(lib, "libcrypto.lib")

void InitializeSSL() {
   
    SSL_load_error_strings();
    OpenSSL_add_ssl_algorithms();
}

void CleanupSSL() {
   
    EVP_cleanup();
}

int main() {
   
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2,

相关文章:

  • 【银河麒麟系统常识】命令:dotnet build(编译)
  • IsaacLab最新2025教程(7)-引入IK solver控制机器人
  • gitee 常用指令
  • 【Android】SharedMemory获取文件描述符
  • 《熔化焊接与热切割作业》备考建议
  • 怎么把 GitHub 中的 R 包项目手动安装到 conda 环境中?
  • C++ 初阶总复习 (持续更新)
  • C++11中引入的比较常用的新特性讲解(上)
  • 如何改掉经常说“然后”、“就是”、“嗯”的毛病
  • 解决Compose编译报错问题 couldn‘t find inline method Landroidx/compose/...
  • arm对应hex_ASCII与HEX对照转换表
  • 程序化广告行业(34/89):移动端特色广告与创意策略探秘
  • Uncert-CoT: 计算不确定性判断是否启用CoT
  • Slidev使用(一)安装
  • MySQL的sql语句后/G是什么作用?
  • Mysql增删改查
  • 怎样实现CAN数据的接收和发送?
  • 基于Python的3D贴图制作技术研究与实践
  • 数据库基础知识点(系列五)
  • 深入了解 Git Merge:用法、类型与合并冲突处理
  • 上海交大:关注到对教师邵某的网络举报,已成立专班开展调查
  • 首届上海老年学习课程展将在今年10月举办
  • 42岁退役军人高武生命最后时刻:在水中托举近20分钟救出落水孩童
  • 吴清:推动公募基金高质量发展的行动方案今天将会发布
  • 金融监管总局将推出8项增量政策:涉房地产金融、险资入市、稳外贸等
  • 山东滕州市醉驾交通事故肇事人员已被刑拘