对封装的数据包使用 openssl
Use openssl for encapsulated packet
我想开发一个SSL服务器,以便在C++中使用Openssl创建安全连接。但是我收到封装在另一个协议数据包中的客户端 Hello 消息。示例数据包:
Simple TCP Packet = TCP Headers | TCP Data
TCP Data = Protocol Headers | Protocol Data | Client Hello
如何从数据包中提取客户端 Hello,以及如何在 Openssl 接受中使用它?
我的代码:
#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帧封装在其他协议中,则无法使用OpensSL(SSL_set_fd
)的文件描述符后端。相反,你必须使用BIO后端(SSL_set_bio
)和一些内存BIO来。使用内存BIO OpenSSL不会自行从文件描述符读取/写入数据,而是读取/写入某个内存位置。
有关更多详细信息,请参阅使用内存 BIO 直接读取/写入握手数据
相关文章:
- boost::asio UDP 广播客户端仅接收"fast"数据包
- 如何使用发送数据包所花费的时间计算两个节点之间的距离?
- 发送固定大小的 UDP 数据包
- pcap_handler回调仅在使用 NPCAP v0.9991 时包含空数据包
- 在 c++ 中解析数据包数据的最佳方法是什么?
- 接受函数在发送数据包时等待
- 如何在 omnet++ 中发送自定义数据包?
- 数据包访问实践
- 在C++中创建一个简单的数据包路由器,如何跟踪"客户端"?
- 德拉吉诺 LG01-S 收到异常数据包并停止工作
- 将数据包从C++服务器发送到NodeJs服务器时出现MessagePack解码错误
- 使用C++将UDP数据包存储在Structure中
- FFmpeg av_read_frame从音频流返回数据包
- 为什么操作系统正在更改我的数据包的指定传出端口
- 是否可以将多个结构作为一个数据包存储在一个函数中,然后传递给其他函数并在那里提取?
- recvfrom 只收到几个数据包,之后它进入等待状态
- 如何调试由 C++ 编写的 npm 数据包
- 如何在INET的应用层中发送广播数据包
- 接收TCP数据包并将其放入Openssl BIO_mem中
- 对封装的数据包使用 openssl