Введение

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

В кои-то веки, решив написать код для себя любимого, проработал проект, установил окружение, прописал в проекте 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
Шаг 1
шаг 2
шаг 2
шаг 3
шаг 3

Если результат дальнейших действий как на картинках выше - успех

По шагам:

  1. Запускаем перл в консоли.

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

  3. Если открывается путь, куда мы устанавливали его - радуемся.

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

  • Text::Template необходим для того, чтобы компилятор справился со своей работой;

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

cpan install Text::Template
cpan install Text::Template

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

cpan install Test::More
cpan install Test::More

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

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

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

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

Вид снаружи в проводнике
Вид снаружи в проводнике
Общая структура папок для наглядности
Общая структура папок для наглядности

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

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

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

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

x64 Release dll

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

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

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

А теперь понадобится 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
nmake
До этого кадра пришлось ждать 35 минут
До этого кадра пришлось ждать 35 минут

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

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

nmake test
nmake test

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

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

nmake install
nmake install

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

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 test
nmake test

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

nmake install_sw
nmake install_sw

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

Можно по выполнении команды убедиться что всё переместилось в нужный нам каталог.

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

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

Заходим не стесняемся
Заходим не стесняемся
создаём папку под библиотеку
создаём папку под библиотеку
Вот этих ребят переименовал в dynamic и static соответственно
Вот этих ребят переименовал в dynamic и static соответственно

Переносим из временной папки библиотеки в заботливо созданную под это дело папку с названием библиотеки и версии. Так же переименуем папки с версиями для статической и динамической линковки - будет труднее запутаться так как 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

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

лезем в свойства
лезем в свойства
вносим изменения
вносим изменения

libcrypto.lib;libssl.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, не нашёл таковых, и надеюсь на отклик со стороны читателей, а также на то, что статья будет полезна хотя бы ещё паре человек на этой планете. Успехов.

Комментарии (24)


  1. amarao
    24.07.2022 20:04
    +13

    Как пересобрать SSL под Windows. 15 экранов текста с картинками в посте.

    Как пересобрать SSL под Linux (Debian GNU/Linux): sudo apt-get build-dep openssl && apt-get source -b openssl. На выходе deb'ка для установки.

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


    1. pavel_pimenov
      24.07.2022 20:19
      +2

      Сборка под винду тоже короткая, но требуется как минимум perl

      call "C:\Program Files\Microsoft Visual Studio\2022\Preview\VC\Auxiliary\Build\vcvars64.bat"
      perl Configure VC-WIN64A no-asm no-shared --prefix=c:\openssl-build-x64
      call ms\do_win64a
      nmake.exe -f makefile


      1. amarao
        24.07.2022 20:25
        +4

        Откуда у вас на машине весь этот софт? Кто его поставил? Каких версий? Откуда нужные зависимости нужных версий?

        Всюду хвосты неявного происхождения.

        (debian/rules для openssl - 152 строки!)

        Кстати, тот самый Makefile, который топикастер искал.


        1. Chuvi
          24.07.2022 23:30
          -1

          Какой "весь"? Nmake это сборщик который вместе с Visual Studio идёт. Тут пёрл и вижла.


          1. bombe
            25.07.2022 09:55
            +2

            А Visual Studio из коробки? Извините за сарказм. Просто amarao, скорее всего, имел ввиду, что в linux ничего предварительно-дополнительно ставить не нужно и вся забота ложиться на пакетный менеджер.


    1. mayorovp
      24.07.2022 22:26

      Это только до тех пор пока вас устраивает системная версия openssl. Но если она вас устраивает — на кой вообще её пересобирать?


      1. Serge78rus
        24.07.2022 22:57
        +3

        Если не устраивает, то собрать и установить новую версию тоже не проблема:

        ./config
        make -j8
        make test
        sudo make install
        sudo ldconfig
        make clean
        

        Кстати, openssl похоже тот случай, когда кросскомпиляция из Линукса под винду проще, чем нативная компиляция под виндой:
        WIN_64_DIR="win64" 
        ROOT_DIR=$(pwd) 
        ./Configure --prefix=${ROOT_DIR}/${WIN_64_DIR} --cross-compile-prefix=x86_64-w64-mingw32- mingw64
        make -j8
        make install
        make clean
        


        1. iig
          25.07.2022 10:04
          +1

          Если не устраивает, то собрать и установить новую версию тоже не проблема:

          Обновлять системную либу через make install - это ведь шутка такая, да?


          1. Serge78rus
            25.07.2022 12:19

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


            1. iig
              25.07.2022 16:35

              Если измененя минорные - не вижу смысла чего-то переустанавливать. Если изменения серьёзные (1.0 на 1.1 например) - я бы так не делал.


      1. amarao
        24.07.2022 23:52

        С новой версией будут танцы потоньше. Надо будет притащить новый тарбол и поправить зависимости, если надо. Мой лучший инструмент для этого gbp.

        В целом, вопрос с уточнением зависимостей сохраняется в полный рост (кто-то это должен проверить и выписать), но сам процесс сборки будет целиком контролироваться cowdancer'ом (до-докеровая штука для создания окружения с заданными версиями пакетов).

        В целом, это довольно сложный путь, но он а) полностью sound и reproducible, б) приводит к результатам, которые можно распространять за пределы своей машины.


  1. pavel_pimenov
    24.07.2022 20:05
    +2

    я собираю openssl в VC++ и линкую статически https://github.com/pavel-pimenov/flylinkdc-r6xx/tree/master/openssl


    1. Evengard
      25.07.2022 00:14

      Почему-то раньше думал что OpenSSL под LGPL, а он оказывается под Apache 2.0...


  1. Sazonov
    24.07.2022 20:11
    +8

    А еще можно взять vcpkg и не заморачиваться.


    1. Evengard
      24.07.2022 20:17
      +1

      Вот тоже подумал. Столько геморроя, которые решаются vcpkg буквально за 5-10 минут...


    1. Xadok
      24.07.2022 20:51
      +6

      Автор буквально сам себе злой буратино. Можно взять vcpkg или conan и не писать статью, а написать лишь одну строчку.


  1. max_dark
    24.07.2022 21:11
    +4

    Для этого сейчас есть пакетные менеджеры.

    Конкретно для студии - NuGet - зависимости нужных версий устанавливаются прямо из IDE

    Кроссплатформенные (из тех что пробовал) - conan, vcpkg. Довольно легко интегрируются с CMake.


  1. askharitonov
    24.07.2022 21:20
    +4

    На что только люди не пойдут, чтобы не ставить Linux :-)

    Но, если серьёзно, аналогичный код (кое-что поменял когда перепечатывал) у меня скомпилировался такой командой:

    g++ -o mytest ssl.cpp -lboost_system -lcrypto -lssl -lpthread

    Debian GNU/Linux 11, нужные заголовочные файлы и библиотеки даже оказались установлены (нужны были для чего-то раньше).


    1. hard2018
      25.07.2022 09:11
      -3

      На что только люди не пойдут, чтобы не ставить Linux :-)

      Через линух - кривой путь. Ещё больше колготы, если линух ещё не установлен.


  1. Serge78rus
    24.07.2022 22:38
    +2

    На следующем шаге возможно познать дзен, так как компилироваться это будет достаточно долго.
    А виндовый nmake не поддерживает многопоточную компиляцию? В нормальном make это делается ключем -j N, где N — желаемое число потоков (обычно берется равным числу ядер процессора). Так сборка идет гораздо веселее.


    1. Playa
      25.07.2022 20:52
      +1

      Для этого существует Jom


  1. Chuvi
    24.07.2022 23:32

    А может стоило взять LibreSSL?


  1. AllKnowerHou
    25.07.2022 09:38

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


  1. DmitryShm
    25.07.2022 09:41

    Характер "внезапно возникающих" задач говорит о том, что это всё-таки какой-то домашний проект. Если на профессиональной ниве такие проблемы прилетают внезапно --- это ж коллеги заживо съедят. Ну выберите нормальный репозиторий, в котором подобные задачи решаются штатным образом. И про порядок включения компонентов тоже договариватся ну точно не спешным порядком. И под Windows есть выбор репозиториев, кстати. Да хоть MinGW и аналоги берите, если не нравятся корпоративные решения (по характеру ваших изменений и выбору технологий под Windows мне кажется, что сторонитесь фарватера, как минимум).