我有一个预编译的OpenSSL库(libssl.a和libcrypto.a),用于我的C++应用程序。我不知道OpenSSL库的版本。
是否有办法从这些预编译的库中获取版本号?
库中有一个包含版本详细信息的字符串,名为SSLEAY_VERSION - 它看起来像:
OpenSSL 0.9.5a 1 Apr 2000
OpenSSL 1.0.1e-fips 11 Feb 2013
您可以使用strings和grep从二进制库中找到它:
strings libcrypto.so | grep "^OpenSSL \S\+ [0-9]\+ \S\+ [0-9]\+"
和
基本上,您需要使用以下函数:
SSLeay()
SSLeay_version()
好的,过滤器可能并不总是有效。你可以这样做:
strings libssl.so | grep "^OpenSSL"
OpenSSLDie
OpenSSL 1.0.2n 7 Dec 2017
strings libcrypto.so | grep "^OpenSSL"
OpenSSLDie
OpenSSL_add_all_ciphers
OpenSSL_add_all_digests
OpenSSL 1.0.2n 7 Dec 2017
OpenSSL HMAC method
OpenSSL EC algorithm
OpenSSL RSA method
OpenSSL DSA method
OpenSSL ECDSA method
OpenSSL DH Method
OpenSSL X9.42 DH method
OpenSSL PKCS#3 DH method
OpenSSL ECDH method
OpenSSL 'dlfcn' shared library method
OpenSSL default
OpenSSL default user interface
OpenSSL CMAC method
我需要一个在没有安装strings
的系统上工作的变体,这与https://dev59.com/G2Ag5IYBdhLWcg3wrMh4#26635393有足够的不同之处,因此将其发布为自己的答案似乎是值得的:
grep --text -o 'OpenSSL [[:digit:]][^ ]*' /file/to/check
--text
参数允许直接检查二进制文件,-o
参数通过仅打印匹配文本来解决缺少行分隔符的问题。
值得注意的一点是,无论是这个答案还是基于 strings
的答案:除了检查 libssl
或 libcrypto
的 OpenSSL 版本之外,它们还适用于检查静态链接二进制文件中的 OpenSSL 版本。
在Debian上,您可以询问软件包管理器:
# apt list -a openssl
Listing... Done
openssl/stable-security,now 1.1.1n-0+deb11u4 amd64 [installed,automatic]
openssl/stable 1.1.1n-0+deb11u3 amd64
$ dnf list --all openssl
Last metadata expiration check: 0:01:53 ago on Mon 13 Mar 2023 01:14:50 PM UTC.
Installed Packages
openssl.x86_64 1:1.1.1k-6.el8_5 @Common