C ++ OpenSSL同时传入连接

时间:2018-04-03 14:14:56

标签: php c++ ssl openssl tls1.2

我非常绝望。我一直试图修复以下错误:

问题描述:

如果我尝试通过TLS TCP套接字从PHP发送到C ++,一切都很好。但是,如果我尝试同时发送(两个客户端网站电话 - 来自同一个客户端)我得到!!有时!!来自其中一个连接的OpenSSL错误:

(我收到这两条错误消息的时间最多):

  

140099339675104:错误:1408F10B:SSL例程:SSL3_GET_RECORD:错误   版本号:s3_pkt.c:389

     

140099329185248:错误:1408E0F4:SSL   例程:ssl3_get_message:意外消息:s3_both.c:408:

  

140426079958496:错误:140940F5:SSL例程:ssl3_read_bytes:意外   记录:s3_pkt.c:1645:




查看代码:

正如我上面已经描述的那样,我正在使用OpenSSL库。 目前我知道,问题是由函数产生的: SSL_accept(SSL * ssl);

如果要建立新连接(我使用阻止模式)

accept(basis_socket, (struct sockaddr*) &address, &addrlen)

我们为每个客户端套接字生成一个新的分离线程(我知道线程池更好。我将来会实现此功能)。

所以在每个新线程中我都调用函数set_sockfd();

bool network::clientsocketaction::set_sockfd(int sockfd, struct ssl_properties ssl_settings) {

this->ctx = ctx;
this->accepted_socket = sockfd;
this->ssl_settings = ssl_settings;

try {

    //Encryption is enabled and a cipher(s) is given.
    SSL_load_error_strings();
    OpenSSL_add_ssl_algorithms();

    ctx = SSL_CTX_new(TLSv1_2_method());

    SSL_CTX_set_ecdh_auto(ctx, 1);

    /* Set the key and cert */
    if (SSL_CTX_use_certificate_chain_file(ctx, ssl_settings.ssl_certificatepath.c_str()) <= 0) {
        ERR_print_errors_cb(print_sslerrors_to_log, NULL);
        //exit(EXIT_FAILURE);
    }

    if (SSL_CTX_use_PrivateKey_file(ctx, ssl_settings.ssl_keypath.c_str(), SSL_FILETYPE_PEM) <= 0 ) {
        ERR_print_errors_cb(print_sslerrors_to_log, NULL);
        //exit(EXIT_FAILURE);
    }

    //Set ciphers
    SSL_CTX_set_cipher_list(ctx, ssl_settings.ssl_cipher.c_str());

    ssl = SSL_new(ctx);
    SSL_set_fd(ssl, this->accepted_socket);


    if (SSL_accept(ssl) <= 0) {
        std::cout << "mdsfdjsfklj" << '\n';
        ERR_print_errors_fp(stderr);

        ssl_use = false;
        return false;

    } else {
        ssl_use = true;
        return true;
    }
} catch(std::exception& e) {
    closeclient();
    return false;
}
}




所以问题是为什么我得到那些OpenSSL错误?
我希望有人可以帮助我!

0 个答案:

没有答案