2025-2026-1 20231301 《信息安全设计》第八周学习总结
2025-2026-1 20231301 《信息安全设计》第八周学习总结
作业信息
| 作业 | 链接 |
|---|---|
| 作业课程 | <班级>(2025-2026-1 信息安全设计) |
| 作业要求 | <作业>(2025-2026-1 信息安全设计 预习作业要求) |
| 作业目标 | 《Windows C/C++ 加密解密实战》> 预习第十二章 |
| 作业正文 | <博客>(第八周学习总结) |
学习内容总结
第十二章:SSL-TLS编程
一、TLS协议深度解析
1. TLS 1.2握手协议详细流程
sequenceDiagram
participant Client
participant Server
Note over Client,Server: 完整握手流程
Client->>Server: ClientHello
Note left of Client: 版本、随机数<br/>密码套件<br/>压缩方法<br/>扩展
Server->>Client: ServerHello
Note right of Server: 版本、随机数<br/>选择的密码套件<br/>压缩方法
Server->>Client: Certificate
Note right of Server: 服务器证书链
Server->>Client: ServerKeyExchange
Note right of Server: 密钥交换参数<br/>(如DH参数)
Server->>Client: ServerHelloDone
Client->>Server: ClientKeyExchange
Note left of Client: 预主密钥<br/>(用服务器公钥加密)
Client->>Server: ChangeCipherSpec
Note left of Client: 切换至加密通信
Client->>Server: Finished
Note left of Client: 加密的验证数据
Server->>Client: ChangeCipherSpec
Note right of Server: 切换至加密通信
Server->>Client: Finished
Note right of Server: 加密的验证数据
Note over Client,Server: 应用数据加密传输开始
二、OpenSSL SSL/TLS编程实战
1. 完整的TLS服务器实现
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <openssl/bio.h>
// 初始化OpenSSL
void init_openssl() {
SSL_load_error_strings();
OpenSSL_add_ssl_algorithms();
}
// 清理OpenSSL
void cleanup_openssl() {
EVP_cleanup();
}
// 创建SSL上下文
SSL_CTX* create_ssl_context(const char* cert_file, const char* key_file) {
const SSL_METHOD* method = TLS_server_method();
SSL_CTX* ctx = SSL_CTX_new(method);
if (!ctx) {
ERR_print_errors_fp(stderr);
return NULL;
}
// 设置证书和私钥
if (SSL_CTX_use_certificate_file(ctx, cert_file, SSL_FILETYPE_PEM) <= 0) {
ERR_print_errors_fp(stderr);
SSL_CTX_free(ctx);
return NULL;
}
if (SSL_CTX_use_PrivateKey_file(ctx, key_file, SSL_FILETYPE_PEM) <= 0) {
ERR_print_errors_fp(stderr);
SSL_CTX_free(ctx);
return NULL;
}
// 验证私钥与证书匹配
if (!SSL_CTX_check_private_key(ctx)) {
fprintf(stderr, "证书和私钥不匹配\n");
SSL_CTX_free(ctx);
return NULL;
}
// 配置安全选项
SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 |
SSL_OP_NO_COMPRESSION);
SSL_CTX_set_cipher_list(ctx, "HIGH:!aNULL:!MD5:!RC4");
return ctx;
}
// TLS服务器主循环
void run_tls_server(SSL_CTX* ctx, int server_fd) {
struct sockaddr_in client_addr;
socklen_t client_len = sizeof(client_addr);
while (1) {
int client_fd = accept(server_fd, (struct sockaddr*)&client_addr,
&client_len);
if (client_fd < 0) {
perror("accept failed");
continue;
}
// 创建SSL对象
SSL* ssl = SSL_new(ctx);
SSL_set_fd(ssl, client_fd);
// 执行TLS握手
if (SSL_accept(ssl) <= 0) {
ERR_print_errors_fp(stderr);
} else {
handle_tls_client(ssl);
}
SSL_shutdown(ssl);
SSL_free(ssl);
close(client_fd);
}
}
// 处理TLS客户端连接
void handle_tls_client(SSL* ssl) {
char buffer[1024];
int bytes;
// 读取客户端数据
bytes = SSL_read(ssl, buffer, sizeof(buffer) - 1);
if (bytes > 0) {
buffer[bytes] = '\0';
printf("收到客户端消息: %s\n", buffer);
// 发送响应
const char* response = "Hello from TLS Server!";
SSL_write(ssl, response, strlen(response));
}
}
2. 完整的TLS客户端实现
// TLS客户端连接函数
SSL* connect_tls_client(const char* hostname, int port,
SSL_CTX* ctx) {
// 创建TCP连接
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("socket creation failed");
return NULL;
}
struct hostent* host = gethostbyname(hostname);
if (!host) {
fprintf(stderr, "无法解析主机名: %s\n", hostname);
close(sockfd);
return NULL;
}
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr = *((struct in_addr*)host->h_addr);
if (connect(sockfd, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
perror("connect failed");
close(sockfd);
return NULL;
}
// 创建SSL对象
SSL* ssl = SSL_new(ctx);
SSL_set_fd(ssl, sockfd);
// 设置SNI扩展
SSL_set_tlsext_host_name(ssl, hostname);
// 执行TLS握手
if (SSL_connect(ssl) <= 0) {
ERR_print_errors_fp(stderr);
SSL_free(ssl);
close(sockfd);
return NULL;
}
printf("TLS连接建立成功\n");
printf("使用的协议: %s\n", SSL_get_version(ssl));
printf("使用的密码套件: %s\n", SSL_get_cipher(ssl));
// 验证服务器证书
if (verify_server_certificate(ssl, hostname) != 0) {
printf("服务器证书验证失败\n");
SSL_shutdown(ssl);
SSL_free(ssl);
close(sockfd);
return NULL;
}
return ssl;
}
// 验证服务器证书
int verify_server_certificate(SSL* ssl, const char* hostname) {
X509* cert = SSL_get_peer_certificate(ssl);
if (!cert) {
fprintf(stderr, "未收到服务器证书\n");
return -1;
}
// 检查证书基本有效性
if (SSL_get_verify_result(ssl) != X509_V_OK) {
fprintf(stderr, "证书验证失败\n");
X509_free(cert);
return -1;
}
// 检查主机名匹配
if (X509_check_host(cert, hostname, strlen(hostname), 0, NULL) != 1) {
fprintf(stderr, "证书主机名不匹配\n");
X509_free(cert);
return -1;
}
printf("服务器证书验证成功\n");
// 显示证书信息
print_certificate_info(cert);
X509_free(cert);
return 0;
}
三、OpenSSL命令行TLS工具
1. 测试TLS连接
# 测试TLS服务器
openssl s_client -connect example.com:443 -servername example.com
# 详细调试信息
openssl s_client -connect example.com:443 -debug -state -tlsextdebug
# 验证证书链
openssl s_client -connect example.com:443 -showcerts -verify_return_error
# 测试特定密码套件
openssl s_client -connect example.com:443 -cipher 'ECDHE-RSA-AES128-GCM-SHA256'
2. 分析TLS连接信息
# 检查支持的密码套件
nmap --script ssl-enum-ciphers -p 443 example.com
# 检查TLS协议版本支持
openssl s_client -connect example.com:443 -tls1_2
openssl s_client -connect example.com:443 -tls1_3
# 检查证书详细信息
openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -text

posted on 2025-09-30 21:31 20231301周子昂 阅读(10) 评论(0) 收藏 举报
浙公网安备 33010602011771号