OpenSSL是一个强大的加密库,它提供了许多用于网络编程的API
在大多数Linux发行版中,OpenSSL库已经预装。如果没有,可以使用包管理器安装。例如,在基于Debian的系统上,可以使用以下命令安装:
sudo apt-get install libssl-dev
以下是一个使用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;
}
使用以下命令编译服务器和客户端:
gcc server.c -o server -lssl -lcrypto
gcc client.c -o client -lssl -lcrypto
首先,运行服务器:
./server
然后,在另一个终端中运行客户端:
./client
客户端将连接到服务器并接收一条加密消息:“Hello, SSL!”。
这只是一个简单的示例,OpenSSL库提供了许多其他功能,如加密、解密、签名和验证。你可以根据自己的需求使用这些功能。