2016-09-01 8 views
2

Я пытаюсь построить 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) 
+0

Также смотрите [Построение OpenSSH для OS X?] (Http://superuser.com/a/961422/173513) на Super User. Он включает рецепт, который я использовал. Я использовал общий рецепт для OS X и Linux. – jww

ответ

2

Экспорт переменной LD_LIBRARY_PATH среда, которая должна держать каталог, в котором новые OpenSSL файлы библиотек являются, и запустить configure скрипт:

# export LD_LIBRARY_PATH=/opt/openssl-1.0.2h/lib 
# ./configure CFLAGS="-I/opt/openssl-1.0.2h/include" \ 
--prefix=/opt/openssh-7.3p1 \ 
--with-ldflags="-L/opt/openssl-1.0.2h/lib" 

Обе команды также могут быть объединены только в одном:

# LD_LIBRARY_PATH=/opt/openssl-1.0.2h/lib ./configure \ 
CFLAGS="-I/opt/openssl-1.0.2h/include" \ 
--prefix=/opt/openssh-7.3p1 \ 
--with-ldflags="-L/opt/openssl-1.0.2h/lib" 

И это результат:

OpenSSH has been configured with the following options: 
        User binaries: /opt/openssh-7.3p1/bin 
        System binaries: /opt/openssh-7.3p1/sbin 
       Configuration files: /opt/openssh-7.3p1/etc 
        Askpass program: /opt/openssh-7.3p1/libexec/ssh-askpass 
         Manual pages: /opt/openssh-7.3p1/share/man/manX 
          PID file: /var/run 
    Privilege separation chroot path: /var/empty 
      sshd default user PATH: /usr/bin:/bin:/usr/sbin:/sbin:/opt/openssh-7.3p1/bin 
        Manpage format: doc 
         PAM support: no 
        OSF SIA support: no 
       KerberosV support: no 
        SELinux support: no 
       Smartcard support: 
        S/KEY support: no 
       MD5 password support: no 
        libedit support: no 
    Solaris process contract support: no 
      Solaris project support: no 
     Solaris privilege support: no 
     IP address in $DISPLAY hack: no 
      Translate v4 in v6 hack: yes 
        BSD Auth support: no 
       Random number source: OpenSSL internal ONLY 
      Privsep sandbox style: rlimit 

       Host: x86_64-unknown-linux-gnu 
      Compiler: gcc 
    Compiler flags: -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 
Preprocessor flags: 
     Linker flags: -Wl,-z,relro -Wl,-z,now -Wl,-z,noexecstack -fstack-protector-all \ 
        -L/opt/openssl-1.0.2h/lib -pie 
     Libraries: -lcrypto -lrt -ldl -lutil -lz -lcrypt -lresolv 

Настоятельно рекомендуется использовать LD_LIBRARY_PATH в следующих шагах make и make install; в противном случае make install потерпит неудачу, потому что команда ssh-keygen запускается для генерации новых ключей хоста и он не найдет новые OpenSSH файлов библиотеки:

mkdir /opt/openssh-7.3p1/etc 
./ssh-keygen: error while loading shared libraries: libcrypto.so.1.0.0: cannot open shared object file: No such file or directory 
make: *** [host-key] Error 127 
0

Может быть, вы должны использовать опцию --with-ssl-dir для сценария конфигурации в OpenSSH:

$ ./configure --help | grep with-ssl-dir 
    --with-ssl-dir=PATH  Specify path to OpenSSL installation 

Опция --with-openssl просто логический флаг, который разрешает или запрещает openssl зависимости.

+0

Да, вы правы - ** '--with-openssl' ** - всего лишь логический флаг. Но опция '--with-ssl-dir' не избавляет от ошибки проверки версии библиотеки OpenSSL. – Jdamian

+0

Я начал использовать '--with-openssl', потому что я недавно скомпилировал и создал ** bind **, используя этот флаг, и в этом случае это был не просто логический флаг:' --with-openssl = PATH Build with OpenSSL yes | no | path.' – Jdamian

+0

Если '--with-ssl-dir' не работает, возможно, вы запрашиваете в списке рассылки openssl. – redneb

0

В дополнении к the solution предоставленному @Jdamain, мне нужно было перекомпилировать установки OpenSSL как --prefix и --openssldir в тот же каталог.