Direktes Lesen / Schreiben von Handshake-Daten mit Memory BIO

8

Ich muss eine OpenSSL-Verbindung erstellen, wo ich Handshake-Daten direkt lesen / schreiben kann. Der Grund dafür ist, dass die Handshake-Daten in einer UDP-Verbindung transportiert werden (DTLS ist keine Option, da die Daten nicht direkt im Datagramm liegen, sondern in einem anderen Protokollpaket, EAP wenn Sie neugierig sind). Bis jetzt habe ich eine OpenSSL-Verbindung erstellt, aber ich konnte nicht einmal den Handshake des Clients lesen, um ihn an den Server zu senden.

In meiner Recherche habe ich herausgefunden, dass ich ein Memory BIO zum Lesen / Schreiben der Verbindung brauche, aber nicht herausfinden kann, wie man die Handshake-Daten extrahiert. So initialisiere ich die Client Verbindung:

%Vor%

Ich habe doint SSL_connect versucht, um den Handshake einzuleiten:

%Vor%

Aber gibt -1 zurück, und tut SSL_get_error(ssl, res) Ich bekomme einen Fehlercode 2 , dann führe ich ERR_error_string mit diesem Code aus und hole:

%Vor%

Wenn ich SSL_do_handshake anstelle von SSL_connect verwende, bekomme ich genau den gleichen Fehler.

Ich konnte eine OpenSSL-Verbindung über TCP einrichten, habe dies aber noch nie mit Memory BIOs gemacht, daher wäre jede Hilfe sehr willkommen. Danke!

    
Sergio A. 31.03.2014, 03:33
quelle

2 Antworten

13

Schließlich habe ich es zur Arbeit gebracht, ich war auf dem richtigen Weg:

Die Funktion SSL_set_connect_state(ssl) wird benötigt, um die Verbindung für die Handshake-Initialisierung vorzubereiten. Dann rufen wir SSL_do_handshake(ssl) auf, um den Handshake zu starten. Diese Funktion gibt -1 zurück, da der Handshake noch nicht abgeschlossen ist, aber wir können tatsächlich vom Client-SSL-Verbindungs-BIO-Writer lesen und die Daten mit dem gewünschten Protokoll senden (in meinem Fall EAP-RADIUS-Pakete über UDP) >

Kunde

%Vor%

Der Server sollte dagegen mit dem Berechtigungsnachweis und dem privaten Schlüssel konfiguriert werden. Anstelle von SSL_set_connect_state() sollten wir SSL_set_accept_state() verwenden, da der Server auf den Handshake hallo des Clients wartet. Dann schreiben wir einfach die Client-Handshake-Hallo-Daten an den Server-BIO-Leser:

Server

%Vor%

Wir können die Funktion SSL_is_init_finished(ssl) verwenden, um zu überprüfen, ob der Handshake ausgeführt wurde, und während dies nicht erfolgt, rufen wir SSL_do_handshake(ssl) auf und lesen dann erneut vom BIO_writer, um Daten an den Client zu senden.

Dieser Prozess zwischen Client und Server sollte durchgeführt werden, bis die Verbindung hergestellt ist (d. h. SSL_is_init_finished(ssl) gibt true zurück).

Nach dem Handshake können Sie sichere Daten zwischen Client / Server senden, indem Sie die Funktionen SSL_read und SSL_write verwenden. Ich hoffe, diese kurze Erklärung ist nützlich für jemanden!

    
Sergio A. 18.04.2014, 15:37
quelle
1

Versuche dies zu tun

%Vor%

Stellen Sie sich BIO als Umhüllung des Sockels vor. Für die Client-Seite müssen Sie einen Socket angeben, der über den Verbindungsaufbau (...) mit dem gewünschten Host und Port verbunden ist. Verwenden Sie für die Serverseite einfach den Socket, der vom Aufruf accept (...) zurückgegeben wird.

    
user3155701 06.04.2014 00:46
quelle

Tags und Links