Ich möchte einen SSL-Server zum Erstellen einer sicheren Verbindung mit OpenSSL in C++ zu entwickeln. Aber ich erhalte Client Hello-Nachricht in einem anderen Protokollpaket eingekapselt. Beispiel Paket:Verwenden Sie openssl für gekapseltes Paket
Simple TCP Packet = TCP Headers | TCP Data
TCP Data = Protocol Headers | Protocol Data | Client Hello
Wie kann ich Client-Hallo aus Paket extrahieren und Wie kann ich es in Openssl akzeptieren?
Mein Code:
#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;
}
Mit anderen Worten sehen, müssen Sie Ihre eigene Steckdose tun, I/O, um das Einkapseln Protokoll zu handhaben, und dann OpenSSL BIO API verwenden, um verschlüsselte TLS-Daten zu OpenSSL während der Leseoperationen passieren, und empfangen verschlüsselte TLS-Daten von OpenSSL während Schreiboperationen. –