Directement Lire/Écrire des données de négociation avec la Mémoire de la BIO
J'ai besoin de créer une OpenSSL connexion où je peux passer directement à la lecture/écriture de données de négociation. La raison en est le protocole de transfert de données sera transporté dans une connexion UDP (DTLS n'est pas une option, parce que les données n'est pas directement dans le datagramme, mais à l'intérieur d'un autre protocole de paquets, EAP si vous êtes curieux). Jusqu'à présent, j'ai créé un OpenSSL connexion, mais je n'ai même pas été capable de lire du client poignée de main à envoyer au serveur.
Dans mes recherches, j'ai trouvé, j'ai besoin d'une Mémoire BIO pour lire/écrire à la connexion, mais ne peut pas comprendre comment extraire les données de négociation. Voici comment j'ai initialiser le client connexion:
SSL_library_init();
SSL_load_error_strings();
OpenSSL_add_all_algorithms();
ctx = SSL_CTX_new(SSLv3_client_method());
SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL);
ssl = SSL_new(ctx);
rbio = BIO_new(BIO_s_mem());
wbio = BIO_new(BIO_s_mem());
SSL_set_bio(ssl, rbio, wbio);
SSL_set_connect_state(ssl);
J'ai essayé doint SSL_connect
, pour initier la poignée de main:
int ret = SSL_connect(ssl);
Mais renvoie -1
, et de faire SSL_get_error(ssl, res)
- je obtenir un code d'erreur 2
, puis-je exécuter des ERR_error_string
avec ce code:
error:00000002:lib(0):func(0):system lib
Aussi, si j'utilise SSL_do_handshake
au lieu de SSL_connect
- je obtenir exactement la même erreur.
J'ai été en mesure de définir une OpenSSL connexion TCP, mais ne l'ai jamais fait avec de la Mémoire du BIOs, de sorte que toute aide à ce serait très apprécié. Merci!
- Voir M. Henson, en réponse à Interface Alternative que de ne pas utiliser des Sockets? voir Aussi openssl bio "mémoire partagée".
Vous devez vous connecter pour publier un commentaire.
Enfin j'arrive à le faire fonctionner, j'ai été dans le droit chemin:
La fonction
SSL_set_connect_state(ssl)
est nécessaire de dire que la connexion puisse être préparé pour la poignée de main init. Ensuite, nous appelonsSSL_do_handshake(ssl)
pour démarrer la poignée de main. Cette fonction sera de retour-1
parce que la poignée de main n'était pas terminé, mais nous pouvons lire à partir du client de connexion ssl BIO écrivain et envoyer les données en utilisant le protocole que nous voulons (dans mon cas, EAP RAYON de paquets UDP).Client
Le serveur, en revanche, doit être configuré à l'aide de l'identifiant et la clé privée. Aussi, au lieu de
SSL_set_connect_state()
nous devrions utiliserSSL_set_accept_state()
que le serveur va attendre le client de la poignée de main bonjour. Ensuite, nous écrivons simplement le client poignée de main hello données vers le serveur BIO lecteur:Serveur
Nous pouvons utiliser le
SSL_is_init_finished(ssl)
fonction pour vérifier si l'échange a été fait, et bien qu'il n'est pas fait, nous appelonsSSL_do_handshake(ssl)
, puis lisez à nouveau à partir de la BIO_writer pour envoyer des données au client.Ce processus entre le client et le serveur doivent être fait jusqu'à ce que la connexion est effectuée (c'est à dire
SSL_is_init_finished(ssl)
retournetrue
).Puis, après la poignée de main est fait, vous pouvez envoyer sécurisé de données entre client/serveur, en utilisant le
SSL_read
etSSL_write
fonctions. Espérons que cette brève explication est utile pour quelqu'un!SSL_is_init_finished(ssl)
retournetrue
!Essayer de faire ce
Pense que le BIO comme une enveloppe autour de la prise. Pour le côté client, vous devez donner un socket qui est connecté à l'accueil souhaité et le port en utilisant connect(...) appeler. Pour le côté serveur, il suffit d'utiliser la douille qui est retourné à partir de l'accepter(...) appeler.