在这里,我们将在我们的生产 CentOS 7 服务器上启用 TLS 1.3。
OpenSSL 是用于传输层安全性 (TLS) 和安全套接字层 (SSL) 协议的强大、商业级且功能齐全的工具包。OpenSSL 是一个软件库,用于保护计算机网络上的通信免受窃听或需要识别另一端方身份的应用程序。它是根据 Apache 样式许可获得许可的,这意味着您可以根据一些简单的许可条件免费获取和使用它用于商业和非商业目的。有关漏洞列表以及发现和修复漏洞的版本,请参阅 OpenSSL漏洞页面。
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 1.3,因此我们已经拥有有效的域名、有效的 TLS 证书和 Nginx 版本 1.16.1,该版本高于 TLS 1.3 所需的最低版本。但是当前的 Nginx 版本是用构建的OpenSSL 1.0.2k-fips,所以首先我们需要通过编译过程安装 OpenSSL 版本 1.1.1,然后再次使用新的 OpenSSL 版本重新编译我们的 Nginx。
正如我们在下面看到的,OpenSSL 版本是OpenSSL 1.0.2k-fps 26 Jan 2017
Nginx1.16.1
yum install gcc gcc-c++ pcre-devel zlib-devel make unzip gd-devel perl-ExtUtils-Embed libxslt-devel openssl-devel perl-Test-Simple
yum groupinstall 'Development Tools'
安装 OpenSSL
cd /usr/src
wget [https://www.openssl.org/source/old/1.1.1/openssl-1.1.1f.tar.gz](https://www.openssl.org/source/old/1.1.1/openssl-1.1.1f.tar.gz)
tar xvf openssl-1.1.1f.tar.gz
mv openssl-1.1.1f openssl
cd openssl
./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl --libdir=/lib64 shared zlib-dynamic
make -j4
make test
make install
openssl-1.1.1f在撰写本文时,我们下载了最新版本的 OpenSSL 。解压文件后,重命名文件夹名称并导航到 OpenSSL 文件夹。
--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
这里ldd
显示了二进制 OpenSSL 的依赖关系。
您新安装的 OpenSSL 应该TLSv1.3
如下所示。
openssl ciphers -v | awk '{print $2}' | sort | uniq
我们已经完成了 OpenSSL 安装部分。现在我们必须再次重新编译 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 构建的。built with OpenSSL 1.1.1f 31 Mar 2020
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
service nginx restart
现在您可以从浏览器或命令行验证您的 Web 应用程序以检查它是否使用 TLS 1.3。
在 Google Chrome 浏览器中,转到网站https://link.bdn.com.np
Right Click
>> Inspect
>>Security Tab
您也可以从命令行检查。如果您在终端设备上安装了 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
就是这样。我们已经在我们的 Nginx 服务器上启用了 TLS 1.3,它正在按预期运行。如果您的应用程序由于新的 OpenSSL 版本而崩溃,那么您可能还需要使用新的标头重新编译 PHP。