gpt4 book ai didi

java - QSslSocket问题

转载 作者:行者123 更新时间:2023-11-30 09:50:19 26 4
gpt4 key购买 nike

我正在尝试创建一个客户端-服务器应用程序,客户端是用 c++ 和 QT 编写的,服务器是用 java 编写的,但是我真的很难尝试让 ssl 加密工作。
我认为该过程在握手级别失败。我很难弄清楚为什么它不起作用的原因是,即使过程失败,客户端或服务器也没有报告任何错误。我在 QT 中使用客户端的休闲方式:

    this->_uCertificate.fromPath(_DC::DEFAULT_CERT_MAIN_PATH + _DC::DEFAULT_MAIN_CERT_FILE);
this->_socket->addCaCertificate(this->_uCertificate);

//begin connection
this->_socket->connectToHostEncrypted(this->_uServerAdress, this->_uServerPort);

//wait until connection has completed
if(!this->_socket->waitForConnected(_CM::TIMEOUT))
{
this->_lastError = this->_socket->errorString();
return false;
}

//wait for handshake
if ( !this->_socket->waitForEncrypted(_CM::TIMEOUT) ) {
this->_lastError = this->_socket->errorString(); //the error is "No Error"
//return false;
}

调用“waitForEncrypted”时失败。该函数返回 false,因此进程失败,但错误字符串为“No Error”。我还添加了一个插槽来处理来自套接字的错误信号,但它从未被调用过。在服务器端我使用:

 SSLSocket _sock = (SSLSocket) this._ssocket.accept();
_sock.startHandshake();
........................................
if(this._inputBuffered.read(this._messageBuffer) < 0)
throw new Exception("Error while reading from client");

再次没有抛出异常,但它在读取命令时失败。但是在服务器端,我不确定如果连接/握手失败是否会抛出异常,或者我应该以某种方式手动检查错误。
我曾经在客户端遇到一个问题,当我收到通用名称与主机不匹配的错误时,所以至少我知道连接在某种程度上是有效的。在我修复证书以包含正确的通用名称后,我收到了这个不存在的错误。有谁知道为什么它会以这种方式失败,或者至少有更好的调试方法?

编辑 我已尝试使用 openSSL 进行连接并且它有效。握手成功,我可以从服务器发送和接收数据包。所以问题似乎出在客户端。

最佳答案

我从文件加载证书的方式似乎有问题。 “fromPath”方法显然实际上并没有从文件中加载证书,而是返回了证书列表。如果我将这个列表添加到我的套接字中,它就会正常工作。我有点良心不安,我没有正确阅读文档。

编辑 它失败但仍然没有信号错误的原因是因为我的套接字没有有效证书。当我调用 this->_uCertificate.fromPath(..) 时,该方法返回在该路径中找到的证书列表,但对象本身未被修改。它仍然是一个无效的空证书。所以当我在我的套接字中添加那个空证书时,唯一的一个,当它到达握手时,它没有有效的操作证书。此时它失败了,但没有抛出任何错误。

但是,当 .fromPath() 方法返回的对象被添加到套接字时,握手将照常进行,因为现在它具有有效且非空的证书。

关于java - QSslSocket问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5204652/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com