2017-08-24 36 views
9

Qt初學者和開發跨平臺應用程序,需要從服務器和客戶端進行SSL身份驗證。基於.pem的加密適用於Linux,Android,Windows。但是,Mac OSX存在問題。我們的代碼看起來像下面:如何在Mac OSX上使用Qt中的pkcs12/pfx執行成功的SSL加密?

QFile privateKeyFile(":/Certificate.pem"); // --> has certificate + key 
privateKeyFile.open(QIODevice::ReadOnly | QIODevice::Text);  
setLocalCertificateChain(QSslCertificate::fromPath(":/Certificate.pem", QSsl::Pem)); 
setPrivateKey(QSslKey(privateKeyFile.readAll(), QSsl::Rsa)); 

在上面的代碼中privateKey().isNull()回報true爲Mac。當我們提到this post時,它表示Mac不支持基於.pem的加密。

捲曲的安全傳輸後端僅支持採用PKCS#12(P12)格式的客戶端ID;它不支持PEM格式的客戶端ID,因爲Apple不允許我們使用PEM格式的身份文件創建安全身份,而不使用私有API。而且我們不能使用私有API,因爲使用私有API的應用不允許在Apple的任何應用商店中使用。

由於我的理解有限,我解釋說.pem不適合與服務器進行SSL通信。如果它錯了,請阻止我!

因此,我們決定移動到所有平臺的.pfx。我們已經有一個帶有密碼的.pfx文件。我們將上面的代碼轉換爲與.pfx兼容(即「Certificate.pfx」,我們將此舊文件與「Certificate.pem」一起)。我們嘗試了QSsl::Der而不是QSsl::Pem。但如預期的那樣,它沒有奏效。但是,也沒有加密錯誤,但我們確信我們做錯了什麼。 :-)

我們提到這篇文章,並嘗試從.pem重新生成.pfx,但這也沒有幫助。
QSslCertificate::importPkcs12 fails to parse PFX file
在上述情況下,QSslCertificate::importPkcs12()對原始.pfx文件返回false。即使我們從命令行生成新的.pfx,上述功能也失敗了。

問題:有人可以幫助確切的方式與服務器執行.pfx加密嗎?
.pem認證也很好。

注意

  • 服務器支持.PFX &。質子交換膜。我們用常規的C OpenSSL庫進行了確認。但我們想用Qt來實現它。
  • 我們是開放的比.PFX其他格式,它們應該在所有的平臺上工作
+0

非常混亂。你在做SSL客戶端身份驗證嗎?如果你是這種情況,這很少見。如果你不是,那麼你沒有私鑰,所以你不需要Pkcs#12。 –

+0

@JamesKPolk,我對SSL的知識有限。簡而言之,我們有一個使用C函數來驗證服務器的舊代碼。它使用一個.pfx證書,該證書被轉換爲.pem,然後與服務器交換。現在我們必須將該代碼移植到Qt。使用.pem,它的工作原理已經在上面的代碼中演示過了。但是,它僅在Mac中無法使用。在網上搜索時,我們得到了一個github帖子,這表明Mac不支持.pem,這在Qn中也有提到。所以我們想回到.pfx。現在我們不知道該怎麼做。對不起,不夠清楚。 – iammilind

+0

您是否試過將證書和客戶端密鑰文件分開,將它們轉換爲DER格式並逐一加載它們? – nothingam

回答

1

免責聲明:我從我的腦海裏的頂部寫這個,因爲我個人不擁有一臺Mac,不能再次驗證它。

在我上一份工作中,一兩年前我們遇到過這個問題。這一切歸結爲蘋果放棄對OpenSSL的支持。

因此,Qt在Mac上用Qt5.6從OpenSSL後端切換到安全傳輸後端。現在安全傳輸實施缺乏一些功能。例如,我們無法加載私鑰pem文件。我認爲從PKCS#8切換到PKCS#1有幫助,它們都可以存儲在.pem文件中,並且看起來幾乎完全相同,因此花了一段時間才弄清楚。

我們也注意到,一個成功加載的私鑰將存儲在Mac的密鑰存儲區內,並且可以從用戶那裏查看和導出,這也是我們不想要的。

我們終於重新編譯了QtNetwork模塊,使用OpenSSL代替安全傳輸。您將需要爲此提供OpenSSL,因爲OSX不再包含標頭。我覺得自制裝置足夠了。除此之外,編譯出奇的無痛和快速,因爲你只需要編譯一個小模塊,而不是整個Qt。

做到這一點,最簡單的方法是:

  1. 下載了Qt版本的源分佈,你正在運行
  2. ./configure它使用OpenSSL(在-openssl開關我相信)
  3. cd進入network文件夾
  4. make
  5. 複製生成的QtNetwork.framework在您的Qt安裝裏面並且替換現有的。

隨着一切按預期工作。