Найти тему
Владислав Цыбарт

Установка OpenSSL для проекта на С++

Введение

Решая в целом тривиальные задачи, приходится сталкиваться с нетривиальными проблемами, и эта история, собственно, об этом.
В кои-то веки, решив написать код для себя любимого, проработал проект, установил окружение, прописал в проекте boost и пошёл писать модули.

Ничто не предвещало беды, но в процессе написания кода было обнаружено, что модуль, который запрашивал у интернета погоду, получал вместо описанного в API json'а следующее: "400 The plain HTTP request was sent to HTTPS port". Уж чем руководствовался разработчик сайта, не перенаправивший запрос без персональных данных, не знаю, но видимо хакеры хотят украсть сведения о погоде в деревне так сильно, что спать и есть не могут.

И тут я сделал манёвр, который стоил мне 50 лет. Точнее, пары бессонных ночей, так как работать тоже надо. Ничтоже сумнящийся, подключил boost::asio::ssl, написал тестовый код, который должен был проверить что теперь есть контакт, но тут моя бровь поднялась вверх в первый раз: проект перестал собираться, потому что в системе не было OpenSSL.

Примерно такой код способен показать вам всю боль и страдания при работе с тестовым проектом.
Примерно такой код способен показать вам всю боль и страдания при работе с тестовым проектом.

Совсем открытием это конечно не было. В рабочих проектах мы писали код с использованием этого чуда, но сборкой занимался сервак, так как за каждым чихом перекомпилировать и пересобрать кодовую базу на рабочих станциях никто не желал, а на сервере всё заботливо было установлено. Все это позволяло пользоваться хедерами и лениться в плане ручной компиляции... Штош, дома нет сисадмина Лёхи, пришлось решать проблему ручками.

Что вас ждёт

  1. Поиски.
  2. Установка неожиданных вещей.
  3. Настройка зоопарка.
  4. Планирование установки.
  5. Компиляция (много компиляции).
  6. Причёсывание установки.
  7. Интеграция в проект.

Поиски

Описываю, чтобы не пришлось этим заниматься вам. При поиске обнаружите два стула. На одном - сайты, испещерённые рекламой конкурентов оранжевого ютуба и обещаниями того, что в бинарниках вирусов нет (в установщиках кнопка доната есть, а цифровых подписей, чтоб антивирь не ругался, нет). На другом - официальный репозиторий, размещённый на официальном сайте проекта, вызывающий вьетнамские флешбэки о красноглазой студенческой молодости, но внушающий какое-то доверие.

Я предлагаю тебе взять красную таблетку и пройти за мной в кроличью нору.

Найди удобное место, открой консоль, склонируй репозиторий и погнали.

git clone https://github.com/openssl/openssl.git
git clone https://github.com/openssl/openssl.git

Установка неожиданных вещей

Изучив крайне информативную инструкцию, вы с толкнётесь с парочкой мыслей:

  • в 2022 году кто-то использует perl в успешном и развивающемся до сих пор проекте;
  • для проекта написанного на языке Си необходим ассемблер, ибо без него собирается не так споро;
  • о makefile создатели знают, но вместо них сборкой занимается perl, и тестированием, может быть ещё тапки приносит но это не точно.

В этот момент я отошёл за кофе и, когда пришёл в себя эмоционально, вернулся к процессу. Довольно приличным для себя нашёл Strwberry Pearl, предлагаемый в инструкции, да и NASM упомянутый в инструкции установился легко.

Веселье ждало позже.

Настройка зоопарка

Установив программки я выяснил ряд подводных камней:

  1. Система не видит NASM.
  2. Система знает про пути perl'а но тот perl который пытается выполнить ваши скрипы - это не тот perl который вы установили.

У меня были эти проблемы, и если вам что есть по этому поводу сказать, то приглашаю в комментарии.

Нам нужно поправить заблуждения системы о системных переменных.

Сотрудники Microsoft даровали нам поиск так почему бы не воспользоваться
Сотрудники Microsoft даровали нам поиск так почему бы не воспользоваться

Первая беда будет ждать в path системы:

То как должно быть и как гарантированно не было изначально
То как должно быть и как гарантированно не было изначально
  • NASM в процессе установки не умеет прописывать себя в путях так что третья строка снизу была добавлена вручную;
  • Perl умеет себя прописывать в путях системы но по какой то причине полностью рабочий исполняемы файл perl'а валяется в пользовательских бинарниках у git'а и вызывается вперёд нужного;
  • многие скрипты, необходимые perl'у, имеют в своём же расположении тёзку с расширением .bat и не вызываются нормально.
Выделенный фрагмент нужно сделать именно в таком порядке
Выделенный фрагмент нужно сделать именно в таком порядке

Последнее решается размещением расширения .pl в переменной pathext и перемещением его перед расширением .bat.

Далее понадобится перезапустить ПК, так как до сих пор это единственный путь, который гарантирует что переменные системы обновились.

На этом можем проверить факт того, что наши штуки установлены и настроены.

Ассемблер на месте
Ассемблер на месте

К сожалению, такой же прикол с перлом не пройдёт, так как помним, что в гите живёт его злобный брат-близнец, и надо убедится, что запускается нужный.

По шагам:

  1. Запускаем перл в консоли.
  2. В диспетчере задач находим процесс перла и заказываем подсмотреть где он живёт (мне удобнее через вкладку "подробности").
  3. Если открывается путь, куда мы устанавливали его - радуемся.

А теперь можно прийти к последнему шагу настройки странных вещей - дополнительные пакеты perl:

  • Text::Template необходим для того, чтобы компилятор справился со своей работой;
  • Test::More нужен для того, чтобы можно было проверить: проходят ли полученные бинарники тесты.
cpan install Text::Template
cpan install Text::Template

Не стоит обманываться сообщением о том, что модуль уже есть. Скорее всего, он будет скачиваться и устанавливаться.

Ставить ли модуль тестов, это, конечно, дело индивидуальное, но если тесты есть, то зачем ими пренебрегать?

Планирование установки

Этап не обязательный, но лучше о нём подумать сразу, а не когда будет каша на диске.

Так как мы думаем про серьёзный проект, то понадобятся варианты, как на статической, так и на динамической сборке. Варианты для отладки и для разных систем - всё это надо как то складывать.

Для других платформ, например ARM, нужно будет создать дополнительные каталоги и выполнить команды по аналогии.

Сам же каталог скорее временный, так как библиотеки удобнее хранить в одном месте, и лично в моём случае, openssl переедет поближе к boost и другим используемым библиотеками, но позже.

Компиляция (много компиляции)

Дальше пойдут инструкции по сборке под конкретные варианты компиляции. При необходимости вы можете пролистать до нужных вам.

x64 Release dll

Здесь и в дальнейшем буду пользоваться приложением терминала Microsoft, но все терминалы, которые нужны для компиляции, доступны из меню Пуск в разделе установленной Visual Studio.

Для начала нужно открыть Терминал разработчика для x64 платформы и перейти в каталог репозитория, скачанного в самом начале.

А теперь понадобится perl. С помощью него настроим переменные сборки и подставим подготовленные каталоги для складирования данных компилятором.

perl Configure VC-WIN64A --prefix=E:\soft\libs\movebox\dll\x64\release --openssldir=E:\soft\libs\movebox\SSL
perl Configure VC-WIN64A --prefix=E:\soft\libs\movebox\dll\x64\release --openssldir=E:\soft\libs\movebox\SSL

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

После команды nmake пройдёт ориентировочно 40 минут компиляции. Между первым и вторым кадром галереи прошло 35 минут.

Дальше запуск тестов.

Чудные 20-30 минут тестов стоит провести за чем-нибудь более приятным, чем рябь от консоли.

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

Ждать на этом процессе меньше, но это не финал мытарств со сборкой данной версии. Надо прибрать за собой.

nmake clean
nmake clean

Вот теперь мы как пионеры - поработали и прибрали за собой.

x64 Release lib

Для статической библиотеки, находясь в каталоге репозитория, ввести настройки конфигурации для новой сборки. Как и в прошлый раз пользуемся перлом.

perl Configure VC-WIN64A --prefix=E:\soft\libs\movebox\lib\x64\release --openssldir=E:\soft \libs\movebox\SSL no-shared
perl Configure VC-WIN64A --prefix=E:\soft\libs\movebox\lib\x64\release --openssldir=E:\soft \libs\movebox\SSL no-shared

Необходимо указать каталог выходных файлов и добавить в конце ключ no-shared, это позволит собрать библиотеку для статической линковки.

Дальше шаги повторяют сборку динамической версии.

nmake
nmake

После команды nmake чем-нибудь займите себя, так как время сборки кардинально меньшим не станет.

Хотя в этом случае звёзды благоволили и сборка прошла за 20 минут, но никто не отменял тесты.

Тесты пройдены, пора устанавливать.

Команда установки обзавелась дополнительным суффиксом и хоть сработает и без него, но полученный результат не сработает в проекте так как надо.

Побираемся, так как нефиг захламляться, да и последующим сборкам мешать будет.

nmake clean
nmake clean

x64 Debug dll

Процесс в целом довольно длительный и требует терпения, так что в этот раз, весь набор команд, необходимых для работы с конкретным вариантом сборки, я отправил в один пайплайн, который получился довольно увесистым.

perl Configure VC-WIN64A --debug --prefix=E:\soft\libs\movebox\dll\x64\debug --openssldir=E:\soft\libs\movebox\SSL && nmake && nmake test && nmake install_sw && nmake clean

Введён пайплайн
Введён пайплайн

Всё что выше - одна строка, и одной строкой же отправляется в консоль разработчика. При этом обратите внимание, что появился ключ debug в первой команде, и мы поменяли выходной каталог для библиотеки. Ключ для статической библиотеки здесь убран.

Начало работы
Начало работы

Вообще пайплайны устроены так, что если указан && между командами, то программы по данным меду собой не связаны, но следующие запускаются только если предыдущие выполнились без ошибок, что позволяет узнать когда процесс пошёл не туда. С учётом того, что почти все команды, объединенные в пайп, длительные, и ловить каждые пару минут, закончилось оно или нет бывает проблематично, то запустить и забыть на часик другой про окно - довольно удобно.

Что приятно, так это то, что последующие шаги мы так же упростим а текущая команда подготовила место для работы после себя.

x64 Debug lib

Надеюсь, к этому моменту вы прониклись ленивостью, так как четвёртая компиляция пройдёт в такой же ускоренной манере.

perl Configure VC-WIN64A --debug --prefix=E:\soft\libs\movebox\lib\x64\debug --openssldir=E:\soft\libs\movebox\SSL no-shared && nmake && nmake test && nmake install_sw && nmake clean

Погнали
Погнали

В командах поменялись пути и добавлен ключ статической библиотеки, остаётся ждать.

Теперь мы закончили с билдом x64 пратформы полностью и можно переходить к x86.

X86 all in one

Всё что нужно проделать для x86 платформы объединим в один скрипт.

perl Configure VC-WIN32 --debug --prefix=E:\soft\libs\movebox\lib\x86\debug --openssldir=E:\soft\libs\movebox\SSL no-shared && nmake && nmake test && nmake install_sw && nmake clean && perl Configure VC-WIN32 --prefix=E:\soft\libs\movebox\lib\x86\release --openssldir=E:\soft\libs\movebox\SSL no-shared && nmake && nmake test && nmake install_sw && nmake clean && perl Configure VC-WIN32 --debug --prefix=E:\soft\libs\movebox\dll\x86\debug --openssldir=E:\soft\libs\movebox\SSL && nmake && nmake test && nmake install_sw && nmake clean && perl Configure VC-WIN32 --prefix=E:\soft\libs\movebox\dll\x86\release --openssldir=E:\soft\libs\movebox\SSL && nmake && nmake test && nmake install_sw && nmake clean

Мешанина выше - это однострочный скрипт, который сделает всю необходимую работу по компиляции к размещению готового варианта библиотек. Но убедитесь, что запускаете вы его из под нужной консоли разработчика и в дирректории репозитория open ssl

cd /d E:\soft\libs\openssl\openssl
cd /d E:\soft\libs\openssl\openssl

И только после того, как убедитесь, что все условия соблюдены, запускаете нашу лошадку вывозить компиляцию.

Ждать долго
Ждать долго

Tips: Для большинства проектов достаточно собрать пару debug-release для конкретно вашей платформы и только в одном формате dll или lib.

Теперь пустых директорий в заготовленной папке у нас нет. Можно приступить к следующему шагу.

Причёсывание установки

После полностью прошедшего процесса установки и компиляции стоит почистить временные файлы

Пропустить сложно, но всё таки
Пропустить сложно, но всё таки

Папка ssl более не понадобится. Следующим шагом следует переместить библиотеку на постоянное место жительства. В случае с текущим компом, подобные библиотеки находятся в стандартном каталоге visual studio

%homedrive%%homepath%\source
%homedrive%%homepath%\source

Ну и библиотеки будут жить в папке libs

Переносим из временной папки библиотеки в заботливо созданную под это дело папку с названием библиотеки и версии. Так же переименуем папки с версиями для статической и динамической линковки - будет труднее запутаться так как lib и dll файлы будут фигурировать довольно часто, независимо от версии.

Интеграция в проект

Страх от которого надо избавиться
Страх от которого надо избавиться

Как видим, факт наших мучений с компиляцией не сильно впечатлил VIsual Studio, и нужно показать расположения вожделенных документов.

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

Нужно залезть в свойства проекта и перейти в настройки с/с++ и изменить настройки дополнительных включаемых каталогов.

Правой кнопкой мыши по проекту -> пункт свойства
Правой кнопкой мыши по проекту -> пункт свойства

В окне изменения с помощью магии макросов Visual Studio создадим универсальный путь включения.

C:\Users\Varkmort-mainPC\source\libs\OpenSSL-master10.07.22\dynamic\$(PlatformTarget)\$(Configuration)\include
C:\Users\Varkmort-mainPC\source\libs\OpenSSL-master10.07.22\dynamic\$(PlatformTarget)\$(Configuration)\include

Макросы помогут не один раз. Самое время проверить что теперь думает Visual Studio.

Что-то на линковщицком
Что-то на линковщицком

Ругаться стали по-другому. Теперь ошибки возникают не на уровне компиляции, а при линковке. Приблизились нас на шаг к победе.

Теперь нужно научит проект видеть исполняемые файлы dll и подключать в наш исполняемый файл вызовы нужной библиотеки.

C:\Users\Varkmort-mainPC\source\libs\OpenSSL-master10.07.22\dynamic\$(PlatformTarget)\$(Configuration)\lib
C:\Users\Varkmort-mainPC\source\libs\OpenSSL-master10.07.22\dynamic\$(PlatformTarget)\$(Configuration)\lib

Перво-наперво поясним компоновщику где лежат файлы вызовов функций. Добавим запись в дополнительные каталоги библиотек. Затем перейдя из вкладки общее в ввод дополним дополнительные зависимости.

Теперь решение собирается и мы можем проверить что работает.

Обманчивый успех
Обманчивый успех

Отладка или релиз - не важно программа выдаёт:

Приступ слепоты у программы
Приступ слепоты у программы

Так как не научили проект знать о местоположении исполняемых файлов. Надо открыть свойства проекта и перейти в каталоги vс++

Выделенный пункт надо настроить
Выделенный пункт надо настроить

Нужный раздел - каталоги исполняемых файлов. Именно туда вписывают пути до библиотек dll.

C:\Users\Varkmort-mainPC\source\libs\OpenSSL-master10.07.22\dynamic\$(PlatformTarget)\$(Configuration)\bin\
C:\Users\Varkmort-mainPC\source\libs\OpenSSL-master10.07.22\dynamic\$(PlatformTarget)\$(Configuration)\bin\

И вуаля - работает.

Успешный успех на 146%
Успешный успех на 146%

Теперь можно успокоится и со спокойным разумом продолжить работу над проектом, а не над войной со строптивой библиотекой.

Заключение

В процессе работы несколько раз были очень подлые моменты, например, что брандмауэр системы, на пару с антивирусом, просыпались из отключки и ломали компиляцию. x86 до рабочего состояния вовсе собралась раза с 4, и в конечном счёте была доустановлена только ради гайда. В данной статье постарался осветить возможные проблемы при работе и проведении процесса. Сколько я не искал на просторах рунета нормальных инструкций по развёртыванию open ssl, не нашёл таковых, и надеюсь на отклик со стороны читателей, а также на то, что статья будет полезна хотя бы ещё паре человек на этой планете. Успехов.