OpenSSL-1.1.1W rpm包制作与更新

环境介绍

一、 制作 OpenSSL RPM 包

1.1 安装依赖

~]# yum install rpm-build rpmlint rpmdevtools
~]# yum install -y gcc gcc-c++ make perl perl-WWW-Curl

1.2 配置 rpmbuild 工作目录

注意:
下面两个操作请不要使用 root 用户操作

创建所需目录
~]$ mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}

  • BUILD: 用于存放编译过程中生成的文件
  • BUILDROOT:用于存放编译后的根文件系统
  • RPMS:用于存放编译后的 RPM 包
  • SOURCES:用于存放源代码包
  • SPECS:用于存放 RPM 规范文件
  • SRPMS:用于存放源 RPM 包

RPM包构建的顶层目录配置
~]$ echo "%_topdir %{getenv:HOME}/rpmbuild" > ~/.rpmmacros

  • %_topdir:RPM 构建的顶层目录宏
  • %{getenv:HOME}:获取用户主目录的环境变量
  • ~/.rpmmacros:用户 RPM 配置文件

该命令将 %_topdir 宏设置为用户主目录下的 rpmbuild 目录,并将其写入用户 RPM 配置文件~/.rpmmacros中, 其目的如下两条

  • 简化 RPM 包的构建过程
  • 无需在每个 RPM 规范文件中指定 %_topdir 宏的值

1.3 将压缩包放至 ~/rpmbuild/SOURCES目录

~]$ curl -o ~/rpmbuild/SOURCES/openssl-1.1.1w.tar.gz https://www.openssl.org/source/openssl-1.1.1w.tar.gz

1.4 编写 SPEC 文件

~]$ vim ~/rpmbuild/SPECS/openssl.spec

name:       openssl     
Version: 1.1.1w
Release: 1%{?dist}
Summary: Utilities from the general purpose cryptography library with TLS implementation
Group: System Environment/Libraries
License: GPLv2+
URL: https://www.openssl.org/
Source0: https://www.openssl.org/source/%{name}-%{version}.tar.gz
BuildRequires: make gcc perl perl-WWW-Curl
Requires: %{name} = %{version}-%{release}
BuildRoot: %_topdir/BUILDROOT

%global openssldir /usr/openssl

%description
The OpenSSL toolkit provides support for secure communications between
machines.

%package devel
Summary: Secure Sockets Layer and cryptography static libraries and headers
Group: Development/Libraries
Requires: %{name} = %{version}-%{release}
%description devel
The OpenSSL devel tool

%prep
%setup -q

%build
./config --prefix=%{openssldir} --openssldir=%{openssldir}
make %{?_smp_mflags}

%install
[ "%{buildroot}" != "/" ] && %{__rm} -rf %{buildroot}
%make_install
mkdir -p %{buildroot}%{_bindir}
mkdir -p %{buildroot}%{_libdir}
ln -sf %{openssldir}/lib/libssl.so.1.1 %{buildroot}%{_libdir}
ln -sf %{openssldir}/lib/libcrypto.so.1.1 %{buildroot}%{_libdir}
ln -sf %{openssldir}/bin/openssl %{buildroot}%{_bindir}

%clean
[ "%{buildroot}" != "/" ] && %{__rm} -rf %{buildroot}

%files
%{openssldir}
%defattr(-,root,root)
%{_bindir}/openssl
%{_libdir}/libcrypto.so.1.1
%{_libdir}/libssl.so.1.1


%files devel
%{openssldir}/include/*
%defattr(-,root,root)


%post -p /sbin/ldconfig
%postun -p /sbin/ldconfig

%changelog
* Fri Mar 08 2024 wanghuaizhuang <wangjingming@live.cn>
- Build for CentOS7.9

代码附件

openssl-1.1.1w.spec

1.5 验证 SPEC 文件

没有 error 即可
~]$ rpmlint ~/rpmbuild/SPECS/openssl.spec

1.6 构建

~] $ rpmbuild -D "version 1.1.1w" -ba ~/rpmbuild/SPECS/openssl.spec

参数解释:

  • ba 构建源代码rpm包和二进制rpm包
  • bb 只构建二进制rpm包
  • bs 只构建源代码rpm包
  • bp 执行至%prep阶段(解压源并应用补丁)
  • bc 执行至%build阶段(%prep,然后编译)
  • bi 执行至%install阶段(%prep,%build,然后安装)
  • bl 验证%files部分,查看文件是否存在

图

查看构建完成的rpm包

[dev@pve-centos7 ~]$ tree ~/rpmbuild/RPMS/
/home/dev/rpmbuild/RPMS/
└── x86_64
├── openssl-1.1.1w-1.el7.x86_64.rpm
├── openssl-debuginfo-1.1.1w-1.el7.x86_64.rpm
└── openssl-devel-1.1.1w-1.el7.x86_64.rpm

1 directory, 3 files
[dev@pve-centos7 ~]$

1.7 使用上述生成的rpm包更新本地openssl

卸载和安装都要指定 --nodeps
这里让我郁闷 (>_<) , 指定了 requires, 然后安装的时候 --nodeps

[root@pve-centos7 ~]# 
[root@pve-centos7 ~]# rpm -aq | grep openssl
openssl-1.0.2k-26.el7_9.x86_64
openssl-libs-1.0.2k-26.el7_9.x86_64
openssl-devel-1.0.2k-26.el7_9.x86_64
[root@pve-centos7 ~]# rpm -e openssl-1.0.2k-26.el7_9.x86_64 --nodeps
[root@pve-centos7 ~]#
[root@pve-centos7 ~]# rpm -ivh /home/dev/rpmbuild/RPMS/x86_64/openssl-1.1.1w-1.el7.x86_64.rpm --nodeps
Preparing... ################################# [100%]
Updating / installing...
1:openssl-1.1.1w-1.el7 ################################# [100%]
[root@pve-centos7 ~]#
[root@pve-centos7 ~]# openssl version
OpenSSL 1.1.1w 11 Sep 2023
[root@pve-centos7 ~]#

一些说明

上述 SPEC文件只构建了 opensslopenssl-developenssl-debuginfo三个包, 而且 更新之后 man openssl 会提示找不到手册
对比网上其他的SPEC文件少了很多内容, 后续会继续补充

下面是某个openssl的SPEC文件
图

二、 更新 OpenSSL

  • 卸载旧版本openssl
    rpm -e openssl --nodeps
  • 安装新版openssl
    rpm -ivh openss-1.1.1w-1.el7.rpm