网络信息安全|第5章:让你的 Nginx 支持 TLS v1.3

  • 原创
  • Madman
  • /
  • /
  • 0
  • 1231 次阅读

网络信息安全-min.jpg

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

[madman@CentOS ~]$ cat /etc/centos-release
CentOS Linux release 7.3.1611 (Core)

默认安装了 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 版本源代码的链接,然后通过 wgetcurl 命令下载即可(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 解压源代码

[madman@CentOS ~]$ tar xf openssl-1.1.1c.tar.gz

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,将会并行编译,大大提高编译的速度

[madman@CentOS openssl-1.1.1c]$ make
[madman@CentOS openssl-1.1.1c]$ make test

1.6 安装

[madman@CentOS openssl-1.1.1c]$ sudo make install

安装好之后,我们应该创建一个软链接 /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 :

[madman@CentOS openssl-1.1.1c]$ sudo ln -s /usr/local/openssl-1.1.1c /usr/local/openssl

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 版本号:

[madman@CentOS openssl-1.1.1c]$ /usr/local/openssl/bin/openssl version
OpenSSL 1.1.1c  28 May 2019

1.8 替换旧的 openssl 命令

如果我们直接运行如下命令,还是调用了 CentOS 系统默认给我们安装的旧的 OpenSSL 版本:

[madman@CentOS openssl-1.1.1c]$ openssl version
OpenSSL 1.0.2k-fips  26 Jan 2017

因为我们刚编译的新版本的可执行程序在 /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

[madman@CentOS openssl-1.1.1c]$ which openssl
/bin/openssl
[madman@CentOS openssl-1.1.1c]$ ls -l /usr/bin/openssl
-rwxr-xr-x 1 root root 555296 Apr 11  2018 /usr/bin/openssl

我很少覆盖通过 yum 安装的软件包,原因是当有新版本的 OpenSSL 并且你通过 yum 安装它时,它就会覆盖你的编译版本,如果你之后又想使用编译版本的话,你将不得不重新编译它。我们可以在 /etc/profile.d 目录下新建一个脚本,用户每次登录时都会执行此目录下脚本,所以可以在脚本里修改 PATH 变量:

[madman@CentOS openssl-1.1.1c]$ echo "export PATH=/usr/local/openssl/bin:$PATH" | sudo tee -a /etc/profile.d/openssl.sh > /dev/null
[madman@CentOS openssl-1.1.1c]$ sudo chmod +x /etc/profile.d/openssl.sh

                                
                            
未经允许不得转载: LIFE & SHARE - 王颜公子 » 网络信息安全|第5章:让你的 Nginx 支持 TLS v1.3

分享

作者

作者头像

Madman

如需 Linux / Python 相关问题付费解答,请按如下方式联系我

0 条评论

暂时还没有评论.

专题系列