一、
前言:
opensssl是什么软件?openssl的版本是怎样的?为什么需要升级openssl?如何升级openssl?
1、openssl是一个什么样软件?
OpenSSL是一个开源的安全套接字层(Secure Sockets Layer,SSL)和传输层安全(Transport Layer Security,TLS)协议的实现软件。它提供了强大的加密功能,包括加密算法、哈希函数、随机数生成器等,用于实现互联网通信的安全,如网站的HTTPS加密、TLS/SSL协议的握手、证书管理等。
OpenSSL项目不仅提供了命令行工具,用于加密解密数据、生成密钥对、管理证书等操作,还提供了一套丰富的编程库(C语言接口),允许开发者在自己的应用程序中使用这些加密技术。因此,OpenSSL被广泛应用于各种服务器软件、Web服务器、操作系统、嵌入式设备以及各种需要安全通信的软件产品中。
OpenSSL 是许多软件和系统的强依赖,因为它提供了关键的安全功能,包括加密、解密、证书管理等。以下是一些依赖于 OpenSSL 的重要软件和技术:
-
Web 服务器:如 Apache HTTP Server 和 Nginx,它们依靠 OpenSSL 来实现 HTTPS 加密通信,保护网站数据传输的安全。
-
数据库系统:包括 MySQL、PostgreSQL 等数据库软件,使用 OpenSSL 来加密数据库连接,确保数据存储和访问的安全性。
-
编程语言及其库:如 Python、Ruby、PHP、Node.js(通过其libcrypto和libssl库)等,它们在处理安全连接、加密数据时,直接或间接依赖于 OpenSSL。
-
操作系统:大多数Linux发行版(如Ubuntu、Debian、Fedora、CentOS等)、BSD系统以及macOS,都将OpenSSL作为系统的一部分,用于系统级的加密服务和其他安全功能。
-
邮件服务器:例如Postfix、Dovecot,利用OpenSSL加密邮件传输,支持SMTPS、IMAPS等安全协议。
-
虚拟化和云平台:如OpenStack、VMware等,在管理虚拟机和云服务时,使用OpenSSL来保障通信安全。
-
移动应用和嵌入式系统:很多手机应用和物联网(IoT)设备中的软件也依赖OpenSSL进行安全通信和数据保护
-
包管理器:包括但不限于apt(通过libssl-dev)、yum/dnf、zypper等,需要OpenSSL来安全地从远程仓库获取和验证软件包。
-
SSL/TLS客户端和库:如curl、wget、libcurl等,它们在发起HTTPs请求或实现安全的数据传输时,依赖OpenSSL
2、
OpenSSL的版本问题
OpenSSL的版本不断更新以修复安全漏洞、增加新特性及改进性能。由于版本迭代频繁,具体版本信息会随时间变化,但大致可以分为以下几个类别:
-
长期支持(LTS)版本:这些版本承诺提供多年的维护和支持,适合那些需要高度稳定性和长期安全更新的应用场景。例如,OpenSSL 1.0.2系列曾是一个LTS版本,虽已过期,但在其生命周期内得到了广泛使用。当前的LTS版本是OpenSSL 1.1.1系列,该系列增加了对TLS 1.3的支持,并持续接收安全更新和错误修正。
-
主流版本:除了LTS版本,OpenSSL项目还会发布一些非LTS的主要版本,这些版本包含最新的特性和改进,但支持周期相对较短。例如,随着OpenSSL 3.0.0在2021年9月的发布,它成为了最新的主流版本,带来了重大的内部架构变化、新特性和安全性增强。
-
维护更新和补丁版本:在每个主版本下,会有多个小版本和补丁级别的更新,用以修复发现的安全漏洞和问题。这些更新通常以版本号的第三位数字表示,如OpenSSL 1.1.1a到1.1.1k等。
例如,centos7.7版本默认的OpenSSL的版本如下:
[root@centos10 ~]# cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)
[root@centos10 ~]# openssl version
OpenSSL 1.0.2k-fips 26 Jan 2017
OpenSSL 1.0.2k-fips
表示这是OpenSSL 1.0.2系列的一个特定版本,其中包含了FIPS(Federal Information Processing Standards,联邦信息处理标准)兼容模块。这里的"FIPS"指的是该版本经过了美国政府的FIPS 140-2(或者后续的FIPS 140-3)标准认证,这是一个评估加密模块安全性的标准。获得FIPS认证意味着该软件满足了美国政府对于加密算法的严格要求,这对于需要遵循政府安全规范的机构和系统尤为重要,尤其是在处理敏感或机密信息的环境下。
具体来说:
- 1.0.2 表示这是OpenSSL 1.0.2系列的版本。
- k 是在这个系列中的一个子版本标记,表明它是一个维护更新或安全修复的版本。
- -fips 表明此版本包含了符合FIPS 140标准的加密模块,适用于需要遵循FIPS合规要求的系统部署。
使用"FIPS Mode"的OpenSSL会限制可使用的加密算法和操作模式到那些被FIPS标准所批准的范围内,确保所有加密操作都符合规范。
3、
OpenSSL为什么需要升级?
简单的一句话就可以概括:每一个软件都有bug,迭代升级的软件也会有更多的功能,因此,为了安全方面以及性能方面的考虑,必须要不断的升级软件,而操作系统自带的软件通常不是有安全方面的问题就是性能方面的问题
二、
升级的大体流程
1、获取新软件
2、安装新软件
3、如果新安装的软件有问题,并不能达到自身期望,需要回滚
4、如果新安装的软件没有问题,符合自身预期,需要测试软件的各个方面是否正常
5、清理安装过程产生的多余垃圾,确认完成升级工作
那么,很显然采用编译安装是比较方便的方式,因为编译安装一次后,就可以在其它的同类型的服务器上部署了,不需要再次编译
当你在一个服务器上从源代码编译安装OpenSSL后,生成的可执行文件、库文件以及其他必要的组件通常是静态的或已经编译为可在目标系统上直接运行的格式。这意味着,你不需要在其他服务器上再次编译OpenSSL,可以直接将编译好的产物复制或分发到其他服务器上重复使用。
不过,要注意以下几点:
- 系统兼容性:确保目标服务器的操作系统和架构(如x86、x86_64、ARM等)与编译OpenSSL的服务器相匹配。不同的操作系统或架构可能会导致二进制不兼容。
- 动态链接与静态链接:
- 动态链接:如果OpenSSL是以动态库的形式编译(默认情况下经常如此),你需要将相应的动态库文件(如
libssl.so*
和libcrypto.so*
)复制到目标服务器的适当库目录下(如/usr/lib
或/usr/local/lib
),并确保LD_LIBRARY_PATH环境变量包含了这些库的路径。 - 静态链接:如果你在编译OpenSSL时选择了静态链接,则生成的可执行文件会包含OpenSSL的所有必要代码,这样就不需要在目标服务器上安装额外的OpenSSL库文件了。
- 动态链接:如果OpenSSL是以动态库的形式编译(默认情况下经常如此),你需要将相应的动态库文件(如
- 配置与环境变量:某些程序或脚本可能需要知道OpenSSL的安装位置,特别是当它没有安装在标准路径下时。这可能涉及到修改PATH环境变量或特定应用的配置文件来指向正确的OpenSSL头文件和库文件路径。
- 权限与依赖:复制文件到目标服务器后,确保适当的权限设置,以免因权限问题影响程序的正常运行。同时,确认目标服务器上没有缺失OpenSSL运行所依赖的其他库或组件。
三、
升级OpenSSL步骤
1、
[ 3.3 ] - /source/old/3.3/index.html
在该网站下载OpenSSL的源码安装包,本次下载的是openssl-3.3.0.tar.gz
2、
解压openssl
tar xf openssl-3.3.0.tar.gz
3、
切换到解压后的目录
cd openssl-3.3.0
4、
安装编译所需的依赖
yum install perl-IPC-Cmd perl-Data-Dumper gcc gcc-c++ perl perl-devel -y
5、
预编译和编译
预编译命令
./Configure --prefix=/usr/local/openssl/
输出如下:
[root@centos10 openssl-3.3.0]# ./Configure --prefix=/usr/local/openssl/
Configuring OpenSSL version 3.3.0 for target linux-x86_64
Using os-specific seed configuration
Created configdata.pm
Running configdata.pm
Created Makefile.in
Created Makefile
**********************************************************************
*** ***
*** OpenSSL has been successfully configured ***
*** ***
*** If you encounter a problem while building, please open an ***
*** issue on GitHub <https://github.com/openssl/openssl/issues> ***
*** and include the output from the following command: ***
*** ***
*** perl configdata.pm --dump ***
*** ***
*** (If you are new to OpenSSL, you might want to consult the ***
*** 'Troubleshooting' section in the INSTALL.md file first) ***
*** ***
**********************************************************************
编译和编译安装命令
make && make install
编译安装完成的最后日志大概如下:
install doc/html/man7/provider-encoder.html -> /usr/local/openssl//share/doc/openssl/html/man7/provider-encoder.html
install doc/html/man7/provider-kdf.html -> /usr/local/openssl//share/doc/openssl/html/man7/provider-kdf.html
install doc/html/man7/provider-kem.html -> /usr/local/openssl//share/doc/openssl/html/man7/provider-kem.html
install doc/html/man7/provider-keyexch.html -> /usr/local/openssl//share/doc/openssl/html/man7/provider-keyexch.html
install doc/html/man7/provider-keymgmt.html -> /usr/local/openssl//share/doc/openssl/html/man7/provider-keymgmt.html
install doc/html/man7/provider-mac.html -> /usr/local/openssl//share/doc/openssl/html/man7/provider-mac.html
install doc/html/man7/provider-object.html -> /usr/local/openssl//share/doc/openssl/html/man7/provider-object.html
install doc/html/man7/provider-rand.html -> /usr/local/openssl//share/doc/openssl/html/man7/provider-rand.html
install doc/html/man7/provider-signature.html -> /usr/local/openssl//share/doc/openssl/html/man7/provider-signature.html
install doc/html/man7/provider-storemgmt.html -> /usr/local/openssl//share/doc/openssl/html/man7/provider-storemgmt.html
install doc/html/man7/provider.html -> /usr/local/openssl//share/doc/openssl/html/man7/provider.html
install doc/html/man7/proxy-certificates.html -> /usr/local/openssl//share/doc/openssl/html/man7/proxy-certificates.html
install doc/html/man7/x509.html -> /usr/local/openssl//share/doc/openssl/html/man7/x509.html
6、
备份旧的OpenSSL,链接新OpenSSL的库文件
mv /usr/bin/openssl{,.bak}
ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/openssl/include/openssl /usr/include/openssl
此时检查OpenSSL,看看依赖是否正常,可以看到缺失依赖:
[root@centos10 openssl-3.3.0]# ldd /usr/bin/openssl
linux-vdso.so.1 => (0x00007fffd0ddb000)
libssl.so.3 => not found
libcrypto.so.3 => not found
libdl.so.2 => /lib64/libdl.so.2 (0x00007f260f893000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f260f677000)
libc.so.6 => /lib64/libc.so.6 (0x00007f260f2a9000)
/lib64/ld-linux-x86-64.so.2 (0x00007f260fa97000)
解决方法:在/etc/ld.so.conf这个文件末尾添加如下两行,并重新激活动态链接库
/usr/local/openssl/lib/
/usr/local/openssl/lib64/
激活上面的路径
ldconfig -v
再次检查openssl这个可执行文件是否缺失依赖:可以看到前面缺失的库已经装载到内存了,OpenSSL可以使用了
[root@centos10 openssl-3.3.0]# ldd /usr/bin/openssl
linux-vdso.so.1 => (0x00007ffd6b1f3000)
libssl.so.3 => /usr/local/openssl/lib64/libssl.so.3 (0x00007febf16dc000)
libcrypto.so.3 => /usr/local/openssl/lib64/libcrypto.so.3 (0x00007febf1027000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007febf0e23000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007febf0c07000)
libc.so.6 => /lib64/libc.so.6 (0x00007febf0839000)
/lib64/ld-linux-x86-64.so.2 (0x00007febf19d9000)
检查OpenSSL的版本,确认升级正常:
[root@centos10 openssl-3.3.0]# openssl version -a
OpenSSL 3.3.0 9 Apr 2024 (Library: OpenSSL 3.3.0 9 Apr 2024)
built on: Sat Jul 6 11:22:31 2024 UTC
platform: linux-x86_64
options: bn(64,64)
compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -O3 -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_BUILDING_OPENSSL -DNDEBUG
OPENSSLDIR: "/usr/local/openssl/ssl"
ENGINESDIR: "/usr/local/openssl//lib64/engines-3"
MODULESDIR: "/usr/local/openssl//lib64/ossl-modules"
Seeding source: os-specific
CPUINFO: OPENSSL_ia32cap=0xfffa32234f8bffff:0x1840071c219c27eb
四、
测试OpenSSL是否可以正常工作
-
查看版本信息:首先,你可以直接通过命令行检查OpenSSL的版本号,确认是否已更新到预期的版本。
打开终端,输入以下命令:
openssl version -a
如果升级成功,这条命令将显示新安装的OpenSSL版本号。
-
检查SSL/TLS协议支持:新版本的OpenSSL可能支持更多或更新的SSL/TLS协议版本。你可以检查这些协议的支持情况:
openssl ciphers -v 'ALL:!aNULL:!eNULL'
这个命令会列出所有可用的加密套件和它们所支持的协议版本。
-
测试加密和解密功能:执行一个简单的加密和解密测试,以验证OpenSSL的常规功能是否正常工作:
echo "test message" | openssl enc -aes-256-cbc -a -salt -iter 10000 -pass pass:testpassword
输出如下:上面的命令会对"test message"这个消息进行AES-256-CBC加密,并使用"testpassword"作为口令。解密:
-
[root@centos10 openssl-3.3.0]# echo "U2FsdGVkX18U9LnaQo3XPMlj8gr/GKe7/W6DrWKLUtk=" | openssl enc -d -aes-256-cbc -a -salt -iter 10000 -pass pass:testpassword test message
回退方法
上面的第六步反向操作即可