使用qt

时间:2017-08-15 16:01:42

标签: c++ qt sockets ssl qt5

我今天来找你,因为我的客户端+服务器应用程序出了问题。我构建了一个服务器和客户端应用程序,它可以正常使用QTcpSocket,但我考虑添加一些安全性,并为QSslSocket 延迟握手。问题是我的客户表现得非常奇怪。情况如下:

  • 如果我在我的客户端中使用connectToHostEncrypted()并在我的incomingConnection插槽中设置套接字后调用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 64bit上使用msvc2015 32位进行编译。 我希望你能帮助我(对不起我的英语不好),尼古拉斯。

1 个答案:

答案 0 :(得分:2)

我刚刚发现了我的错误:我正在使用一个使用socket->readAll()的readyRead插槽,这阻止了SSL握手!我还发现你需要调用startClientEncryption和startServerEncryption来进行SSL握手。