CentOS7のTLS1.3対応とApacheへの適用

しなければならないと思いつつ放置していた当サーバ(CentOS7)のTLS1.3(OpenSSL1.1.1)対応とApacheへの適用をした際の備忘録

◆インストール済みバージョン

# /usr/bin/openssl version
OpenSSL 1.0.2k-fips  26 Jan 2017

1行目:opensslのバージョン確認
2行目:現行バージョン

# httpd -version
Server version: Apache/2.4.46 (IUS)

1行目:apaheのバージョン確認
2行目:現行バージョン

CentOS7のyumでインストールされるバージョンは、上記のOpenSSL 1.0.2であり、TLS1.2までしか対応していないのでOpenSSLのバージョンをアップグレードする必要があります。

◆OpenSSLの最新バージョン

OpenSSLの公式サイトDownloadsページを確認すると各バージョンは下記のとおりとなっています。(2023.6.18現在

最新安定バージョンは、「3.1」シリーズで2025.3.14までのサーポート
長期サポート(LTS)バージョンは、「3.0」シリーズで2026.9.7までのサポート
以前の長期サポート(LTS)バージョン「1.1.1」シリーズも利用可能ですが、2023.9.11までのサポートとなっています。

当初、長期サポートである「3.0」シリーズへのアップグレードを検討したが、3.0の移行ガイドを見ると、「OpenSSL 1.0.2 から OpenSSL 3.0 へのアップグレードは、かなり困難になる可能性があります。」とあり、「OpenSSL 1.1.1 から OpenSSL 3.0 へのアップグレードは比較的簡単です。」と書いてあります。

したがって、アップグレードは「1.1.1」へとすることとしました。

◆OpenSSLのインストール

最新バージョンは、公式サイトで確認します。
2023.5.30の「1.1.1u」が最新です。(2023.6.18現在

・ダウンロードとインストール

# wget https://www.openssl.org/source/openssl-1.1.1u.tar.gz
# tar zxvf openssl-1.1.1u.tar.gz
# cd openssl-1.1.1u/
# ./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl
# make
# make install

1行目:最新バージョンをダウンロード「1.1.1u」のバージョンは、適宜変更すること
2行目:ダウンロードファイルを展開
3行目:展開ディレクトリへ移動
4行目:configureの実行
5行目:コンパイル
6行目:インストール

・インストールディレクトリの確認

# ll /usr/local/openssl/
合計 60
drwxr-xr-x 2 root root  4096  6月 18 11:52 bin
drwxr-xr-x 2 root root  4096  6月 18 11:52 certs
-rw-r--r-- 1 root root   412  6月 18 11:52 ct_log_list.cnf
-rw-r--r-- 1 root root   412  6月 18 11:52 ct_log_list.cnf.dist
drwxr-xr-x 3 root root  4096  6月 18 11:52 include
drwxr-xr-x 4 root root  4096  6月 18 11:52 lib
drwxr-xr-x 2 root root  4096  6月 18 11:52 misc
-rw-r--r-- 1 root root 10909  6月 18 11:52 openssl.cnf
-rw-r--r-- 1 root root 10909  6月 18 11:52 openssl.cnf.dist
drwxr-xr-x 2 root root  4096  6月 18 11:52 private
drwxr-xr-x 4 root root  4096  6月 18 11:53 share

1行目:インストールしたディレクトリの確認
8行目:ライブラリディレクトリ

# ll /usr/local/openssl/lib
合計 10552
drwxr-xr-x 2 root root    4096  6月 18 11:52 engines-1.1
-rw-r--r-- 1 root root 5650878  6月 18 11:52 libcrypto.a
lrwxrwxrwx 1 root root      16  6月 18 11:52 libcrypto.so -> libcrypto.so.1.1
-rwxr-xr-x 1 root root 3392984  6月 18 11:52 libcrypto.so.1.1
-rw-r--r-- 1 root root 1028434  6月 18 11:52 libssl.a
lrwxrwxrwx 1 root root      13  6月 18 11:52 libssl.so -> libssl.so.1.1
-rwxr-xr-x 1 root root  689576  6月 18 11:52 libssl.so.1.1
drwxr-xr-x 2 root root    4096  6月 18 11:52 pkgconfig

1行目:ライブラリディレクトリの確認

・共有ライブラリの設定

# echo "/usr/local/openssl/lib" > /etc/ld.so.conf.d/openssl.conf
# ldconfig

1行目:共有ライブラリへのパスを定義
2行目:共有ライブラリへの検索キャッシュの更新

・ライブラリの確認

# ldconfig -p | grep ssl
        libssl3.so (libc6,x86-64) => /lib64/libssl3.so
        libssl.so.10 (libc6,x86-64) => /lib64/libssl.so.10
        libssl.so.1.1 (libc6,x86-64) => /usr/local/openssl/lib/libssl.so.1.1
        libssl.so (libc6,x86-64) => /usr/local/openssl/lib/libssl.so
        libssl.so (libc6,x86-64) => /lib64/libssl.so
        libcrypto.so.1.1 (libc6,x86-64) => /usr/local/openssl/lib/libcrypto.so.1.1
        libcrypto.so (libc6,x86-64) => /usr/local/openssl/lib/libcrypto.so

1行目:「ldconfig」コマンドの「-p」オプションで現在のキャッシュに保存されているライブラリのリストを確認、「grep」で「ssl」を検索表示
4,5,7,8行目:インストールしたバージョン「1.1」のライブラリ

・パス設定

# vi ~/.bashrc
~ 中略 ~
export PATH="/usr/local/openssl/bin:/root/perl5/bin:$PATH";

1行目:環境変数の編集
2行目:「openssl」コマンドのパスを追加

・環境変数の反映

# source ~/.bashrc

・コマンドのパスとバージョンの確認

# which openssl
/usr/local/openssl/bin/openssl
# openssl version
OpenSSL 1.1.1u  30 May 2023

1行目:コマンドのパスの確認
2行目:コマンドのフルパス表示
3行目:インストールしたOpenSSLのバージョン確認
4行目:バージョン「1.1.1u」を表示

◆Apacheへの適応

本来だと、Apache自体をソースからビルドしてインストールする手順のようだが、モジュール「mod_ssl」のみ入れ替える方法で実施してみることとした。

参照:
標準パッケージのApache httpdのmod_sslだけ入れ替えてTLS1.3に対応する

・ビルド

# yum install apr-devel apr-util-devel pcre-devel

1行目:ビルドに必要なパッケージのインストール

# wget https://archive.apache.org/dist/httpd/httpd-2.4.46.tar.gz
# tar zxvf httpd-2.4.46.tar.gz
# ./configure --with-ssl=/usr/local/openssl
# make

1行目:インストール済みバージョンのApacheのソースファイルをダウンロード
2行目:ダウンロードファイルの展開
3行目:configureの実行。「–with-ssl」オプションでOpenSSLのインストールディレクトリを指定
4行目:コンパイル

「mod_ssl」モジュールだけ必要なので、「make install」は実行しません。

・「mod_ssl」モジュールの確認

# readelf -d modules/ssl/.libs/mod_ssl.so

Dynamic section at offset 0x4ad48 contains 29 entries:
 タグ        タイプ                       名前/値
 0x0000000000000001 (NEEDED)             共有ライブラリ: [libssl.so.1.1]
 0x0000000000000001 (NEEDED)             共有ライブラリ: [libcrypto.so.1.1]
 0x0000000000000001 (NEEDED)             共有ライブラリ: [libpthread.so.0]
 0x0000000000000001 (NEEDED)             共有ライブラリ: [libdl.so.2]
 0x0000000000000001 (NEEDED)             共有ライブラリ: [libc.so.6]
 0x000000000000000e (SONAME)             ライブラリの soname: [mod_ssl.so]
~ 以下略 ~

1行目:「readelf」コマンドで「mod_ssl」のヘッダ情報を確認
5,6行目:共有ライブラリのバージョンがインストールしたOpenSSLのバージョン(1.1)になっているのを確認

・「mod_ssl」モジュールの設置

# mv /etc/httpd/modules/mod_ssl.so /etc/httpd/modules/mod_ssl.so_org
# cp modules/ssl/.libs/mod_ssl.so /etc/httpd/modules/

1行目:元の「mod_ssl」モジュールをリネームしてバックアップ
2行目:新しい「mod_ssl」モジュールをコピーして設置

・「ssl.conf」の修正

# vi /etc/httpd/conf.d/ssl.conf
~ 中略 ~
SSLProtocol all -SSLv3
SSLProxyProtocol all -SSLv3

SSLCipherSuite TLSv1.3 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
SSLCipherSuite ECDHE+AESGCM:DHE+aRSA+AESGCM:ECDHE+AESCCM:DHE+aRSA+AESCCM:ECDHE+CHACHA20:DHE+aRSA+CHACHA20:+AES128:+DHE

1行目:「ssl.conf」ファイルの編集
3行目:SSLプロトコルバージョンの設定
5行目:TLS1.3の暗号化スイートの設定
6行目:TLS1.2の暗号化スイートの設定

IPAのサイトに「暗号利用に関するガイドライン ・ガイダンス」として、「TLS暗号設定ガイドライン 安全なウェブサイトのために(暗号設定対策編)」のページに、「チェックリスト」やSSLプロトコルバージョンの設定方法を参考にした「TLS暗号設定 サーバ設定編」、暗号化スイートを参考にした「TLS暗号設定 暗号スイートの設定例」などがあるので、暗号設定を適切に行う上で参考にするといいと思います。

・文法チェック

# apachectl configtest
Syntax OK

1行目:文法チェック(「httpd.conf」および「ssl.conf」どちらもチェックされる)
2行目:問題なければ「Syntax OK」、誤った記述があると行番号と理由等が表示されるので修正する

・「httpd」サービスの再起動

# systemctl restart httpd

1行目:サービスの再起動

◆確認

・TLS checker

TLS checker」でTLS/SSL設定を確認します。

TLS checker

確認するURLを入力し、「Test now」をクリックします。

TLS checker結果画面

TLS及びSSLそれぞれのプロトコルバージョンが有効・無効を確認できます。
「TLS 1.3」及び「TLS 1.2」のみ「enabled」で有効となっており、「OVERALL SCORE」も「Excellent」となっているのが確認できます。

・SSL Labs

SSL Labs」では、Webサーバの構成情報を詳細に分析できます。

SSL Server Test

「Hostname」欄にURLを入力し、「Submit」をクリックします。
「Hostname」の入力欄下のチェックボックスをオンにすることで結果を掲示板に表示しなくなります。

SSL Report

しばらく待つと結果が表示され、「Overall Rating(総合評価)」で「A+」となっているのが確認できます。

SSL Report(Protocols・Cipher Suites)

「Protocols」で「TLS 1.3」及び「TLS 1.2」がそれぞれ「Yes」で有効であり、「Cipher Suites」で暗号化スイートが一覧表示されるのが確認できます。

SSL Report(Miscellaneous)

「Miscellaneous」では、「HTTP server signature」でApacheやOpenSSLなどのバージョンが確認できます。

・ブラウザ(Chrome)での確認

Chrome(DevTools)

ブラウザ(Chrome)で確認するには、「メニュー」から「その他のツール」→「デベロッパーツール」もしくは、「F12」キーから「DevTools」が開き「Security」タブを選択すると「Connection」項目に「TLSプロトコルバージョン」と「暗号化スイート」が確認できます。

とりあえず、「TLS 1.3」が使用できるようになりました。
次は、サポート期限が切れてしまう前に「OpenSSL」のバージョンを更新したいと思います。

いいね! & シェア お願いします。

コメントは受け付けていません。