Обновите openssl на сервере Linode, но как выбрать «ENGINESDIR» - PullRequest
0 голосов
/ 27 августа 2018

На Linode Server он уже установил openssl, но версия 1.1.0.Но я хочу попробовать некоторые функции, такие как TLSv1_3, поэтому я решил обновить его до последней версии.

Моя старая версия openssl, подобная этой:

OpenSSL 1.1.0g  2 Nov 2017
built on: reproducible build, date unspecified
platform: debian-amd64
compiler: gcc -DDSO_DLFCN -DHAVE_DLFCN_H -DNDEBUG -DOPENSSL_THREADS -DOPENSSL_NO_STATIC_ENGINE -DOPENSSL_PIC -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DRC4_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DPADLOCK_ASM -DPOLY1305_ASM -DOPENSSLDIR="\"/usr/lib/ssl\"" -DENGINESDIR="\"/usr/lib/x86_64-linux-gnu/engines-1.1\"" 
OPENSSLDIR: "/usr/lib/ssl"
ENGINESDIR: "/usr/lib/x86_64-linux-gnu/engines-1.1"

Из-за «обновления»,поэтому я стараюсь сохранить как можно более оригинальнымЧерез какой-то сайт я сделал эту команду ./config.

./config --prefix=/usr --openssldir=/usr/lib/ssl threads shared zlib-dynamic no-ssl no-tls1 no-tls1_1 -DDSO_DLFCN -DHAVE_DLFCN_H -DNDEBUG -DOPENSSL_THREADS -DOPENSSL_NO_STATIC_ENGINE -DOPENSSL_PIC -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DRC4_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DPADLOCK_ASM -DPOLY1305_ASM -DENGINESDIR=/usr/lib/x86_64-linux-gnu/engines-1.1

Это длинная, но важная последняя фраза: -DENGINESDIR=/usr/lib/x86_64-linux-gnu/engines-1.1

И проблема возникла, когда я использовал команду make.Вот сообщение error :

<command-line>:0:0: warning: "ENGINESDIR" redefined
<command-line>:0:0: note: this is the location of the previous definition
crypto/cversion.c: In function 'OpenSSL_version':
<command-line>:0:13: error: 'usr' undeclared (first use in this function)
crypto/cversion.c:38:33: note: in expansion of macro 'ENGINESDIR'
     return "ENGINESDIR: \"" ENGINESDIR "\"";
                             ^~~~~~~~~~
<command-line>:0:13: note: each undeclared identifier is reported only once for each function it appears in
crypto/cversion.c:38:33: note: in expansion of macro 'ENGINESDIR'
     return "ENGINESDIR: \"" ENGINESDIR "\"";
                             ^~~~~~~~~~
<command-line>:0:17: error: 'lib' undeclared (first use in this function); did you mean 'ldiv'?
crypto/cversion.c:38:33: note: in expansion of macro 'ENGINESDIR'
     return "ENGINESDIR: \"" ENGINESDIR "\"";
                             ^~~~~~~~~~
<command-line>:0:21: error: 'x86_64' undeclared (first use in this function); did you mean '__x86_64'?
crypto/cversion.c:38:33: note: in expansion of macro 'ENGINESDIR'
     return "ENGINESDIR: \"" ENGINESDIR "\"";
                             ^~~~~~~~~~
<command-line>:0:34: error: 'gnu' undeclared (first use in this function)
crypto/cversion.c:38:33: note: in expansion of macro 'ENGINESDIR'
     return "ENGINESDIR: \"" ENGINESDIR "\"";
                             ^~~~~~~~~~
<command-line>:0:38: error: 'engines' undeclared (first use in this function); did you mean 'engine_st'?
crypto/cversion.c:38:33: note: in expansion of macro 'ENGINESDIR'
     return "ENGINESDIR: \"" ENGINESDIR "\"";
                             ^~~~~~~~~~
crypto/cversion.c:38:44: error: expected ';' before string constant
     return "ENGINESDIR: \"" ENGINESDIR "\"";
                                        ^~~~

Кажется, я разделил мою директорию на разные парсы ...

Вот и все, мой вопрос, я должен установить ENGINESDIRmanully?Если я откажусь от -DENGINESDIR param, может ли ENGINES также указать /usr/lib/x86_64-linux-gnu/engines-1.1?Или есть лучший выбор?Я не знаком с openssl, я могу написать такую ​​команду только из большого количества Google.?

PS1: Моя новая версия openssl 1.1.1-pre9

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

В результате небольшого времени поиска в указанном файле я наконец нашел ответ.Когда вы стремитесь решить проблему, но совершенно не чувствуете ее, но если вы непреднамеренно пробыли несколько дней и случайно вернулись, чтобы подумать и снова поискать, вы найдете ответ, насколько близко это будет ... ЖИЗНЬ СТРАННА.Файл ключа Makefile, который находится в вашем .../openssl-OpenSSL_1_1_1-pre9/ каталоге, где вы пытаетесь использовать команду make, некоторые параграфы неожиданно бросаются мне в глаза и сразу же привлекают меня:

# Do not edit these manually. Use Configure with --prefix or --openssldir
# to change this!  Short explanation in the top comment in Configure
INSTALLTOP=/usr
OPENSSLDIR=/usr/lib/ssl
LIBDIR=lib
# $(libdir) is chosen to be compatible with the GNU coding standards
libdir=$(INSTALLTOP)/$(LIBDIR)
ENGINESDIR=$(libdir)/engines-1.1

Посмотрите на стиль составления ENGINESDIR и сопоставьте его с моими командами, вскоре я понял ключ взаимосвязи между этими каталогами.

, поэтому я изменил свою команду, удалил исходный -DENGINESDIR и добавил что-то, что делает команду make похожей на:

./config --prefix=/usr --openssldir=/usr/lib/ssl --libdir=lib/x86_64-linux-gnu ...

и make снова, чудо произошло, прошло и никаких ошибок, даже предупреждений.И я пытаюсь make test, он тоже прошел, только пропускаю что-то, но это нормально.

Хотя я не пытаюсь make install проверить, указывает ли ENGINES мой старый каталог.Но я думаю, что все должно быть в порядке.

ТАК что ключ не в том, чтобы установить ENGINES dir вручную, потому что он состоит из двух каталогов с именами INSTALLTOP, LIBDIR.В файле INSTALL.md (файл находится в репозитории openssl github) только указанный пользователь может использовать --prefix для изменения префикса, но в этом файле я обнаружил, что есть другие не упомянутые, но стиль того же параметра может измениться LIBDIR, гдеENGINESDIR положитесь на это.Возможно, он редко используется, поэтому в файле уценки не упоминаются все возможные параметры.

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

0 голосов
/ 30 августа 2018

Выходные данные openssl version -a упоминаются в строке, которая начинается с copmpiler:

-DENGINESDIR="\"/usr/lib/x86_64-linux-gnu/engines-1.1\""

Это то же самое, что и у вас, но с двойными двойными кавычками вокруг него, внутренние отступили.

Чтобы добиться этого в вашем config скрипте, вам нужно будет избегать двойных кавычек и обратной косой черты, так как они будут раскрыты, как только вы вызовете скрипт.Это должно сработать при вызове config:

-DENGINESDIR=\"\\\"/usr/lib/x86_64-linux-gnu/engines-1.1\\\"\"

Обновление

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

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

$ ./config --prefix=/tmp/openssl -DENGINESDIR=\"\\\"/tmp/openssl-engines\\\"\"

Результирующий вывод при выполнении make install после этого содержит много строк, подобных этим:

gcc  -I. -Icrypto/include -Iinclude -DDSO_DLFCN -DHAVE_DLFCN_H -DNDEBUG
    -DOPENSSL_THREADS -DOPENSSL_NO_STATIC_ENGINE -DOPENSSL_PIC
    -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5
    -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DRC4_ASM
    -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DGHASH_ASM
    -DECP_NISTZ256_ASM -DPADLOCK_ASM -DPOLY1305_ASM
    -DENGINESDIR="\"/tmp/openssl-engines\"" -DOPENSSLDIR="\"/tmp/openssl/ssl\""
    -DENGINESDIR="\"/tmp/openssl/lib/engines-1.1\"" -Wall -O3 -pthread -m64
    -DL_ENDIAN  -Wa,--noexecstack -fPIC -DOPENSSL_USE_NODELETE
    -MMD -MF crypto/bn/bn_div.d.tmp -MT crypto/bn/bn_div.o -c
    -o crypto/bn/bn_div.o crypto/bn/bn_div.c
<command-line>:0:0: warning: "ENGINESDIR" redefined
<command-line>:0:0: note: this is the location of the previous definiti

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

Дальнейшее расследование показывает, что, как и ОП, указанный в его ответе, Makefile имеет «жестко закодированную» строку ENGINESDIR=$(libdir)/engines-1.1это не может быть отменено и мешает настройке этого аспекта.Поэтому бесполезно использовать значение -DENGINES с Configure.

Не вдаваясь в подробности: для настройки значения ENGINESDIR необходимо изменить файл Configurations/unix-Makefile.tmpl, чтобы он содержалследующие строки, аналогичные настройкам openssldir:

ENGINESDIR={- use File::Spec::Functions;
              our $enginesdir =
                  $config{enginesdir} ?
                      (file_name_is_absolute($config{enginesdir}) ?
                           $config{enginesdir}
                           : catdir($prefix, $config{enginesdir}))
                      : catdir($prefix, "engines");
              $enginesdir -}

и несколько строк необходимо добавить в файл Configure, чтобы ввести действительный параметр --enginesdir.

После этого следующая последовательность команд сработала так, как и ожидалось:

$ ./config --prefix=/tmp/openssl --enginesdir=/tmp/openssl-engines
$ make && make install && make install_engines

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...