Как я могу распространять 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.