![如何从 /usr/local 强制使用 OpenSSL](https://linux22.com/image/129812/%E5%A6%82%E4%BD%95%E4%BB%8E%20%2Fusr%2Flocal%20%E5%BC%BA%E5%88%B6%E4%BD%BF%E7%94%A8%20OpenSSL.png)
我有一台带有 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"