Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Подключение к SSL-серверу
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие
Vortex_001
Всем доброго времени суток.
Второй день решаю проблему - не могу подключиться к серверу Apache, на котором используется OpenSSL. Использую для этого QSslSocket. Проблема в том, что сертификат есть на локали (сервер высылаетего при регистрации), без использования этого сертификата получить нужную мне инфу с сервера я не могу (выдается код html с ощибкой сертификата). Вопрос в том, как мне сделать так, чтобы мой локальный сертификат использовался? Вот код сласса с сокетом:

#include "MainClass.h"

MainClass::MainClass(QObject *parent): QObject(parent)
{
  this->Socket = new QSslSocket();
  connect(Socket, SIGNAL(readyRead()), this, SLOT(Read()));
  connect(Socket, SIGNAL(connected()), this, SLOT(Connected()));
  connect(Socket, SIGNAL(encrypted()), this, SLOT(Encrypted()));
  connect(Socket, SIGNAL(peerVerifyError(QSslError)), this, SLOT(PeerError(QSslError)));
  connect(Socket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(StateChanged(QAbstractSocket::SocketState)));
  connect(Socket, SIGNAL(sslErrors(QList<QSslError>)), this, SLOT(SslErrors(QList<QSslError>)));

  qDebug() << QSslSocket::supportsSsl();

  QFile *CertFile = new QFile("cert.cer");
  CertFile->open(QIODevice::ReadOnly);

  QSslCertificate Cert(CertFile);

  this->Socket->addCaCertificate(Cert);
  this->Socket->setCaCertificates(this->Socket->caCertificates());

  this->Socket->connectToHostEncrypted("my_ssl_server.ru", 443);
}

MainClass::~MainClass()
{

}

void MainClass::Connected()
{
  qDebug() << "Connected!!!";
}

void MainClass::Read()
{
  qDebug() << "Butes received = " << this->Socket->bytesAvailable();
  qDebug() << this->Socket->readAll();
}

void MainClass::Encrypted()
{
  qDebug() << "Encrypted!!!";
  QString Query = "GET / HTTP/1.0\r\n\r\n";
  QByteArray Arr = Query.toUtf8();
  this->Socket->write(Arr);
  qDebug() << this->Socket->peerCertificate();
}

void MainClass::StateChanged(QAbstractSocket::SocketState State)
{
  qDebug() << State;
  qDebug() << this->Socket->readAll();
}

void MainClass::SslErrors(QList<QSslError> List)
{
  qDebug() << "SSL Errors = " << List;
  this->Socket->ignoreSslErrors();
}

void MainClass::PeerError(QSslError Err)
{
  qDebug() << "Peer Error = " << Err;
}


Как видите - сертификат содержится в файле "cert.cer" (там же и ключ лежит), вопрос лишь в том, как мне сделать так, чтобы он использовался? При подключении к серверу, прога получает сертификат с сервера, потом выдаются следующие ошибки SSL:

Peer Error = "The root certificate of the certificate chain is self-signed, and
untrusted"
Peer Error = "The host name did not match any of the valid hosts for this certi
ficate"
SSL Errors = ("The host name did not match any of the valid hosts for this cert
ificate", "The root certificate of the certificate chain is self-signed, and unt
rusted")

Хелп плиз, для меня это очень важная задача! :)
Заранее спасибо!
Vortex_001
Мда... сдается мне, никто не сталкивался :(
ViGOur
Угу, думаю так.

Вот есть старая статья по поводу работы с SSL в Qt: Secure Networking with QtSSLSocket может поможет чем.
Vortex_001
А что за класс такой QtSslSocket? его вроде нет в стандартной комплектации... Подскажите, где взять такой? :)
ViGOur
Там написано, что он относится к Qt Solutions смотри SSL Socket .

Но думаю по примеру можно сделать и со стандартным QSslSocket подобное.
Litkevich Yuriy
Цитата(Vortex_001 @ 4.2.2009, 22:19) *
А что за класс такой QtSslSocket?
Он был в Qt Solution, как написано в статье, а вот с сайта тролей:
Цитата
SSL Socket

Provided in Qt 4.3 and later in the QSSLSocket class.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.