qt - QsslSocket : Cannot access peer (client) certificate on other peer (server)

标签 qt validation ssl encryption openssl

这是我原来问题的后续:Qt Server+Client App: encryption fails (updated with code) 还将此发布到 Qt 论坛:http://qt-project.org/forums/viewthread/41293/

你好,

我的目标是为服务器+客户端应用程序建立双向身份验证。但是我遇到了一个奇怪的问题。在我使用 Qt 5.2.0 的服务器+客户端应用程序中使用 XCA 和 OpenSSL 生成的证书进行测试。

注意:我不使用 QSslSocket::ignoreSslErrors() 来克服错误。

2个场景:

1) 客户端具有有效的客户端 CA、有效的本地证书(由服务器 CA、客户端模板签名)和有效的私钥集。 服务器具有有效的服务器 CA、有效的本地证书(由客户端 CA、服务器模板签名)和有效的私钥集。

2) 客户端具有有效的客户端 CA。 服务器具有有效的本地证书(由客户端 CA 签名,服务器模板)和有效的私钥集。

————————-

广告 1)

我可以很好地建立安全连接,但前提是我在服务器端将 QSslSocket::peerVerifyMode 设置为 VerifyNone(在客户端自动设置为 VerifyPeer ).

如果我不这样做,我会自动分配 VerifyPeer 模式,即使套接字被正确评估为服务器端(为此检查了 SslMode)。这显然与文档相反,因为它说如果套接字是服务器端,它应该自动 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”

尽管如此,无论服务器端的 peerVerifyMode 为何,SSL 握手都会成功。我在客户端没有收到任何错误。这再次违反了文档,该文档明确指出,如果出现任何 SSL 错误,除非忽略它们,否则连接将被断开。

————————————————

我不理解这种行为,也不知道如何修复它,因为我相当确定证书没问题(使用 openssl.exe 的测试握手成功,验证返回码为 0 (Ok))。在我看来,peerVerifyMode 的设置经常被忽略,并且在某些情况下错误也会被自动忽略。由于它们与服务器端未发送(或未收到)的对等(客户端)证书有关,我可以理解,但如果 peerVerifyMode 设置为 VerifyPeer 则无法理解。

有人可以帮忙吗?谢谢!

最佳答案

我已经能够以不同寻常的方式解决这个问题。这是由Qt中的错误引起的,我认为这是一个https://bugreports.qt-project.org/browse/QTBUG-7200因为它符合我最近尝试的症状(Qt 中出现相同错误,而 openssl 成功验证了证书等)。

从 5.2.0 更新到 5.3.0-beta 解决了这个问题(bug 显然在 5.2.2 中解决了)。

关于qt - QsslSocket : Cannot access peer (client) certificate on other peer (server),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22989514/

相关文章:

c++ - Qt 5.5.0 找不到 OpenGL 函数

java - 使用 Hibernate 将下拉列表值保存到 Struts 2 中的数据库

validation - URL 验证似乎已损坏

java - 相同的代码,通过 Lotus Domino 发送电子邮件的不同行为

c++ - 在其他线程QT/C++中调用方法

c++ - Qt 5 与 MSVC 和 NMake 不工作

python - 可插入的Python程序

unit-testing - 自动浏览器兼容性验证

ssl - Consul https 支持 spring boot 应用程序

Tomcat 7 SSL 与 iOS 9 的兼容性