c++ - SSL_accept 需要 200 毫秒 (c/openssl)

标签 c++ ssl openssl

SSL_accept(ssl) 200ms 正常吗?

作为 Windows 服务运行,用 C++ 编写,使用 MFC 和 Boost。在英特尔至强 e5620 2.4G、4GB 内存和 Win 7 Pro 上运行。

以下是我的代码。同时我怀疑 SSL_accept 之前的其他方法(SSL_CTX_* RAND_* 等)可能会消耗很长时间,但我记录了所有内容并发现 SSL_accept 一直在吃东西。

int verify_callback(int preverify_ok, X509_STORE_CTX *ctx)
{
    return preverify_ok;
}    
void somemethod() {    
    SSL *ssl  = 0;
    SSL_CTX *tlsctx = 0;
    int ret_conn = -1;
    tlsctx = SSL_CTX_new( SSLv23_method());

    SSL_CTX_use_certificate_file(tlsctx, sCert , SSL_FILETYPE_PEM);

    SSL_CTX_use_PrivateKey_file(tlsctx, sKey , SSL_FILETYPE_PEM);

        RAND_write_file(sRandomPem);
        int _rand_loaded = RAND_load_file(sRandomPem, -1 );   

        if(! SSL_CTX_load_verify_locations(tlsctx, sCACert, NULL))
        {
            // TODO //  /* Handle error here */     
        }
        SSL_CTX_set_verify( tlsctx, SSL_VERIFY_PEER, verify_callback );

        ssl = SSL_new(tlsctx);

        int _error = SSL_ERROR_WANT_READ;

        int loopCount  = 0;


        // START MEASURING TIME FROM HERE
        SSL_set_fd(ssl, _sck);
        while(ret_conn != 1 ) 
        {
            loopCount++;

            ret_conn = SSL_accept(ssl);

            _error = SSL_get_error(ssl, ret_conn);
            switch (_error) 
            { 
            case SSL_ERROR_NONE: 
                    break; 
            case SSL_ERROR_WANT_WRITE: 
                    break; 
            case SSL_ERROR_WANT_READ: 
                    break; 
            case SSL_ERROR_WANT_X509_LOOKUP: 
                    break; 
            case SSL_ERROR_SYSCALL: 
                    break; 
            case SSL_ERROR_SSL: 
                    break; 
            case SSL_ERROR_ZERO_RETURN: 
                    break; 
            } 

            if( _error == SSL_ERROR_WANT_READ || _error == SSL_ERROR_WANT_WRITE)
            { 
                Sleep(1);
            } else
            {
                break;
            }
        }

        if( ret_conn < 1)
        {
            Log("SSL_accept -1 ", ERR_error_string(_error, NULL));
            return;
        }
        // MEASURING END HERE, takes ~200ms (on successfully accepting connection)
}

最佳答案

据我所知,SSL_accept 是一个阻塞函数,它等待您的客户端连接。如果您的客户端比开始 SSL_accept 调用晚 200 毫秒连接,那么您将测量该等待时间。

关于c++ - SSL_accept 需要 200 毫秒 (c/openssl),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12313947/

相关文章:

c++ - 如何将 wstring 转换为 wchar_t*? C++

c++ - gmock 多个模拟实例,但只有一个有效

ssl - 在 Synology NAS 上使用 Docker 在 GitLab 上启用 SSL

c++ - 如何在 POCO C++ 库中正确使用 OpenSSL

php - 如何在 php 中添加密码以 curl ?

openssl - 使用 openSSL API 从证书获取 OCSP URL

c++ - [linux][ompl]添加库路径

c++ - 尝试使用带有数组的数据结构来制作程序

java - 将 SSL 自签名证书添加到 Java keystore 以供 JAX-RS 在 webstart 应用程序中使用

c# - SMTP 服务器需要安全连接或客户端未通过身份验证 - 仍无法正常工作