我正在尝试从.qrc资源文件加载SSL证书文件。当我在目录中查询带有QStringList apples = QDir (":/").entryList();
其输出为:
D TAPMobile :( null):0((null)):“items”
D TAPMobile:(null):0((null)):“particleresources”
D TAPMobile :( null):0((null)):“粒子”
D TAPMobile :( null):0((null)):“plugins”
D TAPMobile :( null):0((null)):“qml”
D TAPMobile :( null):0((null)):“qt-project.org”
D TAPMobile:(null):0((null)):“qtmultimediaquicktools”
D TAPMobile :( null):0((null)):“QtQuick”
D TAPMobile :( null):0((null)):“scenegraph”
D TAPMobile:(null):0((null)):“shaders”
D TAPMobile :( null):0((null)):“SSLcomDVCA_2.crt”
我使用certPath = ":/SSLcomDVCA_2.crt"; // Dev Cert
我还在.pro文件中加载了RESOURCES += resources.qrc certs.qrc # uncomment for publishing
的资源文件。
在查看证书路径和证书文件的调试时,我得到以下信息:http://bit.ly/1MngyId
我还使用:Q_INIT_RESOURCE(resources);
这是部署到应用程序商店之前的最后一个障碍,所以任何帮助都会很棒。谢谢!
答案 0 :(得分:0)
这是我在其他地方发布的解释的后续跟进,但答案是相关的。它是空的,因为我实际上并没有找到文件所在的正确路径。以下是修复和我对其发生情况的解释。
我找到了“问题”并解决了我的问题。虽然我认为问题是QT错误或我对字符串定义的理解是错误的。当我为dev和prod放入两个证书时,我设置了名为certs.qrc
的资源文件。我创建了文件定义,并通过右键单击资源文件并复制它的路径来使用我获得的路径。请参阅下面的SSL的完整定义,希望这也将作为QT SSL的一个示例,因为我几乎找不到任何一个。
这是我的certs文件,没有'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在一般情况下工作!