Проблема QSslSocket - PullRequest
       15

Проблема QSslSocket

2 голосов
/ 05 марта 2011

Я пытаюсь создать клиент-серверное приложение, клиент, написанный на 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, и это работает.Рукопожатие успешно, и я могу отправлять и получать пакеты с сервера.Так что проблема, похоже, в клиенте.

Ответы [ 3 ]

1 голос
/ 05 марта 2011

Казалось, у меня была проблема с тем, как я загружал сертификаты из файла. Метод "fromPath", по-видимому, на самом деле не загружает сертификат из файла, а возвращает список сертификатов. Если я добавлю этот список в свой сокет, то он будет работать как надо. Я немного поражен совестью, что не прочитал документацию должным образом.

Редактировать Причина, по которой он не работал, но по-прежнему не генерировались ошибки с сигналами, заключается в том, что у моего сокета не было действительного сертификата. Когда я вызывал это -> _ uCertificate.fromPath (..), метод возвращал список сертификатов, найденных по этому пути, но сам объект не был изменен. Это все еще осталось недействительным, пустым сертификатом. Поэтому, когда я добавил этот пустой сертификат в свой сокет, единственный, когда он достиг рукопожатия, у него не было действительного сертификата для операции. На данный момент это не удается, но не выдается никаких ошибок.

Но когда объекты, возвращаемые метоном .fromPath (), добавляются в сокет, рукопожатие продолжается как обычно, поскольку теперь у него есть действительные и непустые сертификаты.

1 голос
/ 16 марта 2011

Проблема с ошибкой выдачи ошибки при пустой базе данных сертификатов теперь Qt bug QTBUG-17550

0 голосов
/ 05 марта 2011

Подключите сигнал сокета клиента SSL void QSslSocket::sslErrors ( const QList<QSslError> & errors ) к некоторому слоту и посмотрите, есть ли какие-либо сообщения об ошибках SSL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...