网络信息安全|第5章:让你的 Nginx 支持 TLS v1.3
Synopsis: 为了让 NGINX 支持最新的 TLS v1.3 协议,我们需要编译 OpenSSL 1.1.1 版本以上才行,然后再基于刚编译的最新版 OpenSSL 来编译 NGINX 。二者编译完成后,只需在 NGINX 的配置文件中指定 ssl_protocols TLSv1.2 TLSv1.3 就能开启 TLS v1.3 了
建议使用普通用户权限来编译程序,请参考: CentOS 7快速创建具有sudo权限的用户
1. 编译 OpenSSL
https://wiki.openssl.org/index.php/Compilation_and_Installation
我的系统是 CentOS 7.3:
默认安装了 OpenSSL 1.0.2k
版本的 RPM
包:
[madman@CentOS ~]$ openssl version OpenSSL 1.0.2k-fips 26 Jan 2017 [madman@CentOS ~]$ rpm -qa|grep openssl openssl-1.0.2k-12.el7.x86_64 openssl-libs-1.0.2k-12.el7.x86_64 openssl-devel-1.0.2k-12.el7.x86_64
为了提供 TLS
v1.3 功能,我们需要通过编译安装 OpenSSL 1.1.1
或以上的版本
1.1 安装依赖项
[madman@CentOS ~]$ sudo yum -y group install 'Development Tools' [madman@CentOS ~]$ sudo yum -y install perl-core zlib-devel
1.2 下载源代码
请到 https://www.openssl.org/source/ 右键复制你要下载的 OpenSSL 1.1.1 版本源代码的链接,然后通过 wget
或 curl
命令下载即可(Linux 中需要编译的源代码我一般是放到 /usr/local/src/
目录下)。另外,下载完成后,请记得验证 SHA256 摘要是否一致,保证源代码的数据完整性:
[madman@CentOS ~]$ wget https://www.openssl.org/source/openssl-1.1.1c.tar.gz 或者: [madman@CentOS ~]$ curl -O -L https://www.openssl.org/source/openssl-1.1.1c.tar.gz [madman@CentOS ~]$ openssl dgst -sha256 openssl-1.1.1c.tar.gz SHA256(/usr/local/src/openssl-1.1.1c.tar.gz)= f6fb3079ad15076154eda9413fed42877d668e7069d9b87396d0804fdb3f4c90
1.3 解压源代码
1.4 配置构建选项
[madman@CentOS ~]$ cd openssl-1.1.1c/ [madman@CentOS openssl-1.1.1c]$ ./config --prefix=/usr/local/openssl-1.1.1c --openssldir=/usr/local/openssl-1.1.1c shared zlib Operating system: x86_64-whatever-linux2 Configuring OpenSSL version 1.1.1c (0x1010103fL) for linux-x86_64 Using os-specific seed configuration Creating configdata.pm Creating 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 file first) *** *** *** **********************************************************************
--prefix
和 --openssldir
设置 OpenSSL 的输出路径,shared
表示创建共享库,zlib
表示将使用 zlib 库执行压缩。更多配置项可参考: https://github.com/openssl/openssl/blob/master/INSTALL
1.5 编译
如果你的服务器 CPU 是多核的,那么可以额外指定 -j
选项,比如你有 8 核 CPU,就执行 make -j 8
,将会并行编译,大大提高编译的速度
1.6 安装
安装好之后,我们应该创建一个软链接 /usr/local/openssl
指向 /usr/local/openssl-1.1.1c
。如果下次我再编译安装更新的版本(比如 openssl-1.1.1d)后,只需要更改这个软链重新指向 /usr/local/openssl-1.1.1d
即可。一旦后续发现还想用回之前的 openssl-1.1.1c 版本,那我们再将软链接改回去就行了,无需重新编译 openssl-1.1.1c :
1.7 链接库文件
[madman@CentOS openssl-1.1.1c]$ /usr/local/openssl/bin/openssl version /usr/local/openssl/bin/openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory
刚编译的 OpenSSL 报错说找不到 libssl.so.1.1
这个库文件,而这个版本的库文件在 /usr/local/openssl/lib
目录下。你可以用 ldd
命令查看 openssl 命令需要哪些库文件:
[madman@CentOS openssl-1.1.1c]$ ls -l /usr/local/openssl/lib total 10484 drwxr-xr-x 2 root root 39 May 31 14:19 engines-1.1 -rw-r--r-- 1 root root 5629250 May 31 14:19 libcrypto.a lrwxrwxrwx 1 root root 16 May 31 14:19 libcrypto.so -> libcrypto.so.1.1 -rwxr-xr-x 1 root root 3388304 May 31 14:19 libcrypto.so.1.1 -rw-r--r-- 1 root root 1022816 May 31 14:19 libssl.a lrwxrwxrwx 1 root root 13 May 31 14:19 libssl.so -> libssl.so.1.1 -rwxr-xr-x 1 root root 685472 May 31 14:19 libssl.so.1.1 drwxr-xr-x 2 root root 61 May 31 14:19 pkgconfig [madman@CentOS openssl-1.1.1c]$ ldd /usr/local/openssl/bin/openssl linux-vdso.so.1 => (0x00007ffcadbfa000) libssl.so.1.1 => not found libcrypto.so.1.1 => not found libz.so.1 => /lib64/libz.so.1 (0x00007f411b2e7000) libdl.so.2 => /lib64/libdl.so.2 (0x00007f411b0e3000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f411aec6000) libc.so.6 => /lib64/libc.so.6 (0x00007f411aaf9000) /lib64/ld-linux-x86-64.so.2 (0x00007f411b509000)
因为应用程序只会去 /usr/lib
或 /usr/lib64
目录下查找库文件(/lib
或 /lib64
分别是它们的软链接),所以会报错说找不到依赖的库文件 libssl.so.1.1
。我们可以用 ldconfig
工具来管理库文件,新建配置文件指定需要新添加的库文件在哪里:
[madman@CentOS openssl-1.1.1c]$ echo "/usr/local/openssl/lib" | sudo tee -a /etc/ld.so.conf.d/openssl-1.1.1c.conf > /dev/null [madman@CentOS openssl-1.1.1c]$ sudo ldconfig -v
再次执行如下命令,成功显示出刚编译的 OpenSSL 版本号:
1.8 替换旧的 openssl 命令
如果我们直接运行如下命令,还是调用了 CentOS 系统默认给我们安装的旧的 OpenSSL 版本:
因为我们刚编译的新版本的可执行程序在 /usr/local/openssl/bin
目录下:
[madman@CentOS openssl-1.1.1c]$ ls -l /usr/local/openssl/bin total 740 -rwxr-xr-x 1 root root 6226 May 31 19:43 c_rehash -rwxr-xr-x 1 root root 749024 May 31 19:43 openssl
此目录没有被添加到 PATH
环境变量中,所以在 Bash 命令行直接输入 openssl 命令时执行的是 /usr/bin/openssl
:
1 条评论
评论者的用户名
评论时间lpchg1992
2020-03-16T04:30:35Zftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.43.tar.gz 亲测这个地址可能已经失效,本人谷歌后在这个网站的https下载的。