2021年8月29日

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件


  • follow us in feedly

スポンサーリンク