しなければならないと思いつつ放置していた当サーバ(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設定を確認します。
確認するURLを入力し、「Test now」をクリックします。
TLS及びSSLそれぞれのプロトコルバージョンが有効・無効を確認できます。
「TLS 1.3」及び「TLS 1.2」のみ「enabled」で有効となっており、「OVERALL SCORE」も「Excellent」となっているのが確認できます。
・SSL Labs
「SSL Labs」では、Webサーバの構成情報を詳細に分析できます。
「Hostname」欄にURLを入力し、「Submit」をクリックします。
「Hostname」の入力欄下のチェックボックスをオンにすることで結果を掲示板に表示しなくなります。
しばらく待つと結果が表示され、「Overall Rating(総合評価)」で「A+」となっているのが確認できます。
「Protocols」で「TLS 1.3」及び「TLS 1.2」がそれぞれ「Yes」で有効であり、「Cipher Suites」で暗号化スイートが一覧表示されるのが確認できます。
「Miscellaneous」では、「HTTP server signature」でApacheやOpenSSLなどのバージョンが確認できます。
・ブラウザ(Chrome)での確認
ブラウザ(Chrome)で確認するには、「メニュー」から「その他のツール」→「デベロッパーツール」もしくは、「F12」キーから「DevTools」が開き「Security」タブを選択すると「Connection」項目に「TLSプロトコルバージョン」と「暗号化スイート」が確認できます。
とりあえず、「TLS 1.3」が使用できるようになりました。
次は、サポート期限が切れてしまう前に「OpenSSL」のバージョンを更新したいと思います。