SSL 서버 및 클라이언트
QSslSockets를 사용하여 보안 원격 개체 네트워크 설정하기.
완전히 제어할 수 없는 네트워크를 통해 데이터를 전달해야 할 때 통신을 암호화하는 것은 매우 중요합니다. 이 예제의 두 애플리케이션은 SSL 연결을 통해 원격 개체를 공유하는 방법과 원격 개체에 액세스하는 방법을 보여줍니다.
sslserver와 sslcppclient는 모두 사용자 지정 루트 CA 인증서를 사용하여 서로의 인증서를 모두 sslserver/cert에 있는 인증서의 유효성을 검사합니다.
SSL 서버
sslserver는 인증서와 개인 키로 구성됩니다.
auto config = QSslConfiguration::defaultConfiguration(); config.setCaCertificates(QSslCertificate::fromPath(QStringLiteral(":/sslcert/rootCA.pem")));QFile 인증서 파일(QStringLiteral(":/sslcert/server.crt"));if (certificateFile.open(QIODevice::읽기 전용 | QIODevice::Text)) config.setLocalCertificate(QSslCertificate(certificateFile.readAll(), QSsl::Pem));else qFatal("Could not open certificate file"); QFile keyFile(QStringLiteral(":/sslcert/server.key"));if (keyFile.open(QIODevice::읽기 전용 | QIODevice::Text)) { QSslKey key(keyFile.readAll(), QSsl::Rsa, QSsl::Pem, QSsl::PrivateKey); if (key.isNull()) qFatal("Key is not valid"); config.setPrivateKey(key); } else { { qFatal("Could not open key file"); } config.setPeerVerifyMode(QSslSocket::VerifyPeer);QSslConfiguration::setDefaultConfiguration(config);
그런 다음 QRemoteObjectHost 객체와 QSslServer 객체를 생성합니다. QSslServer 객체는 포트 65511에서 수신 대기합니다. 그런 다음 QSslServer 객체의 URL을 사용하여 QRemoteObjectHost 객체에서 setHostUrl을 호출합니다.
QRemoteObjectHost host; QSslServer server; server.listen(QHostAddress::Any, 65511); host.setHostUrl(server.serverAddress().toString(), QRemoteObjectHost::AllowExternalRegistration);
람다는 오류를 터미널에 출력하여 errorOccurred 신호를 처리하는 데 사용됩니다. 두 번째 람다는 오류 처리기를 연결하는 pendingConnectionAvailable 신호에 연결되고, 들어오는 소켓을 인수로 하여 QRemoteObjectHost 객체에서 addHostSideConnection을 호출하여 호스트 객체가 통신에 소켓을 사용하도록 합니다.
QObject::connect(&서버, &QSslServer::errorOccurred, [](QSslSocket*socket, QAbstractSocket::소켓 에러 오류) { Q_UNUSED(socket); qDebug() << "QSslServer::errorOccurred" << error; });QObject::connect(&server, &QSslServer::pendingConnectionAvailable, [&server, &host]() { { qDebug() << "New connection available"; QSslSocket *socket = qobject_cast<QSslSocket *>(server.nextPendingConnection()); Q_ASSERT(socket); QObject::connect(socket, &QSslSocket::errorOccurred, [](QAbstractSocket::SocketError error) { qDebug() << "QSslSocket::error" << error; }); host.addHostSideConnection(socket); });
마지막으로 MinuteTimer 객체가 생성되고 MinuteTimer 객체를 인수로 하여 QRemoteObjectHost 객체에서 enableRemoting이 호출되어 공유할 수 있게 됩니다.
MinuteTimer timer; host.enableRemoting(&timer);
SSL 클라이언트
sslcppclient는 루트 CA 인증서를 설정한 다음 Tester 객체를 만듭니다.
int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); auto config = QSslConfiguration::defaultConfiguration(); config.setCaCertificates(QSslCertificate::fromPath(QStringLiteral(":/sslcert/rootCA.pem"))); QSslConfiguration::setDefaultConfiguration(config); Tester t; return a.exec(); }
Tester 생성자에서 임시 QRemoteObjectNode 객체가 생성되고 setupConnection을 사용하여 QSslSocket 객체를 생성 및 구성합니다. 오류 처리기가 연결되고 QRemoteObjectNode 객체에서 addClientSideConnection을 호출하여 QSslSocket 객체를 사용합니다.
QRemoteObjectNode m_client;auto socket = setupConnection(); connect(socket, &?QSslSocket::errorOccurred,socket, [](QAbstractSocket::소켓 에러 오류){ qDebug() << "QSslSocket::error" << error; }) ; m_client.addClientSideConnection(socket);
그런 다음 Tester 클래스의 멤버인 QScopedPointer 세 개가 QRemoteObjectNode 객체에서 획득을 사용하여 MinuteTimer의 복제본 세 개에 연결됩니다. 마지막으로 QTimer::singleShot 을 네 번 사용하여 지연 후 재설정을 호출합니다.
ptr1.reset(m_client.acquire< MinuteTimerReplica >()); ptr2.reset(m_client.acquire< MinuteTimerReplica >()); ptr3.reset(m_client.acquire< MinuteTimerReplica >()); QTimer::singleShot(0, this, &Tester::clear); QTimer::singleShot(1, this, &Tester::clear); QTimer::singleShot(10000, this, &Tester::clear); QTimer::singleShot(11000, this, &Tester::clear);
Tester::clear가 처음 세 번 호출되면 매번 다른 포인터에 대해 하나의 포인터가 바인딩되었는지 확인한 다음 재설정합니다. 네 번째로 호출되면 애플리케이션이 종료됩니다.
void clear() { static int i = 0; if (i== 0) { i++; if (ptr1.isNull()) qCritical() << "Pointer 1 was not set"; ptr1.reset(); } else if (i== 1) { i++; if (ptr2.isNull()) qCritical() << "Pointer 2 was not set"; ptr2.reset(); } else if (i== 2) { i++; if (ptr3.isNull()) qCritical() << "Pointer 3 was not set"; ptr3.reset(); } else { qApp->quit(); } }
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.