使用QT qrc部署TLS证书

时间:2016-03-14 19:49:27

标签: c++ qt ssl qml qt5

我正在尝试在应用部署中包含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

我从右键单击文件获得了路径。它再次适用于调试版本,但不适用于发布,因此我认为它没有正确打包。任何提示或想法如何继续解决此问题?

1 个答案:

答案 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在一般情况下工作!