如何在Qt上使用TLS协议?

oo

请提供服务器端示例,其中显示了使用TLS。

现在,我有以下代码:

#include <QCoreApplication>
#include "server.h"

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);
    Server h;
    return a.exec();
}

///////////////////////////////////////

#ifndef SERVER_H
#define SERVER_H

#include <QTcpServer>

class Server : public QTcpServer {
    public:
    Server();

    void incomingConnection(int);
};

#endif // SERVER_H


///////////////////////////////////////////

#include "server.h"

#include <QSslSocket>
#include <QSslCertificate>

Server::Server() {
    if (!listen(QHostAddress::Any, 80)) {
        //error
    }
}

void Server::incomingConnection(int d) {
    QSslSocket * socket = new QSslSocket();
    if(socket->setSocketDescriptor(d)) {
        QString c, k;
        c = "site.crt";
        k = "site.key";
        socket->setLocalCertificate(c);
        socket->setPrivateKey(k);
        socket->startServerEncryption();
        if(socket->waitForEncrypted()) {
            if(socket->waitForReadyRead()) {
                socket->write(socket->readAll());
                socket->waitForBytesWritten();
                socket->disconnectFromHost();
                if(socket->state() == QTcpSocket::UnconnectedState) {
                    socket->waitForDisconnected();
                }
                socket->close();
                socket->deleteLater();
            }
            else {
                delete socket;
            }
        }
        else {
            delete socket;
        }
    }
}

如何将其更改为首先使用协议TLS,然后使用SSL?

常见任务是编写支持SNI的服务器。

内贾特

这是示例SSL或TLS服务器,该服务器使用server.key和server.crt文件进行加密:

#include <QtNetwork>
#include <QMessageBox>

class server : public QTcpServer
{
    Q_OBJECT
public:
    explicit server(QObject *parent = 0);
    ~server();

    QSslSocket server_socket;

public slots:


      void tcpReady();

      void encrypted();

      void sslError( QList<QSslError> errors );

      bool start_listen(int port_no);

protected:
    void incomingConnection(qintptr descriptor );

};

server::server(QObject *parent) :
    QTcpServer(parent)
{

    server_socket.setProtocol(QSsl::AnyProtocol);

    QByteArray key;
    QByteArray cert;

    QFile file_key("server.key");
    if(file_key.open(QIODevice::ReadOnly))
    {
        key = file_key.readAll();
        file_key.close();
    }
    else
    {
        qDebug() << file_key.errorString();
    }

    QFile file_cert("server.crt");
    if(file_cert.open(QIODevice::ReadOnly))
    {
        cert = file_cert.readAll();
        file_cert.close();
    }
    else
    {
        qDebug() << file_cert.errorString();
    }


    QSslKey ssl_key(key, QSsl::Rsa,QSsl::Pem,QSsl::PrivateKey,"server");

    QSslCertificate ssl_cert(cert);

    server_socket.addCaCertificate(ssl_cert);
    server_socket.setLocalCertificate(ssl_cert);
    server_socket.setPrivateKey(ssl_key);


    connect( &server_socket, SIGNAL(sslErrors(QList<QSslError>)),
            this, SLOT(sslError(QList<QSslError>)) );

    connect(&server_socket,SIGNAL(encrypted()),this,SLOT(encrypted()));

    server_socket.setSocketOption(QAbstractSocket::KeepAliveOption, true );
}

server::~server()
{
    server_socket.disconnectFromHost();
    server_socket.waitForDisconnected();
}

void server::tcpReady()
{
    QByteArray array = server_socket.read( server_socket.bytesAvailable() );
    //...
}

void server::encrypted()
{
    connect( &server_socket, SIGNAL(readyRead()),
             this, SLOT(tcpReady()) );
    emit connection_established();
}

void server::sslError(QList<QSslError> errors)
{
    QString erroStr="";
    foreach (const QSslError &e, errors)
        erroStr.append(e.errorString()).append("\n");

    QMessageBox::warning( (QWidget *)this->parent(), tr("Error"),erroStr );

    server_socket.ignoreSslErrors();
}


bool server::start_listen(int port_no)
{
    if( !this->listen( QHostAddress::Any, port_no ) )
    {
        QMessageBox::warning( (QWidget *)this->parent(), tr("Error!"), tr("Cannot listen to port %1").arg(port_no) );

    }
    else
        return true;
}

void server::incomingConnection(qintptr descriptor)
{
    if(server_socket.state()!=QAbstractSocket::UnconnectedState)
        return;
    if( !server_socket.setSocketDescriptor( descriptor ) )
    {
        QMessageBox::warning( (QWidget *)this->parent(), tr("Error!"), tr("Socket error!") );
        return;
    }
    else
    {
        server_socket.startServerEncryption();
    }
}

您可以将协议设置为QSsl::SslV3QSsl::TlsV1仅接受SSL或TLS连接。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在nodemcu lua上使用tls协议

来自分类Dev

与Azure事件中心通信时如何在TLS上使用AMQP协议

来自分类Dev

如何在Mac上使用TLS构建Redis 6

来自分类Dev

TLS / SSL上的AMQP协议

来自分类Dev

如何在UDP协议上同步通信?

来自分类Dev

如何在UDP协议上同步通信?

来自分类Dev

如何设置ActionMailer使用TLS连接所需的SSL协议?

来自分类Dev

如何在Swift中使用扩展协议在Obj-C类上公开现有属性

来自分类Dev

如何在Windows上打包使用CMake构建的Qt程序?

来自分类Dev

QT如何在Designer类上使用模板

来自分类Dev

如何在Swift中对SKPSMTPMessageDelegate使用协议?

来自分类Dev

如何在Swift中对SKPSMTPMessageDelegate使用协议?

来自分类Dev

如何在本地apache开发服务器(本地主机)上使用TLS

来自分类Dev

如何在Windows(使用Qt Creator)上构建64位MinGW Qt应用程序

来自分类Dev

爪哇 - 如何禁用只使用JVM配置一些协议,一个TLS加密?

来自分类Dev

如何:C#WebClient使用相互TLS命中服务端点(Oauth 2.0之类的协议)

来自分类Dev

如何在Qt上获取teechart activex

来自分类Dev

如何在协议扩展中正确使用“self”以避免必须使用协议存根?

来自分类Dev

如何在apache上启用TLS_FALLBACK_SCSV

来自分类Dev

如何在apache HttpClient上设置TLS版本

来自分类Dev

如何在Spring-boot上启用TLS 1.2?

来自分类Dev

如何在Mosquitto上提供基于SSL / TLS的通信?

来自分类Dev

如何在Ubuntu上为Postfix设置TLS

来自分类Dev

如何在Mosquitto上提供基于SSL / TLS的通信?

来自分类Dev

如何使用SignalR在服务器上检测连接协议

来自分类Dev

如何使用SignalR在服务器上检测连接协议

来自分类Dev

如何在协议扩展中使用#selector(myMethodName)?

来自分类Dev

如何在Python中使用DICT协议客户端?

来自分类Dev

如何在Silverstripe中通过$ AbsoluteLink使用其他协议

Related 相关文章

  1. 1

    如何在nodemcu lua上使用tls协议

  2. 2

    与Azure事件中心通信时如何在TLS上使用AMQP协议

  3. 3

    如何在Mac上使用TLS构建Redis 6

  4. 4

    TLS / SSL上的AMQP协议

  5. 5

    如何在UDP协议上同步通信?

  6. 6

    如何在UDP协议上同步通信?

  7. 7

    如何设置ActionMailer使用TLS连接所需的SSL协议?

  8. 8

    如何在Swift中使用扩展协议在Obj-C类上公开现有属性

  9. 9

    如何在Windows上打包使用CMake构建的Qt程序?

  10. 10

    QT如何在Designer类上使用模板

  11. 11

    如何在Swift中对SKPSMTPMessageDelegate使用协议?

  12. 12

    如何在Swift中对SKPSMTPMessageDelegate使用协议?

  13. 13

    如何在本地apache开发服务器(本地主机)上使用TLS

  14. 14

    如何在Windows(使用Qt Creator)上构建64位MinGW Qt应用程序

  15. 15

    爪哇 - 如何禁用只使用JVM配置一些协议,一个TLS加密?

  16. 16

    如何:C#WebClient使用相互TLS命中服务端点(Oauth 2.0之类的协议)

  17. 17

    如何在Qt上获取teechart activex

  18. 18

    如何在协议扩展中正确使用“self”以避免必须使用协议存根?

  19. 19

    如何在apache上启用TLS_FALLBACK_SCSV

  20. 20

    如何在apache HttpClient上设置TLS版本

  21. 21

    如何在Spring-boot上启用TLS 1.2?

  22. 22

    如何在Mosquitto上提供基于SSL / TLS的通信?

  23. 23

    如何在Ubuntu上为Postfix设置TLS

  24. 24

    如何在Mosquitto上提供基于SSL / TLS的通信?

  25. 25

    如何使用SignalR在服务器上检测连接协议

  26. 26

    如何使用SignalR在服务器上检测连接协议

  27. 27

    如何在协议扩展中使用#selector(myMethodName)?

  28. 28

    如何在Python中使用DICT协议客户端?

  29. 29

    如何在Silverstripe中通过$ AbsoluteLink使用其他协议

热门标签

归档