2015-02-06 12 views
5

Ecco la mia procedura in modalità OpenSSL Server,WebRTC DTLS-SRTP OpenSSL Server Stretta di mano mancata

inizializzazione parte di SSL e variabili BIO: operazioni in modalità

map<int, SSL> m_SSLMap; 
map<int, BIO> m_BioWriteMap; 
map<int, BIO> m_BioReadMap; 
int InitializeServerNegotiationMode(int iFd) 
{ 
     SSL *pServSslFd; 
     BIO *pWb, *pRb; 

     pServSslFd = SSL_new(m_pCtx); 
     assert(pServSslFd); 

     if (SSL_version(pServSslFd) == DTLS1_VERSION) 
     { 
      pWb = BIO_new(BIO_s_mem()); 
      pRb = BIO_new(BIO_s_mem()); 
      assert(pWb); 
      assert(pRb); 
      SSL_set_bio(pServSslFd, pRb, pWb); 
      SSL_set_accept_state(pServSslFd); 
     } 
     m_SSLMap[iFd] = *pServSslFd; 
     m_BioReadMap[iFd] = *pRb; 
     m_BioWriteMap[iFd] = *pWb; 

     return INITIALIZATION_SUCCESS; 
} 

Server negoziazione quando i dati DTLS arrivano al server:

int ServerModeDTLSNegotiation(int iChannel, const char *pBuff, const int iLen, int iFd) 
{ 

    SSL *pServSslFd; 
    BIO *pRbio; 
    BIO *pWbio; 
    pServSslFd = &m_SSLMap[iFd]; 
    pRbio = &m_BioReadMap[iFd]; 
    pWbio = &m_BioWriteMap[iFd]; 


    char buff[4096]; 
    memset(buff, 0, strlen(buff)); 

    BIO_write(pRbio, pBuff, iLen); 

    if(!SSL_is_init_finished(pServSslFd)) 
    { 
     int iRet = SSL_do_handshake(pServSslFd); 
    } 

    int iNewLen = BIO_read(pWbio, buff, 2048); 
    if(iNewLen>0) 
    { 
     char *pNewData = new char[iNewLen+1]; 
     for(int i=0;i<iNewLen;i++) 
     pNewData[i] = buff[i]; 
     m_pEventHandler->SendReply(iChannel, (unsigned char *)pNewData, iNewLen); 
    } 
    else 
    { 
     printf("[DTLS]:: HandShaking Response failed for this data, 
     return -1; 
    } 
    return NEGOTIATION_SUCCESS; 

} 

Qui si allega Wireshark TCP-Dump per un migliore monitoraggio del problema.

https://www.dropbox.com/s/quidcs6gilnvt2o/WebRTC%20DTLS%20Handshake%20Failure.pcapng?dl=0

Ora, io sono fiducioso per la mia inizializzazione delle variabili SSL_CTX. Perché, a volte Handshake negozia con successo per ogni porta. Ma a volte Handshake non riesce per una o due porte. Sto lavorando per 5 giorni per risolvere la negoziazione in modalità server WebRTC DTLS per Google Chrome. Ma non ho trovato la causa principale di questo problema.

risposta

1

Il collegamento per TCP-Dump non funziona. In ogni caso, sembra che la soluzione dovrebbe funzionare.

Poiché si tratta di un programma server, è sicuramente multi threaded. Ma è veramente pericoloso per inizializzare le variabili SSL o per eseguire la procedura di handshake senza blocco. In tal caso possono verificarsi molte cose se questi due metodi vengono elaborati da più thread.

Il mio suggerimento è di aggiungere meccanismo di chiusura per questi metodi.

+0

In realtà, ho risolto questo molto tempo fa. E sì, hai ragione. Ho risolto questo problema aggiungendo il blocco mutex. – RajibTheKing

Problemi correlati