背景:CentOS7 已经不再维护了,有时候需要升级某些组件,网上却没有相关的资源了。尤其是制作OpenSSH 9.6+ 的RPM包,就会要求OpenSSL为1.1的版本。基于此,还是自己制作吧,以下是踩坑过程。
1、官网提供的源码包中没有包含spec文件,所以通过rpmbuild命令打包时,需要先自己构建一个openssl.rpm的文件,以下是具体内容:
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: OpenSSL
URL: http://www.openssl.org/
Source0: openssl-%{version}.tar.gz
BuildRequires: make, gcc, coreutils, krb5-devel, perl, sed, zlib-devel, perl-WWW-Curl
Requires: coreutils, make
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
%global openssldir /usr/openssl
%description
The OpenSSL toolkit provides support for secure communications between
machines. OpenSSL includes a certificate management tool and shared
libraries which provide various cryptographic algorithms and protocols.
%package libs
Summary: Shared libraries for OpenSSL
Group: System Environment/Libraries
Requires: coreutils
%description libs
Shared libraries (libcrypto and libssl) for OpenSSL.
%package devel
Summary: Development files for programs which will use the openssl library
Group: Development/Libraries
Requires: %{name}-libs = %{version}-%{release}
%description devel
OpenSSL RPM for version 1.1.1w on Centos (development package)
%prep
%setup -q
%build
./config --prefix=%{openssldir} --openssldir=%{openssldir} shared zlib -fPIC
make
%install
[ "%{buildroot}" != "/" ] && %{__rm} -rf %{buildroot}
%make_install
# Create standard directories
mkdir -p %{buildroot}%{_bindir}
mkdir -p %{buildroot}%{_libdir}
mkdir -p %{buildroot}%{_includedir}
# Create symlinks for libraries in /usr/lib64
ln -sf %{openssldir}/lib/libssl.so.1.1 %{buildroot}%{_libdir}/libssl.so.1.1
ln -sf %{openssldir}/lib/libcrypto.so.1.1 %{buildroot}%{_libdir}/libcrypto.so.1.1
# Create development symlinks
ln -sf %{openssldir}/lib/libssl.so.1.1 %{buildroot}%{_libdir}/libssl.so
ln -sf %{openssldir}/lib/libcrypto.so.1.1 %{buildroot}%{_libdir}/libcrypto.so
# Create symlink for binary
ln -sf %{openssldir}/bin/openssl %{buildroot}%{_bindir}/openssl
# Ensure pkgconfig files are included
mkdir -p %{buildroot}%{_libdir}/pkgconfig
cp -p %{buildroot}%{openssldir}/lib/pkgconfig/*.pc %{buildroot}%{_libdir}/pkgconfig/
%clean
[ "%{buildroot}" != "/" ] && %{__rm} -rf %{buildroot}
%files
%defattr(-,root,root)
%{_bindir}/openssl
%{openssldir}/bin/*
# Configuration files
%{openssldir}/ct_log_list.cnf
%{openssldir}/ct_log_list.cnf.dist
%{openssldir}/openssl.cnf
%{openssldir}/openssl.cnf.dist
# Misc scripts
%{openssldir}/misc/*
# Documentation
%{openssldir}/share/*
%files libs
%defattr(-,root,root)
%{_libdir}/libcrypto.so.1.1
%{_libdir}/libssl.so.1.1
%{openssldir}/lib/engines-1.1/*.so
%{openssldir}/lib/pkgconfig/*.pc
# Libraries in openssldir
%{openssldir}/lib/libcrypto.so.1.1
%{openssldir}/lib/libssl.so.1.1
%files devel
%defattr(-,root,root)
%{openssldir}/include/*
%{_libdir}/libcrypto.so
%{_libdir}/libssl.so
%{_libdir}/pkgconfig/*.pc
# Development libraries
%{openssldir}/lib/libcrypto.a
%{openssldir}/lib/libcrypto.so
%{openssldir}/lib/libssl.a
%{openssldir}/lib/libssl.so
%post libs -p /sbin/ldconfig
%postun libs -p /sbin/ldconfig
将openssl.spec文件放在/root/rpmbuild/SPECS目录下,然后执行如下命令:
rpmbuild -bb openssl.spec
3.如果出现如下错误:
[root@~ SPECS]# rpmbuild -bb openssl.spec
error: Failed build dependencies:
perl-WWW-Curl is needed by openssl-1.1.1w-1.el7.centos.x86_64
[root@~ SPECS]#
则需要安装perl-WWW-Curl :
[root@~ SPECS]# yum install -y perl-WWW-Curl
4. 重新执行命令:
rpmbuild -bb openssl.spec
如果不出意外,应该就能制作成功了。
下面介绍下升级OpenSSL 1.1版本,以及制作OpenSSH 9.6+版本的RPM包时需要注意的问题 。
之前的博客有介绍,如果OpenSSH 9.6+版本需要兼容老的客户端时,需要进行配置,同时,打包时,需要将with-ssl的开关打开,然后再进行编译,OpenSSH的spec文件,默认是不带openssl进行打包的。
先升级OpenSSL到1.1.1的版本,因为机器上已经安装了OpenSSL 1.0,升级可能导致某些依赖组件不匹配。所以,只能采取强制升级的操作:
rpm -Uvh openssl* --nodeps --force
升级成功之后,如果打包OpenSSH时,遇到如下错误:
checking if getpgrp accepts zero args... yes
checking for openssl... /usr/bin/openssl
checking for openssl/opensslv.h... no
configure: error: *** OpenSSL headers missing - please install first or check config.log ***
error: Bad exit status from /var/tmp/rpm-tmp.t8CMn3 (%build)
则需要修改下OpenSSH.spec文件,使其打包时,读取的是1.1的OpenSSL,找到%build的位置,加入如下内容:
%build
export PKG_CONFIG_PATH=/usr/lib64/pkgconfig
export LDFLAGS="-L/usr/lib64"
export CPPFLAGS="-I/usr/openssl/include"
然后再执行打包OpenSSH的命令:
rpmbuild -bb openssh.spec
如果没有其他错误,则会打包成功,且是携带OpenSSL的版本。