我正在尝试在应用部署中包含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`
这是我的resources.qrc文件:
<RCC>
<qresource prefix="/">
<file>qml</file>
<file>GandiStandardSSLCA2.crt</file>
<file>SSLcomDVCA_2.crt</file>
</qresource> </RCC>
以下是我设置路径的位置:certPath = "://SSLcomDVCA_2.crt"; // Dev Cert
我从右键单击文件获得了路径。它再次适用于调试版本,但不适用于发布,因此我认为它没有正确打包。任何提示或想法如何继续解决此问题?
答案 0 :(得分:0)
我发现了&#34;问题&#34;和我的问题的答案。虽然我认为问题是QT错误或我对字符串定义的理解是错误的。当我为dev和prod放入两个证书时,我设置了名为certs.qrc
的资源文件。我创建了文件定义,并通过右键单击资源文件并复制它的路径来使用我获得的路径。请参阅下面的SSL的完整定义,希望这也将作为QT SSL的一个示例,因为我几乎找不到任何一个。
这是我的证书文件没有&#39; RCC&#39;标题,因为它似乎打破了块引号:
<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在一般情况下工作!