如何强制 Debian 使用较新版本的 OpenSSL?

如何强制 Debian 使用较新版本的 OpenSSL?

今天我在我的 VirtualBox 上安装了 ,,empty''(只是最小的软件包集)Debian 8.1。我想尝试从源代码编译应用程序。

我从 OpenSSL 开始:从 OpenSSL 1.0.1p 源代码编译。

user@debian8:/$ /opt/openssl/bin/openssl version
OpenSSL 1.0.1p 9 Jul 2015
user@debian8:/$ ldd /opt/openssl/bin/openssl
        linux-gate.so.1 (0xb76ed000)
        libssl.so.1.0.0 => /opt/openssl/lib/libssl.so.1.0.0 (0xb767c000)
        libcrypto.so.1.0.0 => /opt/openssl/lib/libcrypto.so.1.0.0 (0xb748a000)
        libdl.so.2 => /lib/i386-linux-gnu/i686/cmov/libdl.so.2 (0xb747f000)
        libc.so.6 => /lib/i386-linux-gnu/i686/cmov/libc.so.6 (0xb72d5000)
        /lib/ld-linux.so.2 (0xb76f0000)

然后是OpenSSH。我遇到的第一个问题是./configure抱怨我的 OpenSSL 标头 (1.0.1p) 的版本与 OpenSSL 库的版本 (1.0.1k) 不匹配。我发现,apt只安装了 OpenSSL 1.0.1k 的库。所以我做了:

LD_LIBRARY_PATH=/opt/openssl/lib ./configure (..params...) --with-ssl-dir=/opt/openssl/lib
LD_LIBRARY_PATH=/opt/openssl/lib make
sudo make install

这奏效了。

但是:(注意版本 OpenSSL 1.0.1k 和 的路径libcrypto.so

user@debian8:/opt/openssh/bin$ ./ssh -V
OpenSSH_7.0p1, OpenSSL 1.0.1k 8 Jan 2015
user@debian8:/opt/openssh/bin$ ldd ssh
        linux-gate.so.1 (0xb770b000)
        libresolv.so.2 => /lib/i386-linux-gnu/i686/cmov/libresolv.so.2 (0xb761d000)
        libcrypto.so.1.0.0 => /usr/lib/i386-linux-gnu/i686/cmov/libcrypto.so.1.0.0 (0xb7451000)
        libdl.so.2 => /lib/i386-linux-gnu/i686/cmov/libdl.so.2 (0xb744b000)
        libutil.so.1 => /lib/i386-linux-gnu/i686/cmov/libutil.so.1 (0xb7447000)
        libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0xb742a000)
        libnsl.so.1 => /lib/i386-linux-gnu/i686/cmov/libnsl.so.1 (0xb7411000)
        libcrypt.so.1 => /lib/i386-linux-gnu/i686/cmov/libcrypt.so.1 (0xb73e0000)
        libc.so.6 => /lib/i386-linux-gnu/i686/cmov/libc.so.6 (0xb7235000)
        /lib/ld-linux.so.2 (0xb770e000)

再次,添加LD_LIBRARY_PATH帮助:

user@debian8:/opt/openssh/bin$ LD_LIBRARY_PATH=/opt/openssl/lib ./ssh -V
OpenSSH_7.0p1, OpenSSL 1.0.1p 9 Jul 2015
user@debian8:/opt/openssh/bin$ LD_LIBRARY_PATH=/opt/openssl/lib ldd ssh
        linux-gate.so.1 (0xb776f000)
        libresolv.so.2 => /lib/i386-linux-gnu/i686/cmov/libresolv.so.2 (0xb7681000)
        libcrypto.so.1.0.0 => /opt/openssl/lib/libcrypto.so.1.0.0 (0xb748f000)
        libdl.so.2 => /lib/i386-linux-gnu/i686/cmov/libdl.so.2 (0xb7489000)
        libutil.so.1 => /lib/i386-linux-gnu/i686/cmov/libutil.so.1 (0xb7485000)
        libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0xb7468000)
        libnsl.so.1 => /lib/i386-linux-gnu/i686/cmov/libnsl.so.1 (0xb744f000)
        libcrypt.so.1 => /lib/i386-linux-gnu/i686/cmov/libcrypt.so.1 (0xb741e000)
        libc.so.6 => /lib/i386-linux-gnu/i686/cmov/libc.so.6 (0xb7273000)
        /lib/ld-linux.so.2 (0xb7772000)

我当然测试了是否sshd有效:它在 22 上监听,我可以与 PuTTY 连接。

现在我的问题是:

  1. 也许我做错了什么?
  2. 如何在不添加 LD_LIBRARY_PATH 的情况下通过 OpenSSH 强制使用 OpenSSL 版本 1.0.1p (我尝试使用/etc/ld.so.conf.d/,但没有任何效果:ldconfig看到/opt/openssl/lib,但它不生成sshsshd使用 1.0.1p)。
  3. 为什么要openssl使用ldd openssl正确的路径而无需任何LD_LIBRARY_PATHing?

答案1

man ld.so参阅 参考资料 动态链接器的文档。要给予您自己编译的 OpenSSL 优先级,请将其放入/usr/local/lib.添加新的搜索路径/etc/ld.so.conf.d应该也可以,也许你放得太晚了?尝试

LD_DEBUG=libs /lib64/ld-linux-x86-64.so.2 --list /usr/bin/ssh

获得洞察力。对于您自编译的二进制文件,RPATH 设置可能会帮助它找到自己的库,请检查

objdump -x /opt/openssl/bin/openssl | grep RPATH

(取自https://stackoverflow.com/questions/2836330/is-there-a-way-to-inspect-the-current-rpath-on-linux)。

相关内容