在C语言中,使用socket进行SSL/TLS加密通信需要使用第三方库,如OpenSSL。下面是一个简单的示例,展示了如何使用OpenSSL库创建一个SSL/TLS客户端和服务器。
-
首先,确保已经安装了OpenSSL库。在大多数Linux发行版中,可以使用包管理器安装,例如:
sudo apt-get install libssl-dev
-
创建一个SSL/TLS服务器:
#include#include #include #include #include #include #include #include #define PORT 8443 #define BUFFER_SIZE 1024 int main() { SSL_CTX *ctx = NULL; SSL *ssl = NULL; int server_fd, client_fd; struct sockaddr_in server_addr, client_addr; socklen_t addr_len = sizeof(client_addr); char buffer[BUFFER_SIZE]; // 初始化SSL上下文 SSL_library_init(); SSL_load_error_strings(); OpenSSL_add_all_algorithms(); ctx = SSL_CTX_new(TLSv1_2_client_method()); if (!ctx) { fprintf(stderr, "Failed to create SSL context\n"); return 1; } // 创建socket server_fd = socket(AF_INET, SOCK_STREAM, 0); if (server_fd < 0) { perror("socket"); return 1; } // 配置服务器地址 memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = INADDR_ANY; server_addr.sin_port = htons(PORT); // 绑定并监听socket if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { perror("bind"); return 1; } if (listen(server_fd, 5) < 0) { perror("listen"); return 1; } printf("Server listening on port %d\n", PORT); // 接受客户端连接 client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &addr_len); if (client_fd < 0) { perror("accept"); return 1; } // 创建SSL对象 ssl = SSL_new(ctx); if (!ssl) { fprintf(stderr, "Failed to create SSL object\n"); return 1; } // 绑定socket到SSL对象 SSL_set_fd(ssl, client_fd); // 建立SSL连接 if (SSL_accept(ssl) <= 0) { fprintf(stderr, "Failed to establish SSL connection\n"); return 1; } // 读取并打印客户端发送的数据 while (1) { int len = SSL_read(ssl, buffer, BUFFER_SIZE); if (len > 0) { printf("Received from client: %s\n", buffer); } else if (len == 0) { break; } else { perror("SSL_read"); break; } } // 清理资源 SSL_free(ssl); SSL_CTX_free(ctx); close(client_fd); close(server_fd); return 0; }
- 创建一个SSL/TLS客户端:
#include#include #include #include #include #include #include #include #define PORT 8443 #define BUFFER_SIZE 1024 int main() { SSL_CTX *ctx = NULL; SSL *ssl = NULL; int client_fd; struct sockaddr_in server_addr; char buffer[BUFFER_SIZE]; // 初始化SSL上下文 SSL_library_init(); SSL_load_error_strings(); OpenSSL_add_all_algorithms(); ctx = SSL_CTX_new(TLSv1_2_client_method()); if (!ctx) { fprintf(stderr, "Failed to create SSL context\n"); return 1; } // 创建socket client_fd = socket(AF_INET, SOCK_STREAM, 0); if (client_fd < 0) { perror("socket"); return 1; } // 配置服务器地址 memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); server_addr.sin_port = htons(PORT); // 连接到服务器 if (connect(client_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { perror("connect"); return 1; } // 创建SSL对象 ssl = SSL_new(ctx); if (!ssl) { fprintf(stderr, "Failed to create SSL object\n"); return 1; } // 绑定socket到SSL对象 SSL_set_fd(ssl, client_fd); // 建立SSL连接 if (SSL_connect(ssl) <= 0) { fprintf(stderr, "Failed to establish SSL connection\n"); return 1; } // 向服务器发送数据 const char *message = "Hello, server!"; SSL_write(ssl, message, strlen(message)); // 读取并打印服务器发送的数据 while (1) { int len = SSL_read(ssl, buffer, BUFFER_SIZE); if (len > 0) { printf("Received from server: %s\n", buffer); } else if (len == 0) { break; } else { perror("SSL_read"); break; } } // 清理资源 SSL_free(ssl); SSL_CTX_free(ctx); close(client_fd); return 0; }
- 编译并运行服务器和客户端:
对于服务器:
gcc server.c -o server -lssl -lcrypto ./server
对于客户端:
gcc client.c -o client -lssl -lcrypto ./client
现在,服务器和客户端应该通过SSL/TLS加密进行通信。请注意,这个示例仅用于演示目的,实际应用中可能需要更多的错误处理和功能。