如何从 /usr/local 强制使用 OpenSSL

如何从 /usr/local 强制使用 OpenSSL

我有一台带有 64 位 ARM CPU 和 AES 指令集的单板计算机。提供的 Debian 8 Jessie Mate Desktop 映像使用 OpenSSL 1.0.1k 版本,无法使用该加速。

我已经从源代码构建了 OpenSSL 1.0.2n,并启用了加速并将其安装到 /usr/local。

这个答案解释了如何从命令行访问它,它工作正常,但我该怎么办强制所有程序和守护进程使用这个 /usr/local 版本?

由于依赖关系(= 无符号链接),无法卸载原始 OpenSSL 包。那么使这两者共存并使用 /usr/local 中的一个的正确方法是什么?

注意:我知道我有责任保持 /usr/local OpenSSL 更新。

答案1

您确定应用程序还没有使用它吗?如果您检查 的输出ldconfig -v,哪个 OpenSSL 库首先显示在输出中?

默认情况下,基于 Debian 的系统(我确信大多数其他遵循 FHS 的 Linux 系统)会/usr/local/lib在搜索/usr/lib.这意味着自安装您自己的自定义版本以来您启动的任何使用 OpenSSL 的应用程序应该在 中的版本之前使用它/usr/lib

您可以通过使用ldd链接到 OpenSSL 的二进制文件来确认这一点。例如:

$ ldd /usr/sbin/nginx
...
        libssl.so.1.1 => /usr/lib/x86_64-linux-gnu/libssl.so.1.1 (0x00007fd50f80b000)
...

请注意路径libssl- 这就是它将使用的版本,即使系统上有多个副本。

如果您的 OpenSSL 自定义版本位于下面的目录中/usr/local/lib(例如/usr/local/lib/ssl),并且您发现 没有找到它ld,则可以将该目录添加到新文件中/etc/ld.so.conf.d并重新运行ldconfig(请务必使用该-v选项,以便它显示定义的搜索路径中所有库的名称)。

答案2

要强制使用/usr/local环境变量中存在的任何库LD_LIBRARY_PATH,可以使用以下命令:

export LD_LIBRARY_PATH=/usr/local/lib64:/usr/local/lib:/usr/lib

这可以通过以下方式验证

ldd /usr/bin/target-application
ldd /usr/bin/target-application | grep ssl
export LD_LIBRARY_PATH=/usr/local/lib64:/usr/local/lib:/usr/lib
ldd /usr/bin/target-application
ldd /usr/bin/target-application | grep ssl

设置LD_LIBRARY_PATH和验证后,当我们启动应用程序(从同一个 shell)时,它将使用位于/usr/local.

此外,我们可以使用的另一个环境变量是LD_PRELOAD目标应用程序是否仍在使用错误的库。

或者,如果目标应用程序是从源代码构建的,则可以在构建期间将其链接到目标库,下面是如何针对安装的不同 Openssl 版本构建应用程序的示例/usr/local(这是使用 PHP 和 Openwall John 与Openssl v1.1.1x)

./configure --with-openssl=/usr/local CFLAGS=-I/usr/local/include 
LDFLAGS=-L/usr/local/lib64 LIBS="-lpthread" \
OPENSSL_LIBS="-L/usr/local/lib64 -l:libssl.a -l:libcrypto.a -ldl -lpthread" \
OPENSSL_CFLAGS="-I/usr/local/include"

相关内容