Apache httpd 2.4.37(TLS1.3対応)+ HTTP/2 + Brotli インストールメモ

Linux
Linux
スポンサーリンク

 

(2023年10月21日追記)このバージョンの Apache httpd にはセキュリティ脆弱性及び不具合が見つかっています。これらのセキュリティ脆弱性などが修正されている「Apache httpd 2.4.58(TLS1.3対応)+ HTTP/2 + Brotli インストールメモ」をご参照ください。

2018年10月23日、Apache httpd2.4.37 が安定版としてリリースされました。約1ヶ月ぶりのバージョンアップです。(2.4.36はリリースされませんでした)Apache httpd2.4.37 ではついに TLSv1.3 に対応した OpenSSL 1.1.1 がサポートされました! より安全な通信ができる TLSv1.3 への対応は心待ちにしていた方も多いのではないでしょうか。さっそく、CentOS7.5 (1804) に Apache httpd 2.4.37 をインストールする手順をまとめてみました。

 

*) mod_ssl: Add support for OpenSSL 1.1.1 and TLSv1.3. TLSv1.3 has
behavioural changes compared to v1.2 and earlier; client and
configuration changes should be expected. SSLCipherSuite is
enhanced for TLSv1.3 ciphers, but applies at vhost level only.
[Stefan Eissing, Yann Ylavic, Ruediger Pluem, Joe Orton]

ChangeLog for 2.4.37 より引用(2018年10月26日)

開発ツールのインストール

Apache httpd や各種ライブラリをソースからコンパイルしますので、CentOS7.5 (1804) を「最小限のインストール」でインストールしている場合は、基本コマンドと開発ツールをインストールしておきましょう。

yum -y groupinstall base
yum -y groupinstall development
yum -y update

OpenSSL 1.1.1 のインストール

OpenSSLのコンパイルに必要なパッケージをインストールしておきます。

yum -y install zlib-devel
yum -y install perl-core

OpenSSL 1.1.1のインストール

cd /usr/local/src/
wget https://www.openssl.org/source/openssl-1.1.1.tar.gz
tar xvzf openssl-1.1.1.tar.gz
cd openssl-1.1.1/
./config --prefix=/usr/local/openssl-1.1.1 shared zlib
make depend
make
make test
make install

OpenSSL1.1.1 のライブラリにパスを通しておきます。

echo /usr/local/openssl-1.1.1/lib > /etc/ld.so.conf.d/openssl111.conf
ldconfig

下記のコマンドで OpenSSL が TLS1.3 に対応していることを確認できます。(以下は TLS1.3 が対応している暗号スイートです)

/usr/local/openssl-1.1.1/bin/openssl ciphers -v TLSv1.3
 
TLS_AES_256_GCM_SHA384 TLSv1.3 Kx=any Au=any Enc=AESGCM(256) Mac=AEAD
TLS_CHACHA20_POLY1305_SHA256 TLSv1.3 Kx=any Au=any Enc=CHACHA20/POLY1305(256) Mac=AEAD
TLS_AES_128_GCM_SHA256 TLSv1.3 Kx=any Au=any Enc=AESGCM(128) Mac=AEAD

Nghttp2 のインストール

HTTP/2(mod_http2)のコアエンジン Nghttp2 をインストールします。

Nghttp2 が必要とするライブラリのインストール

yum -y install openssl-devel
yum -y install jansson-devel
yum -y install libev-devel
yum -y install c-ares-devel

Nghttp2 のダウンロード(ダウンロードの前に Nghttp2の最新リリース を確認しておきましょう)

cd /usr/local/src/
wget https://github.com/nghttp2/nghttp2/releases/download/v1.34.0/nghttp2-1.34.0.tar.gz

Nghttp2 のインストール。環境変数 OPENSSL_CFLAGS と OPENSSL_LIBS に先ほどインストールした、OpenSSL1.1.1 のディレクトリパスを指定してコンパイルします。

tar xvzf nghttp2-1.34.0.tar.gz
cd nghttp2-1.34.0/
env OPENSSL_CFLAGS="-I/usr/local/openssl-1.1.1/include" OPENSSL_LIBS="-L/usr/local/openssl-1.1.1/lib -lssl -lcrypto" ./configure -enable-app
make
make install

HTTP/2 のライブラリ「libnghttp2」が /usr/local/lib 以下にインストールされます。Nghttp2 関連のコマンドは /usr/local/bin 以下にインストールされます。(特にベンチマークツールの h2load が便利です)

Brotli のインストール

Brotli のコンパイルに cmake を使いますので、インストールしておきます。

yum -y install cmake

Brotli のダウンロード(ダウンロードの前に Brotliの最新リリース を確認しておきましょう)

cd /usr/local/src/
wget https://github.com/google/brotli/archive/v1.0.7.tar.gz

Brotli をコンパイルしてインストールします。

tar xvzf v1.0.7.tar.gz
cd brotli-1.0.7/
mkdir out && cd out
../configure-cmake
make
make test
make install

Brotli のライブラリが /usr/local/lib 以下にインストールされます。

ライブラリへのパス追加

HTTP/2 と Brotliのライブラリが「/usr/local/lib」以下にインストールされましたので、ライブラリのパスに追加しておきます。

echo /usr/local/lib > /etc/ld.so.conf.d/usr-local-lib.conf
ldconfig

Apache httpd インストールの下準備

Apache httpd のコンパイルに必要なパッケージをインストールしておきます。

yum -y install pcre-devel
yum -y install expat-devel

また、Apache 2.4系をソースコードからインストールする場合は、APR と APR-util が必要になりますので、インストールしておきます。

APR

cd /usr/local/src/
wget http://ftp.jaist.ac.jp/pub/apache//apr/apr-1.6.5.tar.gz
tar xvzf apr-1.6.5.tar.gz
cd apr-1.6.5/
./configure
make
make install

APR-util

cd /usr/local/src/
wget http://ftp.jaist.ac.jp/pub/apache//apr/apr-util-1.6.1.tar.gz
tar xvzf apr-util-1.6.1.tar.gz
cd apr-util-1.6.1/
./configure --with-apr=/usr/local/apr
make
make install

Apache httpd 2.4.37 のインストール

いよいよ本題の Apache httpd のインストールです。

Apache httpd のソースコードのダウンロード

cd /usr/local/src/
wget http://ftp.jaist.ac.jp/pub/apache//httpd/httpd-2.4.37.tar.gz

ダウンロードしたソースコードを解凍して、ディレクトリを移動します。

tar xvzf httpd-2.4.37.tar.gz
cd httpd-2.4.37/

HTTP/2 と Brotli モジュール、SSL/TLS を有効にしてインストールします。

./configure \
--enable-http2 \
--enable-brotli \
--with-brotli=/usr/local/lib \
--enable-ssl \
--with-ssl=/usr/local/openssl-1.1.1 \
--with-apr=/usr/local/apr \
--with-apr-util=/usr/local/apr \
--enable-so \
--enable-mods-shared=all \
--enable-mpms-shared=all
 
make
make install

以上で Apache が /usr/local/apache2/ 以下にインストールされました。続いてSSLサーバー証明書の作成と、Apacheの設定を行います。

自己署名のSSLサーバー証明書の作成

正規の認証局が発行したサーバー証明書を、無料で取得することもできます。よければご参照ください → Let's Encrypt サーバー証明書の取得と自動更新設定メモ

HTTP/2 および Brotli は HTTPS が必須になりますので Apache の設定の前に、SSLサーバー証明書を作成しておきます。

秘密鍵の作成(ECDSAの256ビット鍵を生成)

openssl ecparam -name prime256v1 -genkey -out server.key

CSR(証明書署名要求)の作成(入力するのは2箇所だけです)

openssl req -new -key server.key > server.csr
 
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:<空エンター>
Locality Name (eg, city) [Default City]:<空エンター>
Organization Name (eg, company) [Default Company Ltd]:<空エンター>
Organizational Unit Name (eg, section) []:<空エンター>
Common Name (eg, your name or your server's hostname) []:www.example.com
Email Address []:<空エンター>
 
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:<空エンター>
An optional company name []:<空エンター>

SSLサーバー証明書の作成(有効期限10年)

openssl x509 -days 3650 -req -signkey server.key < server.csr > server.crt

秘密鍵とSSL証明書を移動

mv -i server.key /etc/pki/tls/private/
mv -i server.crt /etc/pki/tls/certs/

パーミッションを変更

chmod 600 /etc/pki/tls/private/server.key
chmod 600 /etc/pki/tls/certs/server.crt

SELinux を有効にしている場合は、秘密鍵とSSL証明書にセキュリティコンテキストをつけておきましょう。(Apache 起動時にエラーが発生することがあります)

restorecon -v /etc/pki/tls/private/server.key
restorecon -v /etc/pki/tls/certs/server.crt

CSRを削除

rm server.csr

Apache httpd の設定

オリジナルの設定ファイルをバックアップ

mv -i /usr/local/apache2/conf/httpd.conf /usr/local/apache2/conf/httpd.conf.org
mv -i /usr/local/apache2/conf/extra/httpd-ssl.conf /usr/local/apache2/conf/extra/httpd-ssl.conf.org

・設定ファイルを作成します
vim /usr/local/apache2/conf/httpd.conf

vim /usr/local/apache2/conf/extra/httpd-ssl.conf

systemd サービスファイルの作成

Apache httpd 用の systemd サービスファイル(起動スクリプトのようなもの)を作成します。

vim /etc/systemd/system/httpd.service

[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
 
[Service]
Type=forking
ExecStart=/usr/local/apache2/bin/apachectl start
ExecReload=/usr/local/apache2/bin/apachectl graceful
ExecStop=/usr/local/apache2/bin/apachectl stop
 
[Install]
WantedBy=multi-user.target

作成したサービスファイルを systemd に反映

systemctl daemon-reload

systemd に反映されているか確認

systemctl list-unit-files | grep httpd
httpd.service disabled ←この表示があればOK

起動

systemctl start httpd

自動起動設定

systemctl enable httpd

firewalld設定

HTTP(80/tcp) と HTTPS(443/tcp) を開けておきます。

firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --add-port=443/tcp --permanent
firewall-cmd --reload

・確認
firewall-cmd --list-all

public (default, active)
interfaces: enp0s3 enp0s8
sources:
services: dhcpv6-client ssh
ports: 443/tcp 80/tcp ←この表示があればOK
(略)

動作確認

手元の環境では、10月にリリースされた Firefox63 および Chrome70 から TLS1.3 で接続できることが確認できました。偶然かもしれませんが、TLS1.3(RFC8446)対応のリリース時期を合わせたのかもしれませんね。

ログのローテーション設定

・設定ファイルを作成します
vim /etc/logrotate.d/httpd

/usr/local/apache2/logs/*log { 
    daily 
    missingok 
    dateext 
    rotate 60 
    create 644 daemon daemon
    sharedscripts 
    postrotate 
        /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
    endscript 
}

・確認します
logrotate -dv /etc/logrotate.d/httpd
-----(下記のような表示であればOKです)-----

reading config file /etc/logrotate.d/httpd
 
Handling 1 logs
 
rotating pattern: /usr/local/apache2/logs/*log after 1 days (60 rotations)
empty log files are rotated, old logs are removed
(略)

以上です。設定お疲れ様でした!

この記事をシェアする
あぱーブログをフォローする
スポンサーリンク
スポンサーリンク
あぱーブログ

コメント

タイトルとURLをコピーしました