CentOS 6.x の openssl と nginx で TLS1.2 1.3 対応
表題の通りですが、サポートの切れたCentOS 6(20/11/30)をいつまでも使うのはお勧めできませんが、TLS 1.3対応という需要はあるはずなので記述しておきます
※openssl や nginx の verup があれば都度 compile必要
現時点(21/08/29)での最新安定板 nginx は 1.20.1 openssl 1.1.1l
※23/08/31追記 nginx 1.20.2 か 1.22.1 か 1.24.0、 openssl 3.0.10 が良いと思う
nginx.org
http://nginx.org/download/nginx-1.24.0.tar.gz 2023/04/11
http://nginx.org/download/nginx-1.22.1.tar.gz 2022/09/19
http://nginx.org/download/nginx-1.20.2.tar.gz 2021/11/16
http://nginx.org/download/nginx-1.20.1.tar.gz
openssl 1.1.x系は18/09/11~23/09/11まで
https://www.openssl.org/source/openssl-1.1.1w.tar.gz 23/09/11
https://www.openssl.org/source/openssl-1.1.1l.tar.gz 21/08/24
openssl 3.0.x 系は2021/09/07~2026/09/07まで(インストールはこっち推奨)
https://www.openssl.org/source/openssl-3.0.11.tar.gz 23/09/19
https://www.openssl.org/source/openssl-3.0.10.tar.gz 23/08/01
※TLS 1.3 対応は openssl 1.1.1x と nginx 1.9.14 以降
※openssl 1.1.1 は perl 5.10.x 以降が必要なのでCentOS 5.x(perl 5.8.x)に入れるのは大変
手順 (脳内で最新バージョンに置き換えて)
1.yum で nginx を install
2.openssl 1.1.1l を compile
3.nginx 1.20.1 を compile
4.nginx のバイナリをyum版と入れ替え
・nginx repo から nginx install(設定ファイルなどをそのまま使う)
# rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
# vi /etc/yum.repos.d/nginx.repo
enabled=0
間違ってアップデートされないようenabled=0に変更
# yum install nginx --enablerepo=nginx
~~省略~~
Installed:
nginx.x86_64 0:1.18.0-2.el6.ngx
Complete!
※1.18.0がinstallされる
openssl 1.1.1l install
マイナーバージョン毎にディレクトリを切って変更
# cd /usr/local/src
# wget https://www.openssl.org/source/openssl-1.1.1l.tar.gz
# tar zxf openssl-1.1.1l.tar.gz
# cd openssl-1.1.1l
# ./config --prefix=/usr/local/openssl-1.1.1l shared zlib
# make
# make test
# make install
# echo /usr/local/openssl-1.1.1l/lib >> /etc/ld.so.conf
# /sbin/ldconfig
# /usr/local/openssl-1.1.1l/bin/openssl version
OpenSSL 1.1.1l 24 Aug 2021
※make testが失敗する場合 Test::More 0.96以上が必要(yum版は0.92)
# perl -MTest::More -le 'print $Test::More::VERSION'
0.92
Test::More は perl-Test-Simple に入っている
# yum info perl-Test-Simple
Installed Packages
Name : perl-Test-Simple
Arch : x86_64
Version : 0.92
cpanmのインストール方法いろいろあるので両方記載
・cpanm install その1(cpan shellを使うより楽なので cpanmを利用)
# yum install perl-CPAN
# cpan App::cpanminus
# cpanm install Test::Simple
# perl -MTest::More -le 'print $Test::More::VERSION'
1.302186
・cpanm install その2(cpan shellを使うより楽なので cpanmを利用)
# mkdir ~/bin
# cd ~/bin
# curl -L http://cpanmin.us/ -o cpanm
# chmod +x cpanm
# ./cpanm install Test::Simple
# perl -MTest::More -le 'print $Test::More::VERSION'
1.302186
※openssl 3.0.10 install
# yum install perl-IPC-Cmd
# yum install perl-parent
make、make test時にperlモジュールが足りないので入れる
yum のエラーを解決する
関連モジュールインストール
# yum install libxslt-devel gd-devel GeoIP-devel --enablerepo=epel
# yum install pcre-devel
epel エラー (epel epel-debug epel-SRPMSのbaseurl変更)
mirrorlist= を削除(CentOS 6のミラーはもう無い) baseurl= を有効に
# vi /etc/yum.repos.d/epel.repo
baseurl=http://dl.fedoraproject.org/pub/archive/epel/6/$basearch
enabled=0
間違ってアップデートされないようenabled=0に変更
baseurl=http://dl.fedoraproject.org/pub/archive/epel/6/$basearch/debug
baseurl=http://dl.fedoraproject.org/pub/archive/epel/6/$basearch/SRPMS
エラー内容 Loaded plugins: fastestmirror, security
enabled=1を0に変更する。
# vi /etc/yum/pluginconf.d/fastestmirror.conf
[main]
enabled=0
# vi /etc/yum/pluginconf.d/security.conf
[main]
enabled=0
エラー内容 Baseの変更
# vi /etc/yum.repos.d/CentOS-Base.repo
baseurl=http://vault.centos.org/centos/$releasever/os/$basearch/
baseurl=http://vault.centos.org/centos/$releasever/updates/$basearch/
baseurl=http://vault.centos.org/centos/$releasever/extras/$basearch/
baseurl=http://vault.centos.org/centos/$releasever/centosplus/$basearch/
baseurl=http://vault.centos.org/centos/$releasever/contrib/$basearch/
↓上記無くなったのでこちらに変更
baseurl=http://archive.kernel.org/centos-vault/$releasever/os/$basearch/
baseurl=http://archive.kernel.org/centos-vault/$releasever/updates/$basearch/
baseurl=http://archive.kernel.org/centos-vault/$releasever/extras/$basearch/
baseurl=http://archive.kernel.org/centos-vault/$releasever/centosplus/$basearch/
baseurl=http://archive.kernel.org/centos-vault/$releasever/contrib/$basearch/
realserverは6.10なら
echo 6.10 > /etc/yum/vars/releasever
で記述可能。バージョン確認は cat /etc/redhat-release
nginx install
# cd /usr/local/src
# wget http://nginx.org/download/nginx-1.20.1.tar.gz
# tar zxf nginx-1.20.1.tar.gz
# cd nginx-1.20.1
configureオプションは yum で install した nginx(nginx -V) から流用 --with-openssl --with-openssl-opt を追加
# ./configure --with-openssl=/usr/local/src/openssl-1.1.1l --with-openssl-opt=-fPIC --prefix=/etc/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 --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'
# make
make 完了後確認
# ./objs/nginx -V
nginx version: nginx/1.20.1
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC)
built with OpenSSL 1.1.1l 24 Aug 2021
TLS SNI support enabled
・ファイルを置き換える yumでinstallしたnginxのバイナリは nginx_org に
# cp -p /usr/sbin/nginx /usr/sbin/nginx_org
# cp -p objs/nginx /usr/sbin/nginx
・ssl.confを作る ssl_ciphersはMozillaの設定をある程度流用https://ssl-config.mozilla.org/#server=nginx&version=1.20.1&config=intermediate&openssl=1.1.1l&hsts=false&guideline=5.6
# vi /etc/nginx/conf.d/ssl.conf
server {
listen 443 ssl http2;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE+AESGCM:DHE+aRSA+AESGCM:ECDHE+AESCCM:DHE+aRSA+AESCCM:ECDHE+CHACHA20:DHE+aRSA+CHACHA20:+AES128:+DHE;
ssl_conf_command Ciphersuites TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:TLS_AES_128_CCM_SHA256:TLS_AES_128_CCM_8_SHA256;
ssl_session_timeout 10m;
ssl_session_cache shared:MozSSL:10m; # about 40000 sessions
ssl_certificate /etc/nginx/fullchain.pem;
ssl_certificate_key /etc/nginx/privkey.pem;
# add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains;';
# ssl_dhparam nginx 1.10
ssl_dhparam /etc/nginx/dhparam3072.pem;
# OCSP stapling
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/nginx/chain.pem;
resolver 1.1.1.1 1.0.0.1 8.8.8.8 8.8.4.4 valid=60s;
resolver_timeout 10s;
# 0-RTT
ssl_early_data on;
ssl_session_ticket_key /etc/nginx/ticket.key;
server_name exsample.jp;
access_log /var/log/nginx/exsample.jp_access_log;
error_log /var/log/nginx/exsample.jp_error_log;
server_tokens off;
etag off;
location / {
root /var/www;
}
}
・ticket.keyを作る
/usr/local/openssl-1.1.1l/bin/openssl rand 80 > /etc/nginx/ticket.key
・dhparam.pem を3072bitで作る nginx 1.10以降必要
/usr/local/openssl-1.1.1l/bin/openssl dhparam -out /etc/nginx/dhparam3072.pem 3072
※TLS 1.2 TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384に関係する
参考:https://qiita.com/r-ytakada/items/7ac9ce32c1ed4d01d505
nginx -t で設定や構文間違いが無いか確認
/etc/init.d/nginx start で起動
証明書が必要な場合は、Let's encrypt で証明書を作る(yum install certbot --enablerepo=epel)
SSL LabsでTLS1.3対応できているか確認
https://www.ssllabs.com/ssltest/
感想
グラフを見せることはできませんが、nginxを1.18から1.20.1にあげた後の munin ではNginx requests 変わらず
NGINX status 下がった
TCP established 下がった
TCP time_wait 上がった
ipconntrack 下がった(nginx statusと連動)
Firewall Throughput 変わらず
eth1 traffic 変わらず
Connections through firewall Established 下がった(nginx statusと連動)
Connections through firewall Time_wait 変わらず
という感じです
1.18からパフォーマンスがかなり良くなっていると思います
VPSはさくらのVPSが100Mフルに速度でました。共有の癖に怖い子
参考:
https://jvn.jp/vu/JVNVU99612123/
https://www.jpcert.or.jp/at/2021/at210036.html
関連する記事:2件
- nginx ssl_chipers と ssl_conf_command の設定覚書 (2022年02月11日)
- CentOS openssl TLS 1.2の対応方法 (2020年03月16日)