WebRTC DTLS-SRTP Сбой при установлении связи с сервером OpenSSL

Вот моя процедура в режиме сервера OpenSSL,

Часть инициализации переменных SSL и 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;
}

Операции согласования режима сервера, когда данные DTLS поступают на сервер:

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;

}

Здесь я прилагаю Wireshark TCP-Dump для лучшего мониторинга проблемы.

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

Теперь я уверен в своей инициализации переменной SSL_CTX. Потому что иногда Рукопожатие успешно ведет переговоры для каждого порта. Но иногда Рукопожатие терпит неудачу для одного или двух портов. В течение 5 дней я работаю над согласованием режима сервера WebRTC DTLS для Google Chrome. Но я не нашел причину этой проблемы.

5

Решение

Ссылка для TCP-самосвал не работает.
В любом случае, похоже, ваше решение должно работать.

Поскольку это серверная программа, это определенно многопоточный. Но это действительно опасно для инициализировать переменные SSL или выполнить процедуру рукопожатия без блокировка. В этом случае очень много вещей может произойти, если эти два метода обрабатываются несколькими потоками.

Мое предложение состоит в том, чтобы добавить запирающий механизм для этих методов.

1

Другие решения


По вопросам рекламы [email protected]