Я пытаюсь построить OpenSSH 7.3p1 в ящике Linux, в которой установлена старая версия OpenSSL.OpenSSH 7.3p1: конфигурировать только находит старую версию библиотек OpenSSL
Прежде всего я успешно скомпилирован OpenSSL 1.0.2h и установлены в /opt/openssh-1.0.2h
, а не в /usr
, где находится старая версия OpenSSL.
tar xzf openssl-1.0.2h.tar.gz
cd openssl-1.0.2h
./config --prefix=/opt/openssl-1.0.2h shared
make depend
make
make test
make install
Тогда я продолжу с OpenSSH:
tar xzf openssh-7.3p1.tar.gz
cd openssh-7.3p1
./configure --prefix=/opt/openssh-7.3p1 --with-openssl=/opt/openssl-1.0.2h
Но configure
скрипты выдает следующее сообщение об ошибке:
checking OpenSSL header version... 0090802f (OpenSSL 0.9.8e-rhel5 01 Jul 2008)
checking OpenSSL library version... configure: error: OpenSSL >= 0.9.8f required (have "0090802f (OpenSSL 0.9.8e-fips-rhel5 01 Jul 2008)")
отображается то же сообщение, если я использую --with-ssl-dir=/opt/openssl-1.0.2h/ssl
Инструмент findssl.sh
(найдено в подкаталоге contrib
) могут найти все версии OpenSSL. И его примечания внутри (комментарии) предлагают использовать CFLAGS указать желаемую библиотеку - я цитирую:
# Now run findssl.sh. This should identify the headers and libraries
# present and their versions. You should be able to identify the
# libraries and headers used and adjust your CFLAGS or remove incorrect
# versions. The output will show OpenSSL's internal version identifier
# and should look something like:
Затем я попытался
./configure CFLAGS="-I/opt/openssl-1.0.2h/include" --prefix=/opt/openssh-7.3p1 --with-openssl=/opt/openssl-1.0.2h
Это, как представляется, работать, потому что он находит новый OpenSSL версии заголовок:
checking OpenSSL header version... 1000208f (OpenSSL 1.0.2h 3 May 2016)
checking OpenSSL library version... configure: error: OpenSSL >= 0.9.8f required (have "0090802f (OpenSSL 0.9.8e-fips-rhel5 01 Jul 2008)")
Следующий шаг должен был бы предоставить дополнительные возможности для Locat e файлы библиотеки. Но если добавить LDFLAGS='-L/opt/openssl-1.0.2h/lib'
или --with-ldflags='-L/opt/openssl-1.0.2h/lib'
, это то, что я получаю:
checking OpenSSL header version... not found
configure: error: OpenSSL version header not found.
В общем, я не знаю как сделать configure
использовать новые библиотеки OpenSSL.
обновление 1: если --with-ldflags='-L/opt/openssl-1.0.2h/ssl'
используется вместо ···openssl-1.0.2h/lib
то проверка версии заголовка работает должным образом (см несколько строк выше), библиотека проверки версии до сих пор не удается, хотя.
update 2: Я проследил проблему и обнаружил, что она связана с разделяемыми библиотеками. Из файла config.log
я получил исходный код файлов conftest.c
и confdef.h
и параметры, используемые для построения работоспособной conftest
:
#include "confdefs.h"
#include <stdio.h>
#include <string.h>
#include <openssl/opensslv.h>
#include <openssl/crypto.h>
#define DATA "conftest.ssllibver"
int
main()
{
FILE *fd;
int rc;
fd = fopen(DATA,"w");
if (fd == NULL)
exit(1);
if ((rc = fprintf(fd, "%08lx (%s)\n", (unsigned long)SSLeay(),
SSLeay_version(SSLEAY_VERSION))) < 0)
exit(1);
exit(0);
}
Эта программа сохраняет версию OpenSSL в виде текста в файле conftest.ssllibver
. Для целей отладки я повернул fprint(fd,
на print(
, чтобы распечатать данные в терминале.
Командная строка используется для построения программы conftest
является:
# gcc -o conftest -I/opt/openssl-1.0.2h/include -Wall \
-Wpointer-arith -Wsign-compare -Wformat-security -Wno-pointer-sign \
-fno-strict-aliasing -D_FORTIFY_SOURCE=2 -ftrapv -fno-builtin-memset \
-fstack-protector-all -std=gnu99 -fPIE -Wl,-z,relro -Wl,-z,now \
-Wl,-z,noexecstack -fstack-protector-all -pie conftest.c \
-lcrypto -lrt -ldl -lutil -lz
# ldd conftest |grep libcrypto
libcrypto.so.6 => /lib64/libcrypto.so.6 (0x00002b5fc6c3e000)
использует старую библиотеку OpenSSL.
Когда -L/opt/openssl-1.0.2h/lib
добавляется в качестве аргумента, conftest
не может работать, потому что динамический загрузчик (ld.so
) не может найти libcrypto.so.1.0.0
:
# ./conftest
./conftest: error while loading shared libraries: libcrypto.so.1.0.0: cannot open shared object file: No such file or directory
# ldd conftest | grep libcrypto
libcrypto.so.1.0.0 => not found
Но когда я делаю LD_LIBRARY_PATH
переменных окружения пункта /opt/openssl-1.0.2h/lib
, динамический загрузчик находит файл библиотеки libcrypto.so.1.0.0
, и поэтому исполняемый файл conftest
работает правильно - он использует новую библиотеку OpenSSL:
# export LD_LIBRARY_PATH=/opt/openssl-1.0.2h/lib
# ./conftest
1000208f (OpenSSL 1.0.2h 3 May 2016)
# ldd conftest
libcrypto.so.1.0.0 => /opt/openssl-1.0.2h/lib/libcrypto.so.1.0.0 (0x00002b450bf97000)
Также смотрите [Построение OpenSSH для OS X?] (Http://superuser.com/a/961422/173513) на Super User. Он включает рецепт, который я использовал. Я использовал общий рецепт для OS X и Linux. – jww