2010-09-03 14 views
3

Je tente de créer un programme client/serveur, mais je trouve qu'il est difficile de poursuivre avec la quantité de documentation OpenSSL malheureusement insuffisante.SSL_accept() déclenche l'erreur "Argument invalide"

Ma question: SSL_accept jette un « argument non valide » lors de l'exécution du code suivant (simplifié):

SSL* ssl = SSL_new(ctx); // ctx is created earlier 
SSL_set_fd(ssl, socket); // socket is created earlier as well 
BIO * bio = BIO_new(BIO_s_accept()); 
BIO_set_fd(bio, socket, BIO_NOCLOSE); 
SSL_set_bio(ssl, bio, bio); 
SSL_accept(ssl); 

Je vérifie les erreurs après chaque appel de méthode, et ni la prise ni la bio va mal. Il n'y a aucune indication que quelque chose d'étrange se passe jusqu'à ce que j'essaie d'appeler SSL_accept. Je suppose que l'objet ssl a été endommagé quelque part le long du chemin, mais je n'ai pas la moindre idée de la façon dont ~

Modifier L'objet SSL et l'objet BIO sont pas nulle au point d'appeler SSL_accept().

Tous les pointeurs dans la bonne direction serait grandement appréciée: D

Répondre

1

Comme vous, j'ai eu un moment difficile avec le manque de documentation. Donc, je ne peux pas dire si oui ou non les appels set_fd sont faux ou corrects, mais je l'ai fait fonctionner sans ceux-ci. La séquence des appels que j'ai utilisé est avec succès:

BIO *sbio = BIO_new_socket(socket, BIO_NOCLOSE); 
SSL* ssl = SSL_new(ctx); 
SSL_set_bio(ssl, sbio, sbio); 
SSL_accept(ssl); 
+0

Excellent. Le problème était avec la création d'un nouveau socket bio avec BIO_s_accept(). Je vais creuser un peu plus pour savoir pourquoi, mais une fois que je viens de faire un socket BIO standard, accepter semblait fonctionner comme un charme. –

2

SSL_set_fd() est conçu comme un pratique alternatif à configurer manuellement les BIOs. Il crée automatiquement un BIO et le configure - donc tout ce que vous devez faire est:

SSL* ssl = SSL_new(ctx); 
SSL_set_fd(ssl, socket); 
SSL_accept(ssl); 
+0

Awesome ~ De la lecture de la documentation, je n'aurais jamais eu ça. Merci! –