ZBLOG

使用C++ 写一个Windows的TLS客户端和服务器, 采用openssl加密解密

以下是一个简单的示例,展示如何使用C++和OpenSSL库来实现一个基于TLS的客户端和服务器。

首先,你需要确保已经安装了OpenSSL库,并在编译时链接到你的项目中。接下来,我们将分别实现客户端和服务器端的代码。

TLS客户端

#include <iostream>
#include <cstring>
#include <openssl/ssl.h>
#include <openssl/err.h>

int main() {
    // 初始化OpenSSL库
    SSL_library_init();
    SSL_CTX* ctx = SSL_CTX_new(SSLv23_client_method());

    // 创建SSL对象
    SSL* ssl = SSL_new(ctx);

    // 创建socket并与服务器建立连接
    int sockfd;
    // 设置服务器地址和端口号
    const char* server_addr = "127.0.0.1";
    int server_port = 8888;

    struct sockaddr_in server;
    memset(&server, 0, sizeof(server));
    
    server.sin_family = AF_INET;
    server.sin_port = htons(server_port);
    
    if (inet_pton(AF_INET, server_addr, &(server.sin_addr)) <= 0) {
        std::cerr << "Invalid address" << std::endl;
        return -1;
    }
    
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        std::cerr << "Failed to create socket" << std::endl;
        return -1;
    }
    
    if (connect(sockfd, (struct sockaddr*)&server, sizeof(server)) < 0) {
        std::cerr << "Connection failed" << std::endl;
        return -1;
   }

   // 将socket绑定到SSL对象
   SSL_set_fd(ssl, sockfd);

   // 进行TLS握手
   if (SSL_connect(ssl) < 0) {
       std::cerr << "TLS handshake failed" << std::endl;
       return -1;
   }

   // 发送和接收数据
   const char* message = "Hello from client!";
   char buffer[1024];

   SSL_write(ssl, message, strlen(message));

   int bytes = SSL_read(ssl, buffer, sizeof(buffer)-1);
   buffer[bytes] = '\0';

   std::cout << "Received: " << buffer << std::endl;

   // 关闭连接并释放资源
   SSL_shutdown(ssl);
   close(sockfd);
   
    return 0;
}

TLS服务器

#include <iostream>
#include <cstring>
#include <openssl/ssl.h>
#include <openssl/err.h>

int main() {
    // 初始化OpenSSL库
    SSL_library_init();
    OpenSSL_add_all_algorithms();
    SSL_load_error_strings();
    
    // 创建SSL上下文对象
    SSL_CTX* ctx = SSL_CTX_new(TLSv1_2_server_method());
    
    // 加载证书和私钥文件
    if (SSL_CTX_use_certificate_file(ctx, "server.crt", SSL_FILETYPE_PEM) <= 0) {
        std::cerr << "Failed to load certificate" << std::endl;
        return -1;
    }
    
    if (SSL_CTX_use_PrivateKey_file(ctx, "server.key", SSL_FILETYPE_PEM) <= 0 ) {
        std::cerr << "Failed to load private key" << std::endl;
        return -1;
    }
    
    // 创建socket并绑定端口号,监听客户端连接请求
     int sockfd;
     int port = 8888;

    struct sockaddr_in server;
    memset(&server, 0, sizeof(server));
    
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = htonl(INADDR_ANY);
    server.sin_port = htons(port);
    
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        std::cerr << "Failed to create socket" << std::endl;
        return -1;
    }
    
    if (bind(sockfd, (struct sockaddr*)&server, sizeof(server)) < 0) {
        std::cerr << "Binding failed" << std::endl;
        return -1;
   }

   if (listen(sockfd, SOMAXCONN) < 0) {
       std::cerr << "Listening failed" << std::endl;
       return -1;
   }

   // 接受客户端连接请求
   struct sockaddr_in client;
   socklen_t client_len = sizeof(client);

   int client_sockfd = accept(sockfd, (struct sockaddr*)&client, &client_len);

   // 创建SSL对象并将socket绑定到SSL对象
   SSL* ssl = SSL_new(ctx);
   
   SSL_set_fd(ssl, client_sockfd);

   // 进行TLS握手
   if (SSL_accept(ssl) <= 0) {
       std::cerr << "TLS handshake failed" << std::endl;
       return -1;
   }

   // 接收和发送数据
   char buffer[1024];
  
   int bytes = SSL_read(ssl, buffer, sizeof(buffer)-1);
   
   buffer[bytes] = '\0';
   
  
   const char* response = "Hello from server!";
   
  
 
  SSL_write(ssl,response,strlen(response));

   

// 关闭连接并释放资源
   SSL_shutdown(ssl);
   close(client_sockfd);
   close(sockfd);

    return 0;
}

在上述代码中,需要替换以下内容以符合你的实际情况:

  • server_addr:服务器地址。
  • server_port:服务器端口号。
  • server.crtserver.key:你的证书和私钥文件。

请注意,这只是一个简单的示例,用于演示如何使用OpenSSL库编写基于TLS的客户端和服务器。在实际应用中,请根据你的需求进行适当调整和改进。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=3269

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?