首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QSslSocket问题

QSslSocket问题
EN

Stack Overflow用户
提问于 2011-03-05 15:15:20
回答 3查看 1.2K关注 0票数 2

我正在尝试创建一个客户端服务器应用程序,用c++和QT编写的客户机,以及用java编写的服务器,但是我很难让ssl加密工作起来。

我想,这个过程在握手时失败了。我之所以很难弄清楚它为什么不能工作,是因为即使进程失败了,客户端或服务器中也不会报告错误。在QT中,我使用了客户端的休整:

代码语言:javascript
复制
    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,因此进程失败,但错误字符串为“无错误”。我还添加了一个插槽来处理来自套接字的错误信号,但是它从未被调用。在服务器端,我使用:

代码语言:javascript
复制
 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连接,它可以工作。握手成功,我可以从服务器发送和接收数据包。所以问题似乎在客户身上。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-05 18:18:28

我似乎对从文件中加载证书的方式有问题。显然,"fromPath“方法并不是从文件中加载证书,而是返回证书列表。如果我将这个列表添加到我的套接字中,那么它可以正常工作。我有点良心不安,因为我没有正确地阅读这些文件。

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

但是,当.fromPath() methon返回的对象被添加到套接字中时,握手将继续正常进行,因为现在它具有有效的和非空的人工操作。

票数 1
EN

Stack Overflow用户

发布于 2011-03-16 11:05:11

当存在空证书数据库时,未能提供错误的问题现在是Qt bug QTBUG-17550

票数 1
EN

Stack Overflow用户

发布于 2011-03-05 15:24:21

将SSL客户端套接字的void QSslSocket::sslErrors ( const QList & errors )信号连接到某个插槽,并查看是否报告了任何SSL错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5204652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档