温馨提示×

OpenSSL在Linux中的网络编程

小樊
43
2025-08-13 18:56:29
栏目: 云计算

OpenSSL是一个强大的加密库,它提供了许多用于网络编程的API

  1. 安装OpenSSL库:

在大多数Linux发行版中,OpenSSL库已经预装。如果没有,可以使用包管理器安装。例如,在基于Debian的系统上,可以使用以下命令安装:

sudo apt-get install libssl-dev 
  1. 创建一个简单的TCP服务器和客户端:

以下是一个使用OpenSSL库创建的简单TCP服务器和客户端的示例。首先,我们需要创建一个名为server.c的文件,其中包含以下代码:

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <openssl/ssl.h> #include <openssl/err.h> #define PORT 8080 void init_openssl() { SSL_load_error_strings(); OpenSSL_add_ssl_algorithms(); } void cleanup_openssl() { EVP_cleanup(); } SSL_CTX *create_context() { const SSL_METHOD *method; SSL_CTX *ctx; method = TLS_server_method(); ctx = SSL_CTX_new(method); if (!ctx) { perror("Unable to create SSL context"); ERR_print_errors_fp(stderr); exit(EXIT_FAILURE); } return ctx; } void configure_context(SSL_CTX *ctx) { SSL_CTX_set_ecdh_auto(ctx, 1); // Set the key and cert if (SSL_CTX_use_certificate_file(ctx, "server.crt", SSL_FILETYPE_PEM) <= 0) { ERR_print_errors_fp(stderr); exit(EXIT_FAILURE); } if (SSL_CTX_use_PrivateKey_file(ctx, "server.key", SSL_FILETYPE_PEM) <= 0 ) { ERR_print_errors_fp(stderr); exit(EXIT_FAILURE); } } int main(int argc, char *argv[]) { int sock; struct sockaddr_in addr; SSL_CTX *ctx; init_openssl(); ctx = create_context(); configure_context(ctx); sock = socket(AF_INET, SOCK_STREAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(PORT); addr.sin_addr.s_addr = htonl(INADDR_ANY); bind(sock, (struct sockaddr *)&addr, sizeof(addr)); listen(sock, 1); while (1) { int client = accept(sock, NULL, NULL); SSL *ssl; char reply[] = "Hello, SSL!\n"; ssl = SSL_new(ctx); SSL_set_fd(ssl, client); if (SSL_accept(ssl) <= 0) { ERR_print_errors_fp(stderr); } else { SSL_write(ssl, reply, strlen(reply)); } SSL_shutdown(ssl); SSL_free(ssl); close(client); } close(sock); SSL_CTX_free(ctx); cleanup_openssl(); return 0; } 

接下来,创建一个名为client.c的文件,其中包含以下代码:

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <openssl/ssl.h> #include <openssl/err.h> #define PORT 8080 void init_openssl() { SSL_load_error_strings(); OpenSSL_add_ssl_algorithms(); } void cleanup_openssl() { EVP_cleanup(); } SSL_CTX *create_context() { const SSL_METHOD *method; SSL_CTX *ctx; method = TLS_client_method(); ctx = SSL_CTX_new(method); if (!ctx) { perror("Unable to create SSL context"); ERR_print_errors_fp(stderr); exit(EXIT_FAILURE); } return ctx; } int main(int argc, char *argv[]) { int sock; struct sockaddr_in addr; SSL_CTX *ctx; SSL *ssl; char buf[1024]; int bytes; init_openssl(); ctx = create_context(); ssl = SSL_new(ctx); SSL_set_fd(ssl, sock); addr.sin_family = AF_INET; addr.sin_port = htons(PORT); addr.sin_addr.s_addr = inet_addr("127.0.0.1"); connect(sock, (struct sockaddr *)&addr, sizeof(addr)); if (SSL_connect(ssl) == -1) { ERR_print_errors_fp(stderr); } else { bytes = SSL_read(ssl, buf, sizeof(buf)); buf[bytes] = 0; printf("Received: %s\n", buf); } SSL_shutdown(ssl); SSL_free(ssl); close(sock); SSL_CTX_free(ctx); cleanup_openssl(); return 0; } 
  1. 编译服务器和客户端:

使用以下命令编译服务器和客户端:

gcc server.c -o server -lssl -lcrypto gcc client.c -o client -lssl -lcrypto 
  1. 运行服务器和客户端:

首先,运行服务器:

./server 

然后,在另一个终端中运行客户端:

./client 

客户端将连接到服务器并接收一条加密消息:“Hello, SSL!”。

这只是一个简单的示例,OpenSSL库提供了许多其他功能,如加密、解密、签名和验证。你可以根据自己的需求使用这些功能。

0