2012-10-31 9 views
5

Ho scritto un client SSL utilizzando API OpenSSL per interagire con un server SSL. Nel sito OpenSSL ho appreso che il buffer di scrittura deve essere svuotato dopo aver scritto alcuni dati. Sto usando SSL_Write e SSL_Read nel mio programma client. Come suggerito dal sito di OpenSSL, ho provato a scaricare i dati usando BIO_flush (BIO *), mi trovo in crash qui.C'è un modo per svuotare il buffer di scrittura SSL

sto usando le librerie SSL ottenuto da this site

Qui non mi è chiaro sul fatto BIO_flush lampeggia il buffer di lettura o scrittura di buffer .. :-( Quindi volevo solo sapere c'è qualche altro modo per svuotare il buffer di scrittura SSL ...?

Ecco i dettagli circa il mio programma client.

  1. Creazione oggetto SSL (MSSL) utilizzando SSL_new
  2. Crea ting un socket TCP e fare la connessione con il server
  3. Creazione oggetto BIO (mBio) utilizzando BIO_new_socket (socket_id, BIO_NOCLOSE)
  4. Impostazione dell'oggetto BIO per oggetto SSL utilizzando SSL_set_bio (MSSL, mBio, mBio);
  5. Impostazione del socket sull'oggetto SSL mediante SSL_set_fd (mSsl, socket_id);
  6. Connessione SSL con server tramite SSL_Connect (mSsl);

Dopo i passaggi precedenti, sto avviando due thread separati per scrivere e leggere. Scrivi thread utilizza SSL_write per scrivere i dati sul server e Read thread utilizza SSL_Read per leggere i dati dal server.

In Scrivi filo dopo aver scritto ciascun pacchetto utilizzando SSL_Write Sto chiamando BIO_flush (mBio).

Nell'intero programma sto usando direttamente l'oggetto mBio solo in questo posto per eseguire il lavaggio del buffer biologico.

Quando avvio l'invio di alcuni pacchetti, il programma si arresta in modo anomalo in BIO_flush ... Come per il dump, dice che è in BIO_ctrl. Non sto ottenendo niente di più.

Qualcuno ha utilizzato la libreria di cui ho fornito il link sopra e con lo stesso problema ..? Se sì, per favore fatemi sapere se conoscete la soluzione.

Esistono regole di sincronizzazione dei thread per utilizzare BIO_flush() ...? Voglio dire, chiamare BIO_flush SSL_Read non dovrebbe accadere nello stesso momento in quel modo ...?

risposta

2

BIO_flush viene utilizzato per scaricare i dati di scrittura.

Il mix e la corrispondenza di BIO_flush e SSL_read/write è problematico in quanto la struttura BIO non è a conoscenza delle chiamate SSL_read/write.

Otterrete risultati molto migliori dall'utilizzo di BIO_read/write.

Se è assolutamente necessario utilizzare SSL_read/write, è necessario evitare l'uso di BIO.

Penso che otterrete molto più lontano con l'esempio alla fine di questa documentazione OpenSSL.

Simple OpenSSL Client Example

Se si sta ancora ricevendo crash quando si tenta che ad esempio, si potrebbe essere avere problemi con la particolare libreria costruire che si sta utilizzando.

6

Dove hai appreso che il buffer di scrittura avrebbe dovuto essere svuotato dopo una scrittura?

Stavo anche cercando una funzione di scarico, ma non sono riuscita a trovarne una.

penso che funziona in questo modo: ogni chiamata a SSL_write produce almeno un record SSL ed emette che fuori alla presa, in cui l'algoritmo Nagle potrebbe tamponare nel kernel per un momento e rapidamente lo invia verso l'esterno.

Quindi non c'è buffer in SSL_write e quindi nessun flusso!

Preferisco avere una funzione a livello e riempire tutti i record SSL fino all'orlo, ma non è disponibile per quanto vedo. Ora pianifico di eseguire il buffering personalizzato e di eseguire il più possibile le chiamate a SSL_write possibile.

BTW: ho appena scritto un piccolo programma di test: Si invia un buffer con una scrittura e poi corse di nuovo, chiamando SSL_write per ogni personaggio. Entrambe le volte corro tcpdump e Wireshark ho potuto vedere che la prima esecuzione ha avuto alcuni record di dati delle applicazioni di grandi dimensioni e la seconda manche ha avuto tanti piccoli record. Quindi penso sia confermato.

Problemi correlati