在 2021 年 9 月 7 日,OpenSSL 3.0.0 正式发布了。本文介绍一下在 CentOS 7 平台上编译 OpenSSL 3.0.0 源码的过程。首先检查一下操作系统和编译相关软件(包括Perl、GCC)的版本信息,检查结果如下图:
从图中可知当前使用的操作系统是 CentOS 7.9,已经安装了 GCC v4.8.5、Perl v5.16.3。OpenSSL 3.0.0 的下载地址是 https://www.openssl.org/source/openssl-3.0.0.tar.gz ,如果使用 wget 命令下载 OpenSSL 3.0.0 会报错,错误提示信息如下:
ERROR: cannot verify www.openssl.org's certificate, issued by '/C=US/O=Let's Encrypt/CN=R3': Issued certificate has expired
这个错误涉及到 OpenSSL 官方站点使用的 Let's Encrypt CA 证书,1.0.2 版本的 OpenSSL 将在验证网站证书时报错,而当前 CentOS 7.9中默认包含的 OpenSSL 版本是 1.0.2k,所以会出错。对于该问题在 OpenSSL 官方的 Blog 上有解释,其链接为:Old Let’s Encrypt Root Certificate Expiration and OpenSSL 1.0.2 - OpenSSL Blog 。可以通过加上命令参数 --no-check-certificate 来绕过这个问题,即使用命令:
wget https://www.openssl.org/source/openssl-3.0.0.tar.gz --no-check-certificate
也可以不用 wget,而使用 curl 命令下载。执行如下命令:
curl https://www.openssl.org/source/openssl-3.0.0.tar.gz -O --progress
下载文件后,使用命令解压缩:
tar -xvf openssl-3.0.0.tar.gz
在 OpenSSL 3.0.0 文件包中,包含以下关于在 Linux 平台上编译源码的说明文件:INSTALL.md,NOTES-PERL.md,NOTES-UNIX.md 。其中指出除了用到 C 语言编译器之外,还要用到 Perl 解释器。在 NOTES-PERL.md 指出编译时需要用到 Perl 的 Text::Template 模块。于是按照以下步骤操作:
首先为 Perl 解释器安装 CPAN 模块,执行以下命令:
yum -y install perl-CPAN
CPAN安装完成之后,执行以下命令安装 Text::Template 模块:
cpan -i Text::Template
在安装过程中,会有一些询问的选项,需要用户手动输入回答,如下图:
接下来如果执行 ./Configure 命令会报错,因为还缺少 IPC::Cmd 模块。这是 OpenSSL 3.0.0 文档中未明确提示的!执行以下命令进行安装:
cpan -i IPC::Cmd
这样就完成了准备工作,可以正式开始编译 OpenSSL 3.0.0 的源码了。可使用“ --prefix= ”指定头文件和库文件的存放路径,使用“--openssldir=”指定证书等文件存放的路径,这里使用的命令是:
./Configure --prefix=/usr/local/openssl-3.0.0 --openssldir=/usr/local/openssl-3.0.0
命令执行完成后,显示设置成功,如下图:
依次执行以下命令:
make
make test
绝大部分测试项能够通过,少数测试项被跳过。测试完成后显示如下:
执行以下命令执行安装:
make install
这里 OpenSSL 3.0.0 版的文件将被安装到 /usr/local/openssl-3.0.0 路径下,包含的文件及其分布如下:
openssl-3.0.0
|
| ---- bin
| | ------ c_rehash (Perl 脚本文件)
| | ------ openssl (可执行文件)
|
| ---- include
| | ---- openssl
| | ---- aes.h, comp.h, das.h, kdferr.h, pkcs12.h ...
|
| ---- misc
| | ---- CA.pl (Perl 脚本文件)
| | ---- tsget (到文件 tsget.pl 的符号链接)
| | ---- tsget.pl (Perl 脚本文件)
|
| ---- share
| | ---- doc
| | | ---- openssl
| | | ---- html
| | | ---- man1
| | | | ---- CA.pl.html, openssl-gendsa.html ...
| | |
| | | ---- man3
| | | | ---- ADMISSIONS.html ...
| | |
| | | ---- man5
| | | | ---- config.html, fips_config.html, x509v3_config.html
| | |
| | | ---- man7
| | | ---- bio.html, crypto.html ...
| |
| | ---- man
| | --- man1
| | | ---- asn1parse.lossl, ca.lossl, ca.pl.lossl, ciphers.lossl ...
| |
| | --- man3
| | | ---- ACCESS_DESCRIPTION_free.30ssl ...
| |
| | --- man5
| | | ---- config.5ossl, fips_config.5ossl, x509v3_config.5ossl
| |
| | --- man7
| | ---- bio.7ossl, crypto.7ossl, ct.7ossl, des_modes.7ossl ...
|
| ---- certs (空目录,未包含文件)
|
| ---- lib64
| | ---- engines-3
| | | ---- capi.so, loader_attic.so, padlock.so
| |
| | ---- libcrypto.so (到文件 libcrypto.so.3 的符号链接)
| | ---- libssl.a
| | ---- libssl.so.3
| | ---- pkgconfig
| | | ---- libcrypto.pc, libssl.pc, openssl.pc
| |
| | ---- libcrypto.a
| | ---- libcrypto.so.3
| | ---- libssl.so (到文件 libssl.so.3 的符号链接)
| | ---- ossl-modules
| | ---- legacy.so
|
| ---- private (空目录,未包含文件)
|
| ---- ct_log_list.cnf (ASCII 文本文件)
| ---- ct_log_list.cnf.dist (ASCII 文本文件)
| ---- openssl.cnf.dist (ASCII 文本文件)
| ---- openssl.cnf (ASCII 文本文件)
上面显示的文件分布是以字符形式呈现的,也可以直接参看下图:
依次执行以下命令:
cd /usr/local/openssl-3.0.0/bin
export LD_LIBRARY_PATH=/usr/local/openssl-3.0.0/lib64:$LD_LIBRARY_PATH
./openssl version
可以看到显示的 OpenSSL 可执行文件版本是 2021 年 9 月 7 日发布的 3.0.0: