5

这是我在 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 天来解决 Google Chrome 的 WebRTC DTLS 服务器模式协商问题。但是我还没有找到这个问题的根本原因。

4

1 回答 1

1

TCP-Dump的链接不起作用。无论如何,您的解决方案似乎应该有效。

因为它是一个服务器程序,它肯定是多线程的。但是初始化 SSL 变量执行握手过程而不锁定是非常危险的。在那种情况下,如果这两种方法由多个线程处理,就会发生很多事情。

我的建议是为这些方法添加锁定机制

于 2017-10-16T09:32:07.687 回答