Centos系统支持TLS 1.3
一、背景
1、生产的 CentOS 7 服务器需要启用 TLS 1.3
2、Openssl介绍
OpenSSL 是用于传输层安全性 (TLS) 和安全套接字层 (SSL) 协议的强大、商业级且功能齐全的工具包。OpenSSL 是一个软件库,用于保护计算机网络上的通信免受窃听或需要识别另一端方身份的应用程序。它是根据 Apache 样式许可获得许可的,这意味着您可以根据一些简单的许可条件免费获取和使用它用于商业和非商业目的。
TLS 1.3是最新和最安全的 TLS 协议版本。它改进了旧版本和几个新功能的延迟。它目前在 Chrome(从 66 版开始)和 Firefox(从 60 版开始)中得到支持,并且正在为 Safari 和 Edge 浏览器开发。
如果您从 Centos 7 存储库下载 Nginx,您将获得使用OpenSSL 1.0.2k-fips. 但是如果你想启用 TLS 1.3,那么你必须满足一些要求。要启用TLS 1.3任何发行版,请查看以下必需的详细信息:
Apache 版本
2.4.37
或greater
.Nginx 版本
1.13.0
或greater
.OpenSSL 版本
1.1.1
或greater
.具有正确配置的 DNS 记录的有效域名。
有效的 TLS 证书。
由于需要在 CentOS7 服务器上部署 TLS v1.3,因此我们已经拥有有效的域名、有效的 TLS 证书和 Nginx 版本 1.16.1,该版本高于 TLS 1.3 所需的最低版本。但是当前的 Nginx 版本是用构建的OpenSSL 1.0.2k-fips,所以首先我们需要通过编译过程安装 OpenSSL 版本 1.1.1,然后再次使用新的 OpenSSL 版本重新编译我们的 Nginx。
二、 安装 OpenSSL
cd /usr/src wget https://www.openssl.org/source/old/1.1.1/openssl-1.1.1f.tar.gz tar -zxvf openssl-1.1.1f.tar.gz mv openssl-1.1.1f openssl cd /usr/src/openssl ./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl --libdir=/lib64 shared zlib-dynamic #编译安装 make -j4 make test make install
--prefix
并--openssldir
控制已安装组件的配置
--prefix
和的行为和交互在OpenSSL 1.1.0 及以上版本--openssldir
之间和以下版本之间略有不同。
OpenSSL 1.0.2
同时将 --prefix 和 --openssldir 设置到同一位置。shared 将强制创建共享库,而 Zlib 意味着将使用 zlib 库执行压缩。值得运行一下,make test
看看是否有任何意外错误。如果有的话,你需要在安装库之前修复它们。
现在重命名现有的 OpenSSL 二进制文件并添加一个新的符号链接
mv /usr/bin/openssl /usr/bin/openssl-backup ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
新版本的 OpenSSL 应该支持TLS v1.3,通过
如下命令可以查看
openssl ciphers -v | awk '{print $2}' | sort | uniq
现在我们必须再次重新编译 Nginx 以适应新安装的 OpenSSL
三、安装Nginx
从网上下载安装好的Nginx版本源码。在我的例子中,Nginx 版本 1.16.1 安装在我的生产服务器上,所以我将下载相同的版本并开始编译。
cd /usr/src wget [http://nginx.org/download/nginx-1.16.1.tar.gz](http://nginx.org/download/nginx-1.16.1.tar.gz) tar xvf nginx-1.16.1.tar.gz cd nginx-1.16.1 ./configure --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx \ --modules-path=/usr/lib64/nginx/modules \ --conf-path=/etc/nginx/nginx.conf \ --error-log-path=/var/log/nginx/error.log \ --http-log-path=/var/log/nginx/access.log \ --http-client-body-temp-path=/var/lib/nginx/tmp/client_body\ --http-proxy-temp-path=/var/lib/nginx/tmp/proxy \ --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi \ --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi \ --http-scgi-temp-path=/var/lib/nginx/tmp/scgi \ --pid-path=/run/nginx.pid \ --lock-path=/run/lock/subsys/nginx --user=nginx \ --group=nginx \ --with-file-aio \ --with-http_ssl_module \ --with-http_v2_module \ --with-http_realip_module \ --with-stream_ssl_preread_module \ --with-http_addition_module \ --with-http_xslt_module=dynamic \ --with-http_image_filter_module=dynamic \ --with-http_sub_module \ --with-http_dav_module \ --with-http_flv_module \ --with-http_mp4_module \ --with-http_gunzip_module \ --with-http_gzip_static_module \ --with-http_random_index_module \ --with-http_secure_link_module \ --with-http_degradation_module \ --with-http_slice_module \ --with-http_stub_status_module \ --with-http_perl_module=dynamic \ --with-http_auth_request_module \ --with-mail=dynamic \ --with-mail_ssl_module \ --with-pcre \ --with-pcre-jit \ --with-stream=dynamic \ --with-stream_ssl_module \ --with-openssl=/usr/src/openssl #结束之后进行编译 make -j4 make install
现在我们可以看到,Nginx 是使用新安装的 OpenSSL 构建的。
#nginx -V nginx version: nginx/1.16.1 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) built with OpenSSL 1.1.1f 31 Mar 2020 TLS SNI support enabled
更新您的 Nginx 配置以启用TLS 1.3
. 在 Nginx 虚拟主机配置的服务器块中添加以下行。
ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
检查配置并重启 Nginx。
nginx -t systemctl restart nginx
可以从浏览器或命令行验证您的 Web 应用程序以检查它是否使用 TLS 1.3。
在终端设备上安装了 OpenSSL 1.1.1 版,那么您与服务器的连接将优先通过 TLS 1.3。
openssl s_client -connect link.bdn.com.np:443 -tls1_3
将看到以下输出
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384 Server public key is 2048 bit Post-Handshake New Session Ticket arrived: SSL-Session: Protocol : TLSv1.3 Cipher : TLS_AES_256_GCM_SHA384