使用 QT qrc 部署 TLS 证书

Deploying TLS cert with QT qrc

本文关键字:TLS 证书 部署 qrc QT 使用      更新时间:2023-10-16

我正在尝试在应用程序部署中包含SSL证书,以便我们可以安全地连接到我们的服务器。我能够将文件添加到我们的资产文件夹和 resources.qrc 文件中,它适用于调试部署。但是,当我尝试制作发布版本时,它会中断并且找不到文件。

我已经翻阅了 QT 文档和 SO,但我尝试过的所有方法都没有奏效。

以下是 .pro 文件的摘录:

`qmlFolder.source = qml
 DEPLOYMENTFOLDERS += qmlFolder # comment for publishing
assetsFolder.source = assets
DEPLOYMENTFOLDERS += assetsFolder
# Add more folders to ship with the application here
QT += xml svg quick qml widgets
# resources.qrc
RESOURCES += resources.qrc # uncomment for publishing`

这是我的资源.qrc文件:

<RCC>
    <qresource prefix="/">
        <file>qml</file>
        <file>GandiStandardSSLCA2.crt</file>
        <file>SSLcomDVCA_2.crt</file>
    </qresource> </RCC>

这是我设置路径的地方:certPath = "://SSLcomDVCA_2.crt"; // Dev Cert

我从右键单击文件中获得了路径。同样,它在调试版本中工作,但不适用于发布,所以我相信它没有正确打包。任何提示或想法如何继续解决此问题?

我找到了"问题"和问题的答案。尽管我认为问题可能是QT错误,或者我对字符串定义的理解是错误的。当我为 dev 和 prod 放置两个证书时,我设置了名为 certs.qrc 的资源文件。我创建了文件定义,并使用了通过右键单击资源文件并复制其路径获得的路径。有关SSL的完整定义,请参见下文,希望这也将作为QT SSL的示例,因为我也几乎找不到其中任何一个。

这是我没有"RCC"标头的证书文件,因为它似乎会破坏块引号:

<qresource prefix="/certs">
    <file>GandiStandardSSLCA2.crt</file>
    <file>SSLcomDVCA_2.crt</file>
</qresource>

下面是该证书文件的定义:

// SSL socket set up
QFile certFile(":/certs/GandiStandardSSLCA2.crt");
if(certFile.open(QIODevice::ReadOnly))
{
    qDebug() << "File opened";
}
else {
    qDebug() << "Boooo";
}
QSslCertificate cert(&certFile, QSsl::Pem);
forgotPwSocket = new QSslSocket(this);
forgotPwSocket->addCaCertificate(cert);

所有这些目前都是有效的。 确保运行 qmake 以便编译资源文件。

所以现在,我解释为什么我有问题。我之前对部署整个资产文件夹的证书使用了不同的部署方法。这适用于Android而不是iOS,所以我决定改用qrc。当我尝试实现/assets文件夹部署时,我使用 ifdef 来定义路径的字符串,具体取决于它是 iOS 还是 Android。我删除了ifdef,我所有的问题都消失了,它现在可以在路径上找到文件。该字符串是我的网络对象的成员,我将在运行时使用 ifdef 定义它。在我所有的调试过程中,这是检查器中显示的正确路径。意识到使用 .qrc 资源消除了基于 Android/iOS 定义路径的需要,我如上所述对路径值进行了硬编码。一旦我这样做了,它就开始工作了。路径名与调试器中的路径名相同,并且 ifdef 就位,所以我不确定为什么/在哪里中断。如果有人有任何进一步的见解,那就太好了。希望这将帮助任何遇到类似问题或让 SSL 在 QT 中正常工作的人!