2021年8月29日

CentOS 6.x で openssl と nginx compile して TLS1.2 TLS 1.3 対応

表題の通りですが、サポートの切れたCentOS 6をいつまでも使うのはお勧めできませんが、TLS 1.3に対応するという需要はあるはずなので記述しておきます
※openssl や nginx の verup があれば都度 compile必要

現時点(21/08/29)での最新安定板 nginx は 1.20.1 openssl 1.1.1l

nginx.org
http://nginx.org/download/nginx-1.20.1.tar.gz

openssl.org 1.1.1l 21/08/24に更新
https://www.openssl.org/source/openssl-1.1.1l.tar.gz

※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 install(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


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/


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-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
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 か https://sslnow.ml/ で証明書を作る

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

スポンサーリンク


関連する記事:1件


  • follow us in feedly