我正在尝试创建一个客户端 - 服务器应用程序,用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");
同样没有抛出任何异常,但它在read命令失败。但是在服务器端,我不确定如果连接/握手失败会抛出异常,或者我应该以某种方式手动检查错误。
我以前在客户端遇到问题,当我收到公共名称与主机不匹配的错误时,至少我知道连接有点工作。在我修复证书以包含正确的公用名后,我收到这个不存在的错误。有没有人知道为什么它会以这种方式失败,或者至少是一个更好的调试方法?
编辑我尝试使用openSSL进行连接,但它确实有效。握手成功,我可以从服务器发送和接收数据包。所以问题似乎在客户端。
答案 0 :(得分:1)
我从文件中加载证书的方式似乎有问题。方法“fromPath”显然实际上并不从文件加载证书,而是返回证书列表。如果我将此列表添加到我的套接字,那么它可以正常工作。我有点良心,我没有正确阅读文档。
编辑它失败的原因,但仍然没有错误信号是因为我的套接字没有有效的证书。当我调用this-&gt; _uCertificate.fromPath(..)时,该方法返回在该路径中找到的证书列表,但该对象本身未被修改。它仍然是一个无效的空证书。因此,当我在我的套接字中添加空证书时,唯一一个,当它到达握手时,它没有有效的操作证书。此时它失败了,但没有抛出任何错误。
但是当.fromPath()方法返回的对象被添加到套接字时,握手会继续正常,因为现在它有有效和非空的证书。
答案 1 :(得分:1)
当存在空证书数据库时未能给出错误的问题现在是Qt bug QTBUG-17550
答案 2 :(得分:0)
将SSL客户端套接字的void QSslSocket::sslErrors ( const QList<QSslError> & errors )
信号连接到某个插槽,看看是否有任何SSL错误报告。