- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
这是我原来问题的后续: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/
我是一名优秀的程序员,十分优秀!