TLS1.3に対応したApache(httpd)のインストール・設定方法
2018年9月にOpenSSL 1.1.1 がリリースされ、正式にTLS1.3がサポートされました。
Chrome・Firefoxは既にTLS1.3正式版に対応しており、FacebookやGmailなどの大手サイトもTLS1.3に対応しています。ごく普通にTLS1.3が利用されるようになるのも、そう遠くない未来かもしれません。(当サイトのトラフィックも、既に半分弱はTLSv1.3を利用したものになっています)
nginxをTLS1.3に対応させる方法はnginxをTLS1.3に対応させるメリットと方法 [OpenSSL 1.1.1]で紹介しましたが、今回はApache(httpd)をTLS1.3に対応させる方法をまとめてみました。
スポンサーリンク
目次
ApacheをTLS1.3に対応させるには
Apacheは、バージョン2.4.37からOpenSSl 1.1.1とTLS1.3に対応しています。
これ以降のバージョンをインストールし、適切な設定をしてやることで、TLS1.3に対応することが可能になります。
比較的新しいバージョンなので、自分でソースからビルドしてインストールする方法を取ることになります。
Apache 2.4.37とOpenSSL 1.1.1は、共に脆弱性が発見されており、セキュリティアップデートが行われています。
ApacheとOpenSSLは、インストールする時点での最新バージョンを使うようにしてください。
Apacheのインストール
検証済み環境
- CentOS 7.4 ~ 7.6 (Minimal 最小構成)
- CentOS 8.0(Minimal 最小構成)
他のディストリビューションでは未検証ですが、共通している部分は多いのではないかと思います。
必要ライブラリ
最新のApacheをインストールするには、以下のライブラリ等が必要になります。
- OpenSSL 1.1.1 以降
- APR
- APR-util
- ビルドに必要なライブラリ・ツール類(perl、gcc、zlib-devel、expat-devel、pcre-devel)
OpenSSLのインストール
ダウンロード
最新版のダウンロードURLは、https://www.openssl.org/source/から確認できます。(バージョン1.1.1系を使ってください)
#作業用ディレクトリへ移動
$ cd /usr/local/src
#ソースのダウンロード
$ curl -O https://www.openssl.org/source/openssl-1.1.1c.tar.gz
#ソースの展開
$ tar fxz openssl-1.1.1c.tar.gz
$ rm -f openssl-1.1.1c.tar.gz
ビルド & インストール(CentOS 7)
OS標準のものを置き換えるわけではなく、Apacheからのみ利用するものを別でインストールするので、安全に実行できます。
#ビルドに必要なので、なければインストールする
$ yum install perl gcc zlib-devel
#先ほどソースを保存したディレクトリに移動
$ cd openssl-1.1.1c
#configure ではないので注意!
$ ./config --prefix=/opt/openssl shared zlib
#ビルド&インストール(少し時間が掛かる)
$ make
$ make install
ビルド & インストール(CentOS 8)
上記手順でインストールすると、CentOS 8の場合DNF(YUM)がエラーを吐いて動作しなくなるので、こちらの手順でインストールします。
(参考:https://qiita.com/Hige-Moja/items/f7f03d2f29947e95f235)
ImportError: /lib64/librpmio.so.8: symbol EVP_md2 version OPENSSL_1_1_0 not defined in file libcrypto.so.1.1 with link time reference
OpenSSL 1.1.1d だとビルドが通らないので、1.1.1c を使っています。
#ビルドに必要なので、なければインストールする
$ dnf install perl gcc zlib-devel lksctp-tools lksctp-tools-devel
#先ほどソースを保存したディレクトリに移動
$ cd openssl-1.1.1c
#configure ではないので注意!
$ ./config --prefix=/opt/openssl shared zlib enable-md2 enable-rc5 sctp
#ビルド&インストール(少し時間が掛かる)
$ make
$ make install
共有ライブラリのパスを通す
先ほどインストールしたOpenSSLは、Apacheから使えるように共有ライブラリとしてビルドしています。
ただし、このままではApacheなどのほかのアプリケーションから見えないので、共有ライブラリのパスを通します。
$ vi /etc/ld.so.conf.d/openssl.conf
#以下の内容を保存する
/opt/openssl/lib
#設定の反映
$ ldconfig
動作確認
正常にバージョンが表示されればインストールは成功です。
$ /opt/openssl/bin/openssl version
OpenSSL 1.1.1c 28 May 2019
APRのインストール
APR(Apache Portable Runtime)は、Apacheを様々なプラットフォームで動作させるためのライブラリです。
APR、APR-util の最新版ダウンロードURLは、https://apr.apache.org/から確認できます。
$ cd /usr/local/src
#ダウンロード&展開
$ curl -O http://ftp.kddilabs.jp/infosystems/apache//apr/apr-1.6.5.tar.gz
$ tar fxz apr-1.6.5.tar.gz
$ rm -f apr-1.6.5.tar.gz
#ビルド&インストール
$ cd apr-1.6.5
$ ./configure --prefix=/opt/apr
$ make
$ make install
APR-utilのインストール
#ビルドに必要なので、なければインストールする
$ yum install expat-devel
$ cd /usr/local/src
#ダウンロード&展開
$ curl -O http://ftp.kddilabs.jp/infosystems/apache//apr/apr-util-1.6.1.tar.gz
$ tar fxz apr-util-1.6.1.tar.gz
$ rm -f apr-util-1.6.1.tar.gz
#ビルド&インストール
$ cd apr-util-1.6.1
#--with-apr には、先ほどインストールしたAPRのパスを指定する
$ ./configure --prefix=/opt/apr-util --with-apr=/opt/apr
$ make
$ make install
Apacheのインストール
いよいよApache本体のインストールです。
最新版のダウンロードURLは、http://httpd.apache.org/download.cgiから確認できます。
ダウンロード
$ cd /usr/local/src
$ curl -O http://ftp.kddilabs.jp/infosystems/apache//httpd/httpd-2.4.38.tar.gz
$ tar fxz httpd-2.4.38.tar.gz
$ rm -f httpd-2.4.38.tar.gz
ビルド&インストール
#ビルドに必要なので、なければインストールする
$ yum install pcre-devel
$ cd httpd-2.4.38
#ビルドオプションは必要に応じて変更する(後述)
$ ./configure --prefix=/opt/httpd \
--enable-ssl --with-ssl=/opt/openssl \
--enable-mpms-shared=all --enable-mods-shared=all \
--with-apr=/opt/apr --with-apr-util=/opt/apr-util
#ビルド&インストール(少し時間が掛かる)
$ make
$ make install
configureで指定するビルドオプションは環境に合わせて変更してください。
赤字で示したオプションは、必須項目です。
ここで示したコマンド例は、yumでインストールできるhttpdに近い構成でインストールするためのものです。
オプション | 説明 |
---|---|
–prefix | Apacheのインストール先 |
–enable-ssl | mod_sslをインストールする |
–with-ssl | SSL/TLS の処理(mod_ssl)に使うライブラリを指定する |
–enable-mpms-shared | マルチプロセッシングモジュールを動的モジュールとしてインストールする(allを指定することで、prefork、worker、eventのすべてをインストールする) |
–enable-mods-shared | モジュールを動的モジュールとしてインストールする(allを指定することで、ほとんどのモジュールがインストールされる) |
–with-apr | APRのディレクトリを指定する |
–with-apr-util | APR-utilのディレクトリを指定する |
動作確認
正常にバージョンが表示されればインストールは成功です。
$ /opt/httpd/bin/httpd -V
Server version: Apache/2.4.38 (Unix)
Server built: Jan 27 2019 04:11:31
Server's Module Magic Number: 20120211:83
Server loaded: APR 1.6.5, APR-UTIL 1.6.1
Compiled using: APR 1.6.5, APR-UTIL 1.6.1
Architecture: 64-bit
Server MPM: event
threaded: yes (fixed thread count)
forked: yes (variable process count)
Server compiled with....
#以下略
Apacheの設定
SSL/TLS関連の設定に絞って解説します。
httpd.configの設定
$ vi /opt/httpd/conf/httpd.conf
#それぞれアンコメントして有効化
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
LoadModule ssl_module modules/mod_ssl.so
Include conf/extra/httpd-ssl.conf
mod_sochache_shmcbは、SSLセッションキャッシュを動作させるために有効化する必要があります。
httpd-ssl.confの設定
最低限必要な設定
httpd-ssl.conf ファイル後半の、VirtualHost コンテキスト内を少し修正します。
[ ]内は適宜変更してください。
$ vi /opt/httpd/conf/extra/httpd-ssl.conf
#変更が必要な項目のみ抜粋
<VirtualHost _default_:443>
ServerName [サーバのURL]:443
SSLCertificateFile "[サーバ証明書のファイルパス]"
SSLCertificateKeyFile "[サーバ秘密鍵のファイルパス]"
</VirtualHost>
応用的な設定例
必ずしも設定する必要はない、応用的な設定を一部紹介します。
安易にコピペするとえらいことになる可能性があるので、意味を理解したうえで設定してください。
$ vi /opt/httpd/conf/extra/httpd-ssl.conf
#TLS1.3の暗号スイートの設定
SSLCipherSuite TLSv1.3 TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
#TLS1.2以下の暗号スイートの設定(コピペ厳禁!)
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-CHACHA20-POLY1305
#利用可能なプロトコルの設定(コピペ厳禁!)
SSLProtocol +TLSv1.3 +TLSv1.2
#PFSを重視するならTLSセッションチケットはオフに
SSLSessionTickets off
SSLCipherSuite ディレクティブで暗号スイートを設定できます。
TLS1.3では、暗号スイートの種類と表記が変更になったため(公開鍵アルゴリズムは、サーバ証明書から自動的に判定してくれるようになったので表記しません)、TLS1.2以下の暗号スイートとは別に設定します。
第一パラメータにTLSv1.3を指定することで、TLS1.3の暗号スイートを設定することができます。
現状利用できるのは、設定例に書いてある3つのみです。
基本的にはAESを優先的に利用することになるでしょう。鍵長が128ビットと256ビットから選べますが、256ビットは現状やや過剰気味だと思うので、設定例では128ビットを優先しています。
SSLProtocol ディレクティブで利用可能なプロトコルを設定できます。
デフォルト設定では、TLSv1.0~TLSv1.3が有効になります。
SSLSessionTickets ディレクティブでは、TLSセッションチケットのオンオフを設定できます。
Apacheの実装だとセッションチケットの秘密鍵が定期的に更新されないので、Perfect Forward Security(前方秘匿性)が保たれません。(ちなみにこれはnginxでも同様)
PFSを保つには、①定期的にApacheを再起動する ②定期的にセッションチケットの秘密鍵を更新する ③セッションチケットを使わない のいずれかが必要です。
SSl/TLS のPerfect Forward Security とは、サーバ認証用の秘密鍵が何らかの理由で漏洩したとしても、既に終了したセッションの情報を攻撃に利用することができないことをいいます。
セッションチケットの秘密鍵が長期間更新されないと、秘密鍵が漏洩したとき、そのサーバの過去のセッション情報を取得されていた場合にそれを攻撃に悪用される可能性があります。
動作確認
Firefox 63 と Google Chrome 70 以降がTLS1.3に対応しているので、これらのブラウザでサーバにアクセスして確認します。
Chrome では右上のメニューから、「その他のツール」―「デベロッパー ツール」を選択し、「Security」タブから確認できます。
Firefoxではアドレスバーの鍵アイコンをクリックし、「接続」の右側の矢印 ―「詳細を表示」から確認できます。
まとめ
nginxと比べると少し手間がかかりますが、TLS1.3の暗号スイートをしっかり設定できるのが良いですね。(nginx 1.15.8ではパッチを当てない限りまだ暗号スイートを設定できません…)
スポンサーリンク