这是我原始问题的后续问题:Qt Server+Client App: encryption fails (updated with code) 同时发布到Qt论坛:http://qt-project.org/forums/viewthread/41293/
您好,
我的目标是为Server + Client应用程序建立双向身份验证。然而,我遇到了一个奇怪的问题。使用Qt 5.2.0在我的Server + Client应用程序中使用XCA和OpenSSL生成的证书进行测试。
注意:我不会使用QSslSocket::ignoreSslErrors()
来解决错误。
2个场景:
1) 客户端具有有效的clientCA,有效的本地证书(由serverCA签名,客户端模板)和有效的私钥集。 服务器具有有效的serverCA,有效的本地证书(由clientCA签名,服务器模板)和有效的私钥集。
2) 客户有有效的clientCA。 服务器具有有效的本地证书(由clientCA签名,服务器模板)和有效的私钥集。
--------
ad 1)
我可以很好地建立安全连接,但前提是我在服务器端将QSslSocket::peerVerifyMode
设置为VerifyNone
(在客户端自动VerifyPeer
)。
如果我不这样做,即使套接字被正确评估为服务器端(为此检查VerifyPeer
),我也会自动分配SslMode
模式。这显然与文档相反,因为它表示如果套接字是服务器端,它应该自动QueryPeer
。但是,即使手动将套接字设置为QueryPeer
也无济于事,握手失败的方式与VerifyPeer
相同。
现在我得到的错误是:
QSslError::CertificateSignatureFailed (4) “The signature of the certificate is invalid”
在服务器上检查SSL错误(和/或加密)上的对等证书表明对等方没有提供证书(peerCertificate()
产生空证书),因此难怪它因此错误而失败。在这种情况下,我无法在客户端获得对等证书。
但是即使在服务器上设置了VerifyNone
并且加密成功,我仍然会得到上述错误,因为对等(客户端)没有出示其证书,尽管它不应该首先被请求。在客户端,我可以在这种情况下获得对等(服务器)证书。
--------
ad 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”
尽管如此,无论服务器端的peerVerifyMode
如何,SSL握手都会成功。我在客户端没有错误。这再一次与文档相反,文档明确指出,如果出现任何SSL错误,连接将被删除,除非它们被忽略。
---------------
我不明白这种行为,也不知道如何修复它,因为我很确定证书是否正常(使用openssl.exe
的测试握手成功,验证返回码为0(确定))。在我看来,peerVerifyMode
的设置经常被忽略,并且在某些情况下,错误也会被自动忽略。由于它们与服务器端的未发送(或未接收)对等(客户端)证书相关,我可以理解,但如果peerVerifyMode
设置为VerifyPeer
则不能理解。
有人可以帮忙吗?谢谢!
答案 0 :(得分:0)
我能够以不寻常的方式解决这个问题。它是由Qt中的bug造成的,我认为这个https://bugreports.qt-project.org/browse/QTBUG-7200因为它符合我最近尝试的症状(Qt中的同样错误,而openssl成功验证了证书等)。
从5.2.0更新到5.3.0-beta解决了它(在5.2.2中显然已经解决了bug)。