QSslSocket编写tcp服务器,单向认证
时间: 2024-03-01 09:52:04 浏览: 72
好的,针对你的问题,这里是一个使用 QSslSocket 编写 TCP 服务器并进行单向认证的示例代码:
```cpp
#include <QtNetwork>
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
// 创建 SSL 证书
QSslCertificate cert;
cert.fromPath("server.crt");
// 创建 SSL 密钥
QSslKey key;
key.fromPath("server.key", QSsl::Rsa);
// 创建 TCP 服务器
QTcpServer server;
if (!server.listen(QHostAddress::Any, 8888)) {
qWarning() << "Unable to start the server:" << server.errorString();
return 1;
}
qDebug() << "Server is listening on port 8888...";
// 监听新连接
QObject::connect(&server, &QTcpServer::newConnection, [&]() {
// 获取客户端套接字
QTcpSocket *socket = server.nextPendingConnection();
qDebug() << "New client connected:" << socket->peerAddress().toString();
// 进行 SSL 握手
QSslSocket *sslSocket = new QSslSocket(socket);
sslSocket->setLocalCertificate(cert);
sslSocket->setPrivateKey(key);
sslSocket->setPeerVerifyMode(QSslSocket::VerifyNone);
sslSocket->startServerEncryption();
// 处理 SSL 握手成功信号
QObject::connect(sslSocket, &QSslSocket::encrypted, [&]() {
qDebug() << "SSL handshake completed successfully.";
// 发送欢迎消息
sslSocket->write("Welcome to the server!\r\n");
sslSocket->flush();
});
// 处理 SSL 错误信号
QObject::connect(sslSocket, &QSslSocket::sslErrors, [&](const QList<QSslError> &errors) {
qDebug() << "SSL error occurred:" << errors;
sslSocket->close();
});
// 处理客户端消息
QObject::connect(sslSocket, &QSslSocket::readyRead, [&]() {
qDebug() << "Received data from client:" << sslSocket->readAll();
});
// 处理客户端断开连接
QObject::connect(sslSocket, &QSslSocket::disconnected, [&]() {
qDebug() << "Client disconnected.";
sslSocket->deleteLater();
});
});
return app.exec();
}
```
在上述示例代码中:
- 我们首先创建了一个 `QSslCertificate` 对象和一个 `QSslKey` 对象,用于对 SSL 连接进行身份验证;
- 然后,我们创建了一个 `QTcpServer` 对象,并监听端口 8888;
- 在有新连接到来时,我们会获取客户端套接字,并创建一个 `QSslSocket` 对象,用于进行 SSL 握手;
- 在 SSL 握手成功后,我们会向客户端发送欢迎消息,并处理客户端发送过来的消息;
- 如果在 SSL 握手过程中发生错误,我们会将 SSL 套接字关闭。
请注意,为了使示例代码更加简洁,我们在 `setPeerVerifyMode` 中将验证模式设置为 `QSslSocket::VerifyNone`,这意味着我们在单向认证中并没有对客户端进行身份验证。如果你需要进行双向认证,可以将验证模式设置为 `QSslSocket::VerifyPeer` 并实现 `QSslSocket::peerVerify` 信号的处理函数。
阅读全文