经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Nginx » 查看文章
升级openssl并重新编译Nginx
来源:cnblogs  作者:感觉不妥  时间:2021/6/21 9:42:54  对本文有异议

在漏洞扫描的时候出现“启用TLS1.0”的安全漏洞,描述为:不被视为 PCI 数据安全标准,推荐使用TLS1.2及以上版本;
我这边服务器使用的是CentOS7,默认自带的openssl是1.0.2版本,当前的最新稳定版本是1.1.1k,支持TLS1.2和TLS1.3;

 

文档内容:

  --->升级 openssl 编译安装

  --->重新编译安装 Nginx 并配置测试

 

 

升级 openssl 编译安装

 

首先解决环境所依赖的各种软件包:

  1. [root@kafka-test ~]# yum -y install perl perl-devel gcc gcc-c++



前往官网下载最新稳定版本:
https://www.openssl.org/source/

 

 

将下载的tgz包解压,并进行后续的编译安装

  1. ##查看安装包
  2. [root@kafka-test ~]# cd /opt/
  3. [root@kafka-test opt]# ls -l openssl-1.1.1k.tar.gz
  4. -rw-r--r--. 1 root root 9823400 Jun 19 22:57 openssl-1.1.1k.tar.gz
  5. ##解压软件压缩包
  6. [root@kafka-test opt]# tar -xvf openssl-1.1.1k.tar.gz
  7. ... ...
  8. ... ...
  9. [root@kafka-test opt]# cd openssl-1.1.1k
  10. ##进行编译安装
  11. ##这里我没有指定安装的路径,使用默认,有需求请 --prefix= 指定路径
  12. [root@kafka-test openssl-1.1.1k]# ./config
  13. Operating system: x86_64-whatever-linux2
  14. Configuring OpenSSL version 1.1.1k (0x101010bfL) for linux-x86_64
  15. Using os-specific seed configuration
  16. Creating configdata.pm
  17. Creating Makefile
  18. **********************************************************************
  19. *** ***
  20. *** OpenSSL has been successfully configured ***
  21. *** ***
  22. *** If you encounter a problem while building, please open an ***
  23. *** issue on GitHub <https://github.com/openssl/openssl/issues> ***
  24. *** and include the output from the following command: ***
  25. *** ***
  26. *** perl configdata.pm --dump ***
  27. *** ***
  28. *** (If you are new to OpenSSL, you might want to consult the ***
  29. *** 'Troubleshooting' section in the INSTALL file first) ***
  30. *** ***
  31. **********************************************************************
  32. [root@kafka-test openssl-1.1.1k]# make && make install
  33. ... ...
  34. ... ...

 

 

此时查看新版本信息会报错

  1. ##此时的报错是缺少文件,一共两个,当处理完一个还会有另一个报错
  2. [root@kafka-test ~]# /usr/local/bin/openssl version
  3. /usr/local/bin/openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory
  4. [root@kafka-test ~]# /usr/local/bin/openssl version
  5. /usr/local/bin/openssl: error while loading shared libraries: libcrypto.so.1.1: cannot open shared object file: No such file or directory
  6. ##将两个缺少的库文件做软连接即可
  7. [root@kafka-test ~]# ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/
  8. [root@kafka-test ~]# ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/
  9. ##此时再次查看新版本信息,安装完成
  10. [root@kafka-test ~]# /usr/local/bin/openssl version
  11. OpenSSL 1.1.1k 25 Mar 2021

 

 

确定系统默认的openssl是哪个版本,是否需要新旧替换

  这里有一个需要说明的问题:

    我在公司的服务器上安装新版的openssl之后,默认的openssl还是原来的 1.0.2k 版本,而在家测试安装的时候却直接变为新版的 1.1.1k;

    但这个命令原本用的是 /usr/bin/openssl ,新版安装后变为 /usr/local/bin/openssl ,所以默认使用直接变为了新版;

    说实话,我自己也没有深究为什么有这个情况,但是我有应对依然默认旧版得到方法,下面写下新旧替换的方法;

  1. ##使用 which 命令来查看执行命令实际使用的是那个路径下的文件
  2. ##情况分为两种,第一种则是直接变更为了新版,无需你再做新旧替换
  3. ##第二种则是依然使用的旧版,需要我们手动去替换命令
  4. [root@kafka-test ~]# which openssl
  5. /usr/local/bin/openssl
  6.  
  7. ##这个是我家里测试的情况,默认命令的路径已经更改
  8. ##当你使用 openssl 命令的时候,它已经是 1.1.1k 的版本了
  9. [root@kafka-test ~]# /usr/local/bin/openssl version
  10. OpenSSL 1.1.1k 25 Mar 2021
  11.  
  12. ##其他的命令路径还有如下两个,其版本为旧版的 1.0.2k
  13. ##随后我又开了另一个虚拟机,其使用的是 /usr/bin/openssl 这个路径下的命令
  14. [root@kafka-test ~]# /usr/bin/openssl version
  15. OpenSSL 1.0.2k-fips 26 Jan 2017
  16.  
  17. [root@kafka-test ~]# /bin/openssl version
  18. OpenSSL 1.0.2k-fips 26 Jan 2017

 

 

新旧版本替换

  1. ##查看命令所使用的路径,将旧版的命令重命名
  2. ##然后进行新版命令的软连接创建即可替换完成
  3. [root@kafka-test ~]# which openssl
  4. /usr/bin/openssl
  5. [root@kafka-test ~]# cd /usr/bin/
  6. [root@kafka-test bin]# mv openssl openssl102
  7. [root@kafka-test bin]# ln -s /usr/local/bin/openssl openssl

 

至此,openssl的升级已经完成

--返回目录--


 

下面是应对我所遇到的漏洞修复,对Nginx的重新编译

 

重新编译安装 Nginx 并配置测试

升级 openssl 主要的目的是使 Nginx 可以使用更安全的TLS,以及相应的密码套件;

重新编译(或初次)安装时记得加 --with-openssl 选项来指定使用的 openssl,安装新的 openssl 时我是没有指定路径,追加选项 --with-openssl=/usr/local/

  1. [root@kafka-test nginx-1.18.0]# ./configure --prefix=/usr/local/nginx --user=nginx > --group=nginx --with-http_stub_status_module --with-http_v2_module --with-http_ssl_module > --with-http_sub_module --with-http_gzip_static_module --with-http_realip_module --with-stream > --with-openssl=/usr/local

 

 

当前情况下,执行 make 会报错

  1. [root@kafka-test nginx-1.18.0]# make
  2. make -f objs/Makefile
  3. make[1]: Entering directory `/opt/nginx-1.18.0'
  4. cd /usr/local && if [ -f Makefile ]; then make clean; fi && ./config --prefix=/usr/local/.openssl no-shared no-threads && make && make install_sw LIBDIR=lib
  5. /bin/sh: line 2: ./config: No such file or directory
  6. make[1]: *** [/usr/local/.openssl/include/openssl/ssl.h] Error 127
  7. make[1]: Leaving directory `/opt/nginx-1.18.0'
  8. make: *** [build] Error 2

原因是其找不到openssl相关的文件:make[1]: *** [/usr/local/.openssl/include/openssl/ssl.h] Error 127

 

 

这里需要修改编译的配置文件,在 nginx 解压目录下的 auto/lib/openssl/conf 中;
找相应的路径,将 .openssl 去掉,整合成相应可以找到的路径
  例如:CORE_DEPS="$CORE_DEPS $OPENSSL/include/openssl/ssl.h"
  完整的路径为/usr/local/include/openssl/ssl.h

  1. [root@kafka-test nginx-1.18.0]# vi auto/lib/openssl/conf
  2. ##原版配置文件
  3. 36 have=NGX_OPENSSL . auto/have
  4. 37 have=NGX_SSL . auto/have
  5. 38
  6. 39 CORE_INCS="$CORE_INCS $OPENSSL/.openssl/include"
  7. 40 CORE_DEPS="$CORE_DEPS $OPENSSL/.openssl/include/openssl/ssl.h"
  8. 41 CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libssl.a"
  9. 42 CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libcrypto.a"
  10. 43 CORE_LIBS="$CORE_LIBS $NGX_LIBDL"
  11. 44 CORE_LIBS="$CORE_LIBS $NGX_LIBPTHREAD"
  12. ##我们要修改
  13. 36 have=NGX_OPENSSL . auto/have
  14. 37 have=NGX_SSL . auto/have
  15. 38
  16. 39 CORE_INCS="$CORE_INCS $OPENSSL/include"
  17. 40 CORE_DEPS="$CORE_DEPS $OPENSSL/include/openssl/ssl.h"
  18. 41 CORE_LIBS="$CORE_LIBS $OPENSSL/lib/libssl.a"
  19. 42 CORE_LIBS="$CORE_LIBS $OPENSSL/lib/libcrypto.a"
  20. 43 CORE_LIBS="$CORE_LIBS $NGX_LIBDL"
  21. 44 CORE_LIBS="$CORE_LIBS $NGX_LIBPTHREAD"

 

 

此时完成还会出现问题,会提示你找不到 libssl.a 和 libcrypto.a

  1. [root@kafka-test nginx-1.18.0]# make
  2. make -f objs/Makefile
  3. make[1]: Entering directory `/opt/nginx-1.18.0'
  4. cc -c -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g -I src/core -I
  5. ... ...
  6. ... ...
  7. cc: error: /usr/local/lib/libssl.a: No such file or directory
  8. cc: error: /usr/local/lib/libcrypto.a: No such file or directory
  9. make[1]: *** [objs/nginx] Error 1
  10. make[1]: Leaving directory `/opt/nginx-1.18.0'
  11. make: *** [build] Error 2

 

 

这两个文件在我们压缩包解压目录下,将 libssl.a 和 libcrypto.a 放到相应目录下

  1. ##我们下载的包里面有,找到我们解压的目录
  2. [root@kafka-test ~]# ls -l /opt/openssl-1.1.1k/{libssl.a,libcrypto.a}
  3. -rw-r--r--. 1 root root 5640890 Jun 19 23:06 /opt/openssl-1.1.1k/libcrypto.a
  4. -rw-r--r--. 1 root root 1024544 Jun 19 23:06 /opt/openssl-1.1.1k/libssl.a
  5.  
  6. ##放到上面 conf 配置文件中配置的目录下
  7. [root@kafka-test ~]# cp -a /opt/openssl-1.1.1k/libssl.a /usr/local/lib/
  8. [root@kafka-test ~]# cp -a /opt/openssl-1.1.1k/libcrypto.a /usr/local/lib/

 

 

处理这些之后我们在编译安装就已经正常进行了;

注意:

  重新编译nginx的配置文件都是新的,可能并不是以前相同的配置,比如nginx的版本信息是否隐藏了;

  信息都是重新编译的,这种重新编译安装nginx的方法也适用于nginx升级,而且,它是不需要停服务的;

  1. ##重新编译安装
  2. [root@kafka-test ~]# cd /opt/nginx-1.18.0
  3. [root@kafka-test nginx-1.18.0]# make clean
  4. rm -rf Makefile objs
  5. [root@kafka-test nginx-1.18.0]# ./configure --prefix=/usr/local/nginx --user=nginx > --group=nginx --with-http_stub_status_module --with-http_v2_module --with-http_ssl_module > --with-http_sub_module --with-http_gzip_static_module --with-http_realip_module --with-stream > --with-openssl=/usr/local
  6. ... ...
  7. ... ...
  8.  
  9. ##当你是重新编译安装的,结束看到的是提示,并不是报错
  10. ##初次安装是正常的打印信息
  11. [root@kafka-test nginx-1.18.0]# make && make install
  12. ... ...
  13. ... ...
  14. test -d '/usr/local/nginx/logs' || mkdir -p '/usr/local/nginx/logs'
  15. make[1]: Leaving directory `/opt/nginx-1.18.0'

 

 

修改 nginx.conf 配置并验证

  1. [root@kafka-test ~]# /usr/local/nginx/sbin/nginx -V
  2. nginx version: nginx/200
  3. built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
  4. built with OpenSSL 1.1.1k 25 Mar 2021
  5. TLS SNI support enabled
  6. configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx
  7. --with-http_stub_status_module --with-http_v2_module --with-http_ssl_module
  8. --with-http_sub_module --with-http_gzip_static_module --with-http_realip_module
  9. --with-stream --with-openssl=/usr/local
  10.  
  11. ##查看web信息
  12. [root@kafka-test ~]# openssl s_client -connect 域名地址:443 -tls1_2
  13. [root@kafka-test ~]# openssl s_client -connect 域名地址:443 -tls1_3

 

--返回目录--


 

原文链接:http://www.cnblogs.com/Oejfr/p/14902721.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号