c++ openssl webrtc wireshark dtls

c++ - WebRTC DTLS-SRTP Error de Handshake del servidor OpenSSL



wireshark (1)

El enlace para TCP-Dump no funciona. De todos modos, parece que tu solución debería funcionar.

Como es un programa de servidor, definitivamente tiene múltiples hilos . Pero es realmente peligroso inicializar las variables SSL o realizar el procedimiento de handshake sin bloqueo . En ese caso, pueden suceder tantas cosas si estos dos métodos son procesados ​​por múltiples hilos.

Mi sugerencia es agregar un mecanismo de bloqueo para estos métodos.

Aquí está mi procedimiento en el modo de servidor OpenSSL,

Inicialización Parte de las variables SSL y BIO:

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; }

Operaciones de Negociación en Modo Servidor cuando los datos DTLS llegan al servidor:

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; }

Aquí adjunto Wireshark TCP-Dump para un mejor control sobre el problema.

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

Ahora, estoy seguro de mi inicialización de la variable SSL_CTX. Porque, a veces, Handshake negocia con éxito para cada puerto. Pero a veces Handshake falla para uno o dos puertos. Estoy trabajando durante 5 días para resolver la Negociación del Modo Servidor DTL de WebRTC para Google Chrome. Pero no he encontrado la causa raíz de este problema.