我正在尝试在应用程序部署中包含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 中正常工作的人!