• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

twilight0966

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

2025-2026-1 20231301 《信息安全设计》第八周学习总结

2025-2026-1 20231301 《信息安全设计》第八周学习总结

目录
  • 作业信息
  • 学习内容总结
    • 一、TLS协议深度解析
    • 二、OpenSSL SSL/TLS编程实战
    • 三、OpenSSL命令行TLS工具

作业信息

作业 链接
作业课程 <班级>(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

截屏2025-09-30 下午9.30

posted on 2025-09-30 21:31  20231301周子昂  阅读(10)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3