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.