嗨,
我目标是为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,则不能。
任何人都可以帮忙吗?谢谢!