QsslSocket:无法访问其他对等方(服务器)上的对等(客户端)证书

时间:2014-04-10 13:30:34

标签: qt validation ssl encryption openssl

这是我原始问题的后续问题: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则不能理解。

有人可以帮忙吗?谢谢!

1 个答案:

答案 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)。