【发布时间】:2011-03-05 15:15:20
【问题描述】:
我正在尝试创建一个客户端 - 服务器应用程序、用 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 进行连接,并且可以正常工作。握手成功,我可以从服务器发送和接收数据包。所以问题似乎出在客户端。
【问题讨论】:
-
您应该使用 Wireshark 来调试此类令人费解的网络问题。我猜连接只是超时了。您能否使用其他工具(如 Web 浏览器或 openssl s_client 命令)与服务器建立 SSL 连接?
-
在我的情况下,它 QSslSocket 正在触发 QAbstractSocket::error() 信号。
标签: java qt ssl client-server