我正在尝试创建一个客户端服务器应用程序,用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,因此进程失败,但错误字符串为“无错误”。我还添加了一个插槽来处理来自套接字的错误信号,但是它从未被调用。在服务器端,我使用:
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连接,它可以工作。握手成功,我可以从服务器发送和接收数据包。所以问题似乎在客户身上。
发布于 2011-03-05 18:18:28
我似乎对从文件中加载证书的方式有问题。显然,"fromPath“方法并不是从文件中加载证书,而是返回证书列表。如果我将这个列表添加到我的套接字中,那么它可以正常工作。我有点良心不安,因为我没有正确地阅读这些文件。
编辑它失败的原因,但仍然没有用信号抛出错误是因为我的套接字没有有效的证书。当我调用this->_uCertificate.From path (..)时,该方法返回在该路径中找到的证书列表,但对象本身没有被修改。它仍然是一个无效的空证书。因此,当我在套接字中添加那个空证书时,唯一的一个,当它到达握手时,它没有操作的有效证书。此时,它将失败,但不会引发错误。
但是,当.fromPath() methon返回的对象被添加到套接字中时,握手将继续正常进行,因为现在它具有有效的和非空的人工操作。
发布于 2011-03-16 11:05:11
当存在空证书数据库时,未能提供错误的问题现在是Qt bug QTBUG-17550
发布于 2011-03-05 15:24:21
将SSL客户端套接字的void QSslSocket::sslErrors ( const QList & errors )信号连接到某个插槽,并查看是否报告了任何SSL错误。
https://stackoverflow.com/questions/5204652
复制相似问题