微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 QTcpServer 中处理 TLS 握手超时?

如何解决如何在 QTcpServer 中处理 TLS 握手超时?

我正在尝试弄清楚如何在 QTcpserver 中的 TLS 连接中为握手过程创建超时。

我在覆盖的 incomingConnection 函数中尝试了类似的操作:

QSslSocket * const tlsSocket = static_cast<QSslSocket*>(socket);
    connect(tlsSocket,&QSslSocket::encrypted,this,[this,tlsSocket](){ addPendingConnection(tlsSocket); });
    tlsSocket->setLocalCertificate(m_serverCertificate);
    tlsSocket->setPrivateKey(m_serverPrivateKey);
    tlsSocket->setProtocol(QSsl::SecureProtocols);
    tlsSocket->startServerEncryption();

    // We will have a handshake timeout of 30 seconds
    QTimer::singleShot(30*1000,tlsSocket]() {
        if(!tlsSocket->isEncrypted()) {
            // If no handshake initialized from the client close the connection
            delete tlsSocket;
        }
    });

但这似乎不起作用,因为我没有直接调用 addPendingConnection 函数(它在插槽/lamdba 中被调用,这似乎破坏了 pendingConnection 链。

有谁知道我怎样才能在 Qt 中实现这个超时?目前的问题是客户端可以打开与服务器的连接,但它永远不会回答 TLS 握手,这导致无用的打开连接(永远不会关闭)。

解决方法

我以这种方式结束了 TLS 握手超时的实现:

// We will have a handshake timeout of 30 seconds (same as firefox today)
QTimer::singleShot(30*1000,this,[this]() {

    // we use dynamic_cast because this may be or not an encrypted socket
    QSslSocket * const tlsSocket = dynamic_cast<QSslSocket*>(m_socket);

    if(tlsSocket != nullptr && !tlsSocket->isEncrypted()) {
        qWarning() << "TLS Handshake timeout for connection from " <<
                      tlsSocket->peerAddress().toString() << ":" << tlsSocket->peerPort();
        tlsSocket->close();
    }
});

此代码可以添加到对您的项目更实用的任何位置。我将它添加到我们拥有的会话类中(它拥有创建的套接字),这个类是在 newConnection 插槽的末尾创建的。我已经对其进行了测试并且运行良好。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。