TLS1.3に対応したApache(httpd)のインストール・設定方法

アイキャッチ画像

2018年9月にOpenSSL 1.1.1 がリリースされ、正式にTLS1.3がサポートされました。

Chrome・Firefoxは既にTLS1.3正式版に対応しており、FacebookやGmailなどの大手サイトもTLS1.3に対応しています。ごく普通にTLS1.3が利用されるようになるのも、そう遠くない未来かもしれません。(当サイトのトラフィックも、既に半分弱はTLSv1.3を利用したものになっています)

facebook.comのページ情報

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 と OpenSSL のバージョンについて

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
  • ビルドに必要なライブラリ・ツール類(perlgcczlib-develexpat-develpcre-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のインストール

APRApache 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を再起動する定期的にセッションチケットの秘密鍵を更新するセッションチケットを使わない のいずれかが必要です。

Perfect Forward Security(前方秘匿性) とは?

SSl/TLS のPerfect Forward Security とは、サーバ認証用の秘密鍵が何らかの理由で漏洩したとしても、既に終了したセッションの情報を攻撃に利用することができないことをいいます。

セッションチケットの秘密鍵が長期間更新されないと、秘密鍵が漏洩したとき、そのサーバの過去のセッション情報を取得されていた場合にそれを攻撃に悪用される可能性があります。

参考:マスタリングTCP/IP SSL/TLS編

動作確認

Firefox 63 と Google Chrome 70 以降がTLS1.3に対応しているので、これらのブラウザでサーバにアクセスして確認します。

Chrome では右上のメニューから、「その他のツール」―「デベロッパー ツール」を選択し、「Security」タブから確認できます。

Firefoxではアドレスバーの鍵アイコンをクリックし、「接続」の右側の矢印 ―「詳細を表示」から確認できます。

chromeでTLS1.3対応サイトへアクセスした画面

Connection の欄から確認できる(クリックで拡大)

まとめ

nginxと比べると少し手間がかかりますが、TLS1.3の暗号スイートをしっかり設定できるのが良いですね。(nginx 1.15.8ではパッチを当てない限りまだ暗号スイートを設定できません…)

nginxでTLS1.3の暗号スイートを設定する方法

スポンサーリンク

あわせて読みたい

コメントを残す

質問・感想などお気軽にどうぞ。
*が付いている項目は入力必須です。メールアドレス以外の項目が公開されます。
スパム防止のため、コメント反映まで少々時間がかかります。