升级openssl影响
在 CentOS(或者 RHEL 系)里,要判断 哪些软件依赖 OpenSSL,可以用几个不同层级的办法:
1️⃣ 查询已安装软件包依赖(RPM 层面)
# 哪些包依赖 openssl-libs
rpm -q --whatrequires openssl-libs# 或者
repoquery --whatrequires openssl-libs
-
openssl-libs
是 OpenSSL 的核心共享库(libcrypto.so
、libssl.so
)。 -
输出结果会列出所有依赖它的 RPM 包(如
curl
、git
、python
、nginx
等)。
2️⃣ 查询某个二进制是否链接了 OpenSSL(动态库层面)
ldd $(which curl) | grep ssl
ldd $(which python3) | grep ssl
ldd $(which nginx) | grep ssl
-
如果能看到
libssl.so
或libcrypto.so
,说明这个程序运行时会调用 OpenSSL。
也可以批量扫描:
for bin in $(which curl git ssh nginx 2>/dev/null); doecho "[$bin]"ldd $bin | grep ssl || echo " -> no ssl linked"
done
3️⃣ 运行时调用层面(动态确认)
如果你想确认哪些进程实际在使用 OpenSSL,可以:
lsof | grep libssl
会列出哪些正在运行的进程打开了 libssl.so.*
。
4️⃣ 源码/构建依赖层面
有些软件虽然安装时没直接依赖 OpenSSL RPM,但编译时会选择:
-
OpenSSL(常见:curl、git、nginx、postgres)
-
GnuTLS 或 NSS 作为替代
可以查某个包的编译选项:
rpm -qi <package>
rpm -ql <package> | grep ssl
⚡ 总结
-
系统级依赖 →
rpm -q --whatrequires openssl-libs
-
二进制级依赖 →
ldd /path/to/bin | grep ssl
-
运行时依赖 →
lsof | grep libssl
好问题 👍,你关心的是 C / Go 编译后的二进制,OpenSSL 升级后是否会因 ABI / API 不兼容而崩溃。
可以从几个角度来判断:
1️⃣ 区分编译时依赖类型
C 程序
-
静态编译(static link)
-
如果编译时把
libssl.a
、libcrypto.a
链接进二进制 → 不依赖系统升级,不受影响。 -
判断方法:
ldd ./mybin | grep ssl
如果没显示
libssl.so
/libcrypto.so
,那就是静态编译(或完全没用到 OpenSSL)。
-
-
动态编译(dynamic link)
-
如果链接了
libssl.so
、libcrypto.so
,升级 OpenSSL 可能导致:-
ABI 变动:符号(函数、变量)不兼容 → 程序启动时报
undefined symbol
。 -
API 行为变更:函数签名相同但逻辑不同 → 程序运行中出错。
-
-
判断方法:
objdump -p ./mybin | grep NEEDED | grep ssl nm -D ./mybin | grep SSL_
能看到
libssl.so.x
就是动态依赖。
-
Go 程序
Go 本身默认 不依赖系统 OpenSSL,而是使用 标准库 crypto/tls(纯 Go 实现)。
但以下情况会依赖 OpenSSL:
-
使用了
cgo
调用 OpenSSL 库(如github.com/spacemonkeygo/openssl
) -
用了
go-openssl
或绑定了libssl
的包
判断方法:
ldd ./my-go-bin | grep ssl
-
没有 → 说明不依赖系统 OpenSSL(安全)
-
有 → 说明 cgo 链接了 OpenSSL,升级后可能受影响
2️⃣ 判断兼容性风险
-
小版本升级(如 1.1.1k → 1.1.1w)
-
ABI 稳定,不会破坏动态依赖。
-
-
跨大版本升级(如 1.0.2 → 1.1.1 或 1.1.1 → 3.x)
-
ABI / API 都会变,很多老二进制会直接崩溃(
undefined symbol: SSLv23_client_method
等)。
-
3️⃣ 验证是否安全运行
在升级前,可以做两种测试:
方法 A:用 ldd
验证
ldd ./mybin | grep ssl
看依赖的具体 libssl.so
版本,例如:
libssl.so.1.1 => /lib64/libssl.so.1.1
-
如果新系统没有这个 so 版本 → 程序会直接起不来。
-
如果新版本提供兼容符号链接(例如
libssl.so.3
软链到libssl.so.1.1
) → 可能还能跑,但要测试。
方法 B:在新环境运行测试
最靠谱的方式:
-
在测试机 / 容器里安装升级后的 OpenSSL
-
直接运行你的二进制,看是否报错
./mybin
-
如果报错,典型现象:
./mybin: symbol lookup error: ./mybin: undefined symbol: SSL_library_init
4️⃣ 建议的检查脚本
我可以给你写一个小脚本,自动检测目录下所有二进制:
#!/bin/bash
for bin in $(find . -type f -perm -111); dodeps=$(ldd $bin 2>/dev/null | grep ssl)if [ -n "$deps" ]; thenecho "[可能依赖 OpenSSL] $bin"echo "$deps"fi
done
这样能快速列出所有依赖 OpenSSL 的程序,升级前后跑一下对比。
✅ 总结
-
C 程序:看是动态还是静态链接,动态依赖要特别小心跨大版本升级。
-
Go 程序:默认不依赖 OpenSSL,除非用了 cgo 封装库。
-
判断方法:
ldd
、objdump -p
、nm -D
。 -
最终验证:在新 OpenSSL 环境实际跑一遍。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/920991.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!