gpt4 book ai didi

c++ - 使用 openssl 封装数据包

转载 作者:行者123 更新时间:2023-11-28 05:35:22 29 4
gpt4 key购买 nike

我想开发一个 ssl 服务器,以在 C++ 中使用 Openssl 创建安全连接。但是我收到了封装在另一个协议(protocol)数据包中的 Client Hello 消息。示例数据包:

Simple TCP Packet =  TCP Headers | TCP Data 
TCP Data = Protocol Headers | Protocol Data | Client Hello

如何从数据包中提取 Client Hello 以及如何在 Openssl accept 中使用它?

我的代码:

#include <cstdlib>
#include <iostream>

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

#include <openssl/rand.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <unistd.h>

using namespace std;

int main() {
/*
------------------ START Initialize Server ------------------
*/

int serverfd, clientfd;
struct sockaddr_in vir_serv_addr, cli_addr;

serverfd = socket(AF_INET, SOCK_STREAM, 0);
bzero((char *) &vir_serv_addr, sizeof (vir_serv_addr));

vir_serv_addr.sin_family = AF_INET;
vir_serv_addr.sin_addr.s_addr = INADDR_ANY;
vir_serv_addr.sin_port = htons(9999);

bind(serverfd, (struct sockaddr *) &vir_serv_addr, sizeof (vir_serv_addr));
listen(serverfd, 5);
socklen_t client = sizeof (cli_addr);
clientfd = accept(serverfd, (struct sockaddr*) &cli_addr, (socklen_t*) & client);

/*
------------------- END Initialize Server -------------------
*/

/*
------------------ START SSL ------------------
*/

SSL_library_init();
SSL_load_error_strings();
OpenSSL_add_all_algorithms();

FILE* certF = fopen("server-cert.pem", "r");
X509* cert = PEM_read_X509(certF, NULL, NULL, NULL);

FILE* keyF = fopen("server-key.pem", "r");
EVP_PKEY* key = PEM_read_PrivateKey(keyF, NULL, NULL, NULL);

SSL_CTX* context = SSL_CTX_new(TLSv1_server_method());

SSL_CTX_use_certificate(context, cert);
SSL_CTX_use_PrivateKey(context, key);
SSL_CTX_check_private_key(context);

SSL_CTX_set_ecdh_auto(context, 1);
SSL_CTX_set_verify_depth(context, 4);
SSL_CTX_load_verify_locations(context, "ca-cert.pem", "");

SSL* ssl = SSL_new(context);
SSL_set_fd(ssl, clientfd);

int r = SSL_accept(ssl);
if (r != 1) {
ERR_print_errors_fp(stderr);
int err_SSL_get_error = SSL_get_error(ssl, r);

switch (err_SSL_get_error) {
case SSL_ERROR_NONE:
printf("%d", 0);
break;
case SSL_ERROR_SSL:
printf("%d", 1);
break;
case SSL_ERROR_WANT_READ:
printf("%d", 2);
break;
case SSL_ERROR_WANT_WRITE:
printf("%d", 3);
break;
default:
printf("%d", -1);
break;
}
}

/*
------------------- END SSL -------------------
*/

return 0;
}

最佳答案

如果您不直接在线上使用 TLS,而是将 TLS 帧封装在其他一些协议(protocol)中,则您不能使用 OpensSL (SSL_set_fd) 的文件描述符后端。相反,您必须使用带有一些内存 BIO 的 BIO 后端 (SSL_set_bio)。使用内存 BIO OpenSSL 不会自行从文件描述符读取/写入数据,而是读取/写入某个内存位置。

详情请见 Directly Read/Write Handshake data with Memory BIO

关于c++ - 使用 openssl 封装数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38421168/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com