阅读量:1
OpenSSL是一个强大的加密库,它提供了许多用于网络编程的API
- 安装OpenSSL库:
在大多数Linux发行版中,OpenSSL库已经预装。如果没有,可以使用包管理器安装。例如,在基于Debian的系统上,可以使用以下命令安装:
sudo apt-get install libssl-dev
- 创建一个简单的TCP服务器和客户端:
以下是一个使用OpenSSL库创建的简单TCP服务器和客户端的示例。首先,我们需要创建一个名为server.c的文件,其中包含以下代码:
#include
#include
#include
#include
#include
#include
#include
#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
#include
#include
#include
#include
#include
#include
#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库提供了许多其他功能,如加密、解密、签名和验证。你可以根据自己的需求使用这些功能。
以上就是关于“OpenSSL在Linux中的网络编程”的相关介绍,筋斗云是国内较早的云主机应用的服务商,拥有10余年行业经验,提供丰富的云服务器、租用服务器等相关产品服务。云服务器资源弹性伸缩,主机vCPU、内存性能强悍、超高I/O速度、故障秒级恢复;电子化备案,提交快速,专业团队7×24小时服务支持!
简单好用、高性价比云服务器租用链接:https://www.jindouyun.cn/product/cvm