gpt4 book ai didi

c++ - QSslSocket 代理服务器 (https) 和证书。握手错误

转载 作者:行者123 更新时间:2023-11-28 07:28:44 27 4
gpt4 key购买 nike

我正在编写代理服务器,http 部分已准备就绪,但 https 有问题。我以这种方式创建了一个证书和私钥(据我所知,没有它是行不通的):

OpenSSL> req-x509-newkey rsa: 2048-keyout server.key-nodes-days 365-out server.csr

我做了一个简单的 QTcpServer,它将 socketDescriptor 传递给在 newIncomingConnection() 上创建的对象。在我对象的构造函数中我做了:

    sock = new QSslSocket();
connect (sock,SIGNAL(readyRead()),this,SLOT(onQuery()));
connect(sock,SIGNAL(disconnected()),this,SLOT(deleteLater()));
connect(sock,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(onError(QAbstractSocket::SocketError)));
connect(sock,SIGNAL(sslErrors(QList<QSslError>)),this,SLOT(sltSslErrors(QList<QSslError>)));

...
Load key and cert
...
sock->setProtocol(QSsl::AnyProtocol);
QSslKey sslKey(key, QSsl::Rsa);
QSslCertificate sslCert(cert);
sock->setPrivateKey(sslKey);
sock->setLocalCertificate(sslCert);
sock->setSocketDescriptor(socketDesc);
sock->startServerEncryption();
if(!sock->waitForEncrypted(30000)) {
qDebug()<<"wait for encrypted failed";
}

在控制台中连接时,我看到“等待加密失败”和套接字发出的信号 error() 和 QAbstractSocket::SslHandshakeFailedError。您能否就建立无错误 ssl 连接的其他方法提出建议?

最佳答案

我认为您需要先调用 setSocketDescriptor,然后再调用 setPrivateKeysetLocalCertificate 方法。

下面是我用来创建 HTTPS 服务器套接字 的代码,扩展了 QTcpServer

void SslServer::incomingConnection(qintptr socketDescriptor)
{
QSslSocket *serverSocket = new QSslSocket;
if (serverSocket->setSocketDescriptor(socketDescriptor)) {
QFile keyFile(<sslKeyFileName>);
if (!keyFile.open(QIODevice::ReadOnly)) {
delete serverSocket;
return;
}
QSslKey key(&keyFile, QSsl::Rsa, QSsl::Pem, QSsl::PrivateKey);
if (key.isNull()) {
delete serverSocket;
return;
}
keyFile.close();
serverSocket->setPrivateKey(key);
// to prevent asking for client certificate.
serverSocket->setPeerVerifyMode(QSslSocket::VerifyNone);
serverSocket->setLocalCertificate(<certificateFileName>);
serverSocket->startServerEncryption();
if (serverSocket->waitForEncrypted(3000)) {
// this will emit a newConnection() signal
addPendingConnection(serverSocket);
} else {
qDebug() << "Encryption Failed.";
delete serverSocket;
}
} else {
delete serverSocket;
}
}

关于c++ - QSslSocket 代理服务器 (https) 和证书。握手错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18190776/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com