我今天来找你,因为我的客户端+服务器应用程序有问题。我构建了一个服务器和客户端应用程序,它们在QTcpSocket上运行良好,但是我想过添加一些安全性并使用延迟握手的QSslSocket。问题是我的客户表现得非常奇怪。情况是这样的:
- 如果我在我的客户端中使用
connectToHostEncrypted()
并在将套接字放入我的传入连接插槽后立即调用startServerEncryption()
它工作正常。 - 但是如果我延迟握手(通过在套接字中进行一些读/写(并在稍后调用
startServerEncryption()
,我得到错误:Error during SSL handshake: error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number
在服务器端。我也尝试在客户端使用startClientEncryption()
,但遇到了同样的错误。
证书是自签名的,并加载并正确应用于服务器上的套接字(我通过使用openssl s_client测试第一种情况进行了检查,并且服务器接受我可以测试的所有协议(SSLv3,TLSv1,TLSv1.1,TLSv1.2(。我无法使用SSLv2进行测试:在客户端上,使用此协议QSslSocket::setProtocol(QSsl::SslV2)
显示错误unsupported protocol
并且openssl s_client不会与-ssl2参数连接,它只显示可用的参数。
我正在使用Qt 5.9.1,并且已经安装了OpenSSL-Win32 v1.0.2L来获取dll。我还在Windows 7 64位上使用msvc2015 32位进行编译。 我希望你能帮助我(对不起我的英语不好(,尼古拉斯。
我刚刚发现了我的错误:我正在使用一个 readyRead 插槽,它正在使用socket->readAll()
并且阻止了 SSL 握手!我还发现您需要同时调用startClientEncryption和startServerEncryption才能进行SSL握手。