Как я могу распространять OpenSSL с моим приложением на основе Qt WebKit для Windows?

У меня есть приложение на основе Qt QWebKit, которое должно использовать HTTPS для общения с веб-страницами. Я загрузил QtSDK, а также двоичные файлы OpenSSL (здесь).

Моя проблема заключается в развертывании моего приложения. Я скопировал соответствующие файлы DLL Qt, а также соответствующие DLL файлы OpenSSL (libeay32.dll и ssleay32.dll) в каталог приложений, но когда я пытаюсь получить доступ к веб-страницам HTTPS из моего приложения, это не удается! Приложение не сбой, но страница пуста. Обычные HTTP-страницы работают отлично.

Ясно, что есть ошибка с тем, как я распространяю OpenSSL с моим приложением, я просто не уверен, где я ошибаюсь.

Мне бы не хотелось связывать установщик OpenSSL с моим приложением.

Ответ 1

Привет всем, кто читает это, пытаясь отладить подобные проблемы. Проблема заключалась в том, что двоичные файлы OpenSSL DLL, распространяемые Shining Light Productions, требуют, чтобы распространяемые компоненты Visual С++ функционировали должным образом.

Чтобы распространять DLL OpenSSL с вашим приложением без необходимости распространять распространяемые компоненты Visual С++, вы можете самостоятельно скомпилировать OpenSSL, используя MinGW. Инструкции по сборке OpenSSL с MinGW включены в исходный дистрибутив OpenSSL.

Возможно, вам придется распространять DLL MinGW с вашим приложением, если вы это сделаете. Это не было проблемой для меня, поскольку я скомпилировал приложение Qt с MinGW в первую очередь.

Ответ 2

Можно ли проигнорировать сертификат ssl?

Заголовочный файл:

void sslErrors(QNetworkReply*,const QList<QSslError> &errors);

Конструктор:

 connect(&qnam, SIGNAL(sslErrors(QNetworkReply*,QList<QSslError>)),
         this, SLOT(sslErrors(QNetworkReply*,QList<QSslError>)));

Определение метода:

void HttpWindow::sslErrors(QNetworkReply *reply, const QList<QSslError> &errors)
{
 QString errorString;
 foreach (const QSslError &error, errors) {
     if (!errorString.isEmpty())
         errorString += ", ";
     errorString += error.errorString();
 }

 if (QMessageBox::warning(this, tr("HTTP"),
                          tr("One or more SSL errors has occurred: %1").arg(errorString),
                          QMessageBox::Ignore | QMessageBox::Abort) == QMessageBox::Ignore) {
     reply->ignoreSslErrors();
 }
}

Для получения дополнительной информации см. пример QT HTTP.