Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
QSslSocket问题 我试图创建一个客户机-服务器应用程序,客户机用C++和Qt编写,服务器用java编写,但是我很难让SSL加密工作。br/> 我认为,这个过程在握手层面是失败的。我之所以很难弄清楚它为什么不起作用,是因为即使进程失败,客户机或服务器中也不会报告任何错误。我在客户端使用fallowing an,在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; }_Java_Qt_Ssl_Client Server - Fatal编程技术网

QSslSocket问题 我试图创建一个客户机-服务器应用程序,客户机用C++和Qt编写,服务器用java编写,但是我很难让SSL加密工作。br/> 我认为,这个过程在握手层面是失败的。我之所以很难弄清楚它为什么不起作用,是因为即使进程失败,客户机或服务器中也不会报告任何错误。我在客户端使用fallowing an,在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; }

QSslSocket问题 我试图创建一个客户机-服务器应用程序,客户机用C++和Qt编写,服务器用java编写,但是我很难让SSL加密工作。br/> 我认为,这个过程在握手层面是失败的。我之所以很难弄清楚它为什么不起作用,是因为即使进程失败,客户机或服务器中也不会报告任何错误。我在客户端使用fallowing an,在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; },java,qt,ssl,client-server,Java,Qt,Ssl,Client Server,调用“waitForEncrypted”时失败。函数返回false,因此进程失败,但错误字符串为“无错误”。我还添加了一个插槽,用于处理来自套接字的错误信号,但它从未被调用。在服务器端,我使用: SSLSocket _sock = (SSLSocket) this._ssocket.accept(); _sock.startHandshake(); ........................................ if(this._inputBuffered.read(th

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

 SSLSocket _sock = (SSLSocket) this._ssocket.accept();
_sock.startHandshake();
 ........................................
 if(this._inputBuffered.read(this._messageBuffer) < 0)
                throw new Exception("Error while reading from client");
SSLSocket _sock=(SSLSocket)这个。_ssocket.accept();
_sock.startHandshake();
........................................
if(this.\u inputBuffered.read(this.\u messageBuffer)<0)
抛出新异常(“从客户端读取时出错”);
同样,不会引发异常,但在read命令中失败。但是在服务器端,我不确定如果连接/握手失败,是否会引发异常,或者我应该手动检查错误
我曾经在客户端遇到过一个问题,当我收到一个错误,即公用名与主机不匹配时,所以至少我知道连接在某种程度上正常工作。在我修复了证书以包含正确的公共名称之后,我收到了这个不存在的错误。有没有人知道为什么它会以这种方式失败,或者至少有更好的调试方法


编辑我曾尝试使用openSSL进行连接,但效果良好。握手成功,我可以从服务器发送和接收数据包。所以问题似乎出在客户身上

将SSL客户端套接字的信号连接到某个插槽,查看是否报告了任何SSL错误。

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

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


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

当有空的证书数据库时,无法给出错误的问题现在是Qt bug

您应该使用Wireshark来调试像这样令人费解的网络问题。我猜连接只是超时了。您是否可以使用其他工具(如web浏览器或openssl s_client命令)与服务器建立SSL连接?在我的例子中,QSslSocket正在触发QAbstractSocket::error()信号。是否,这个位置永远不会被调用。如果你有良知,那么你在这个网站上是一个不寻常的提问者。仍然有一个问题,就是错误信号没有被解雇。你能为此编写一个测试用例吗?