這是後續我原來的問題:Qt Server+Client App: encryption fails (updated with code) 還張貼這對Qt的論壇:http://qt-project.org/forums/viewthread/41293/QsslSocket:不能對其他同行訪問端點(客戶端)證書(服務器)
嗨,
我目標是爲Server + Client應用程序建立雙向身份驗證。然而,我有一個奇怪的問題。使用Qt 5.2.0在我的Server + Client應用程序中使用XCA和OpenSSL生成的證書進行測試。
注意:我不使用QSslSocket::ignoreSslErrors()
來越過錯誤。
2情景:
1) 客戶端具有有效的clientCA,有效的本地證書(由serverCA,客戶端模板)和有效的私有密鑰集簽名。 服務器有有效的serverCA,有效的本地證書(由clientCA,服務器模板簽名)和有效的私鑰集。
2) 客戶端有有效的客戶端CA. 服務器有有效的本地證書(由clientCA,服務器模板簽名)和有效的私鑰集合。
--------
廣告1)
我可以建立安全連接正常,但只有當我設置QSslSocket::peerVerifyMode
到VerifyNone
在服務器端(自動VerifyPeer
在客戶端上)。
如果我不這樣做,即使套接字被正確評估爲服務器端(爲此檢查SslMode
),我也會自動分配VerifyPeer
模式。這顯然與文檔相反,因爲它說它應該是自動QueryPeer
如果套接字是服務器端。但是,即使將套接字手動設置爲QueryPeer
也無濟於事,握手失敗的原因與VerifyPeer
相同。
現在我得到的錯誤是:
QSslError::CertificateSignatureFailed (4) 「The signature of the certificate is invalid」
檢查對端證書的SSL錯誤(和/或加密)在服務器上顯示,沒有證書被對方提出的(在peerCertificate()
產生無效證書)所以難怪它會因這個錯誤而失敗。在這種情況下,我無法在客戶端獲得對等證書。
但即使VerifyNone
設置在服務器和加密成功我仍然得到上述錯誤,由於對等(客戶端)不呈現其證書,儘管事實上它不應該首先要求。在這種情況下,我可以在客戶端上獲得對等(服務器)證書。
--------
廣告2)
這是文檔風格的場景,應該能夠只有一個辦法驗證(客戶端認證服務器)。在這種情況下,默認情況下peerVerifyMode
在服務器上再次被選爲VerifyPeer
。
但是peerVerifyMode
對服務器端的握手沒有任何影響!即使設置爲VerifyPeer
,它仍會成功,儘管客戶端未提供任何證書。
不管的peerVerifyMode
錯誤的設置出現相同#1加兩個新的錯誤,所以我得到的服務器:
QSslError::CertificateSignatureFailed (4) 「The signature of the certificate is invalid」
QSslError::UnableToGetLocalIssuerCertificate (11) 「The issuer certificate of a locally looked up certificate could not be found」
QSslError::UnableToVerifyFirstCertificate (12) 「No certificates could be verified」
儘管這些SSL握手不管peerVerifyMode
成功在服務器端。我在客戶端上沒有任何錯誤。這再次違背了文檔,明確指出,如果發生任何SSL錯誤,連接將被丟棄,除非被忽略。
---------------
我不明白,這種行爲也不知道怎樣去修復它,因爲我是相當肯定的證書都ok(使用openssl.exe
測試握手驗證返回碼0(好))成功。在我看來,peerVerifyMode
的設置經常被忽略,在某些情況下,錯誤也會自動忽略。由於它們與服務器端的未發送(或未收到)對等(客戶端)證書有關,所以我可以理解,但如果peerVerifyMode
設置爲VerifyPeer
,則不能。
任何人都可以幫忙嗎?謝謝!