Как установить OpenSSL 1.1.0 для Qt в Windows?

Моя цель — получить исходный код (или изображения) с веб-страницы через соединение SSL, используя QNetworkRequest с QNetworkAccessManager,

OpenSSL 1.1.0 не работает с Qt 5.8! Посмотрите в Edit 2 для установки решения!

Первая попытка: Получите ssleay32.lib и libeay32.lib и скопируйте их в папку отладки и выпуска. Не работает.

Вторая попытка: (удалено, потому что это чепуха)
Но это не работает снова.

Код (работает нормально для обычного http):

QUrl url = QUrl(name);
data.clear();

QNetworkRequest *request = new QNetworkRequest(url);
request->setRawHeader("User-Agent", userAgent);

QSslConfiguration sslConfiguration(QSslConfiguration::defaultConfiguration());
request->setSslConfiguration(sslConfiguration);

reply = webCtrl->get(*request);

connect(webCtrl, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
connect(reply, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
connect(reply, SIGNAL(finished()), this, SLOT(onReplyFinished()));

Сообщения об ошибках:

qt.network.ssl: QSslSocket: cannot call unresolved function d2i_DHparams
qt.network.ssl: QSslSocket: cannot call unresolved function DH_free
qt.network.ssl: QSslSocket: cannot call unresolved function d2i_DHparams
qt.network.ssl: QSslSocket: cannot call unresolved function DH_free
qt.network.ssl: QSslSocket: cannot call unresolved function d2i_DHparams
qt.network.ssl: QSslSocket: cannot call unresolved function DH_free
qt.network.ssl: QSslSocket: cannot call unresolved function SSLv23_client_method
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_CTX_new
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_library_init
qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error
qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error
Error creating SSL context ()

Изменить 1:
я нашел этот Artikel и OpenSSL 1.1.0 будут работать с Qt 5.10, но не с Qt 5.8, которую я использую.
И в этот Артикель я нашел QSslSocket::sslLibraryBuildVersionString() команда и мне нужна версия OpenSSL: OpenSSL 1.0.2h 3 May 2016,

Я проверю другую версию OpenSSL позже и отредактирую этот пост, если он работает или нет.

Изменить 2:
Скачать OpenSSL 1.0.2h 3 May 2016 и установите 7zip и Perl. Извлеките папку openSSL и следуйте INSTALL.W64, Перейти к bin папка и копия libeay32-xxx.dll а также ssleay32-xxx.dll в папку приложения и переименуйте файлы в libeay32.dll а также ssleay32.dll, Спасибо @ [Max Go].

Теперь SSL-соединение окончательно работает, но я получаю сообщение об ошибке при закрытии приложения и использовании веб-соединения во время выполнения.

Исключение в 0x000000007772D1CB (ntdll.dll) в onlineTest.exe:
0xC0000005: Положение чтения нарушения прав доступа 0x0000000000000074.

VS2015 Окно отладки «mem.c» строка 443:

  1. free_debug_func 0x0000000000000000 void(*)(void *, int)
  2. free_func 0x000007fee778b1ba {libeay32.dll!free} void(*)(void *)
  3. str 0x0000000002500cf0 void *

Изменить 3:
Я забыл скомпилировать -d отладки .dll. Просто измените режим компилятора на Debug, сгенерируйте DLL-файлы отладки, переименуйте, если необходимо, без -d, а затем скопируйте DLL-файлы отладки в папку отладки, а обычные DLL-файлы — в папку выпуска.

0

Решение

Вот скрипт, который я использую для автоматической сборки OpenSSL из приглашения Visual Studio. Он будет создавать 32- или 64-битную библиотеку, в зависимости от того, какой компилятор включен.

Предварительные условия (должны быть в PATH):

  • Активный Perl
  • 7zip
  • NASM
  • Visual Studio 2015 или 2017 (я ничего не тестировал)
  • Джом (необязательно)
:: Configurable Options
:: If you have jom available, set it to jom - it speeds up the build.
@set JOM=nmake
:: Choose a static or dynamic build
@set LIBTYPE=dynamic
:: OpenSSL version in the 1.0.2 series
@set SRC=openssl-1.0.2k

@if "%VSCMD_ARG_TGT_ARCH%"=="x86" (
@set BITS=32
@set DST=OpenSSL-Win32
@set CONFIG=VC-WIN32
@set SETUP=ms\do_nasm
) else if "%VSCMD_ARG_TGT_ARCH%"=="x64" (
@set BITS=64
@set DST=OpenSSL-Win64
@set CONFIG=VC-WIN64A
@set SETUP=ms\do_win64a
) else goto no_vscmd

@if "%LIBTYPE%"=="static" (
@set LIBTYPE=nt
) else if "%LIBTYPE%"=="dynamic" (
@set LIBTYPE=ntdll
) else goto no_libtype

@echo Building %SRC% for %BITS% bits.

@echo - Downloading
@perl ^
-e "use LWP::Simple;" ^
-e "mirror('https://www.openssl.org/source/%SRC%.tar.gz', '%SRC%.tar.gz');"
@echo - Decompressing
@if not exist %SRC%.tar.gz goto no_archive
@rmdir /S /Q %SRC% %DST% 2>NUL
@7z x -bsp2 -y %SRC%.tar.gz >NUL && ^
7z x -bsp2 -y %SRC%.tar     >NUL && ^
del %SRC%.tar
@if errorlevel 1 goto unpack_failed
@if not exist %SRC% goto no_source

@echo - Building
@pushd %SRC%
@perl Configure %CONFIG% --prefix=%~dp0..\%DST% && ^
call %SETUP% && ^
nmake -f ms\%LIBTYPE%.mak init && ^
%JOM% -f ms\%LIBTYPE%.mak "CC=cl /FS" && ^
%JOM% -f ms\%LIBTYPE%.mak test && ^
nmake -f ms\%LIBTYPE%.mak install || goto build_failed
@popd
@rmdir /S /Q %SRC%

@echo Build has succeeded.
@goto :eof

:no_libtype
@echo Error: LIBTYPE must be either "static" or "dynamic">&2
@exit /b 1

:no_archive
@echo Error: can't find %SRC%.tar.gz - the download has failed :(>&2
@exit /b 1

:unpack_failed
@echo Error: unpacking has failed.>&2
@exit /b %errorlevel%

:no_source
@echo Error: can't find %SRC%\>&2
@exit /b 1

:build_failed
@echo The build had failed.>&2
@popd
@exit /b 2

:no_vscmd
@echo Use vcvarsall x86 or vcvarsall x64 to set up the Visual Studio>&2
@echo build environment first.>&2
@exit /b 100
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]