apache(httpd)でHTTP/2通信を試してみる

February 24, 2021

サイトをLighthouseで確認したところ、「Use HTTP/2」のメッセージが。
今まであまり気にしてなかったのですが、こちらを見るともうほとんどのブラウザがHTTP/2に対応してますし、そろそろデフォルトでHTTP/2対応できるよう練習しておきます。

テスト環境

centos7 + apache(httpd)

opensslのバージョン確認

こちらのページにも記載されている通り、ほとんどのブラウザがHTTP/2 over TLSだけ対応となっており、httpsでの通信が必須となります。また、opensslがALPNに対応している必要があるとのことなので、opensslのバージョンを確認します。

$ openssl version
OpenSSL 1.0.2k-fips  26 Jan 2017
$

バージョン1.0.2からALPN対応してるとのことなので先へ進みます。

対応httpdのインストール

HTTP/2に対応しているのはhttpdのバージョンが2.4.17以降である必要があるのですが、centos7のyumで単純にhttpdをインストールすると2.4.6がインストールされてしまいます。

$ httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built:   Nov 16 2020 16:18:20
$

いったんアンインストールし、IUSリポジトリを追加したうえでhttpd24uをインストールします。

# yum remove httpd
読み込んだプラグイン:fastestmirror
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ httpd.x86_64 0:2.4.6-97.el7.centos を 削除
--> 依存性解決を終了しました。

依存性を解決しました

===================================================================================================================================================================================================================
 Package                                       アーキテクチャー                               バージョン                                                    リポジトリー                                      容量
===================================================================================================================================================================================================================
削除中:
 httpd                                         x86_64                                         2.4.6-97.el7.centos                                           @updates                                         9.4 M

トランザクションの要約
===================================================================================================================================================================================================================
削除  1 パッケージ

インストール容量: 9.4 M
上記の処理を行います。よろしいでしょうか? [y/N]y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  削除中                  : httpd-2.4.6-97.el7.centos.x86_64                                                                                                                                                   1/1
  検証中                  : httpd-2.4.6-97.el7.centos.x86_64                                                                                                                                                   1/1

削除しました:
  httpd.x86_64 0:2.4.6-97.el7.centos

完了しました!
# yum install httpd24u
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.tsukuba.wide.ad.jp
 * epel: hkg.mirror.rackspace.com
 * extras: ftp.tsukuba.wide.ad.jp
 * remi-safe: mir01.syntis.net
 * updates: ftp.tsukuba.wide.ad.jp
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ httpd24u.x86_64 0:2.4.46-1.el7.ius を インストール
--> 依存性の処理をしています: httpd24u-tools = 2.4.46-1.el7.ius のパッケージ: httpd24u-2.4.46-1.el7.ius.x86_64
--> トランザクションの確認を実行しています。
---> パッケージ httpd24u-tools.x86_64 0:2.4.46-1.el7.ius を インストール
--> 衝突を処理しています: httpd24u-tools-2.4.46-1.el7.ius.x86_64 は httpd-tools < 2.4.46-1.el7.ius と衝突しています
--> 依存性解決を終了しました。
エラー: httpd24u-tools conflicts with httpd-tools-2.4.6-97.el7.centos.x86_64
 問題を回避するために --skip-broken を用いることができます。
 これらを試行できます: rpm -Va --nofiles --nodigest
#

httpd-toolsが残っているためにコンフリクトを起してエラーとなりました。httpd-toolsもアンインストールしたうえで再実行します。

# yum remove httpd-tools
読み込んだプラグイン:fastestmirror
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ httpd-tools.x86_64 0:2.4.6-97.el7.centos を 削除
--> 依存性解決を終了しました。

依存性を解決しました

===================================================================================================================================================================================================================
 Package                                            アーキテクチャー                              バージョン                                                 リポジトリー                                     容量
===================================================================================================================================================================================================================
削除中:
 httpd-tools                                        x86_64                                        2.4.6-97.el7.centos                                        @updates                                        168 k

トランザクションの要約
===================================================================================================================================================================================================================
削除  1 パッケージ

インストール容量: 168 k
上記の処理を行います。よろしいでしょうか? [y/N]y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  削除中                  : httpd-tools-2.4.6-97.el7.centos.x86_64                                                                                                                                             1/1
  検証中                  : httpd-tools-2.4.6-97.el7.centos.x86_64                                                                                                                                             1/1

削除しました:
  httpd-tools.x86_64 0:2.4.6-97.el7.centos

完了しました!
# yum install httpd24u
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.tsukuba.wide.ad.jp
 * epel: hkg.mirror.rackspace.com
 * extras: ftp.tsukuba.wide.ad.jp
 * remi-safe: mir01.syntis.net
 * updates: ftp.tsukuba.wide.ad.jp
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ httpd24u.x86_64 0:2.4.46-1.el7.ius を インストール
--> 依存性の処理をしています: httpd24u-tools = 2.4.46-1.el7.ius のパッケージ: httpd24u-2.4.46-1.el7.ius.x86_64
--> トランザクションの確認を実行しています。
---> パッケージ httpd24u-tools.x86_64 0:2.4.46-1.el7.ius を インストール
--> 依存性解決を終了しました。

依存性を解決しました

===================================================================================================================================================================================================================
 Package                                                アーキテクチャー                               バージョン                                                リポジトリー                                 容量
===================================================================================================================================================================================================================
インストール中:
 httpd24u                                               x86_64                                         2.4.46-1.el7.ius                                          ius                                         1.4 M
依存性関連でのインストールをします:
 httpd24u-tools                                         x86_64                                         2.4.46-1.el7.ius                                          ius                                          91 k

トランザクションの要約
===================================================================================================================================================================================================================
インストール  1 パッケージ (+1 個の依存関係のパッケージ)

総ダウンロード容量: 1.5 M
インストール容量: 4.5 M
Is this ok [y/d/N]: y
Downloading packages:
(1/2): httpd24u-tools-2.4.46-1.el7.ius.x86_64.rpm                                                                                                                                           |  91 kB  00:00:00
(2/2): httpd24u-2.4.46-1.el7.ius.x86_64.rpm                                                                                                                                                 | 1.4 MB  00:00:00
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
合計                                                                                                                                                                               1.6 MB/s | 1.5 MB  00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  インストール中          : httpd24u-tools-2.4.46-1.el7.ius.x86_64                                                                                                                                             1/2
  インストール中          : httpd24u-2.4.46-1.el7.ius.x86_64                                                                                                                                                   2/2
  検証中                  : httpd24u-2.4.46-1.el7.ius.x86_64                                                                                                                                                   1/2
  検証中                  : httpd24u-tools-2.4.46-1.el7.ius.x86_64                                                                                                                                             2/2

インストール:
  httpd24u.x86_64 0:2.4.46-1.el7.ius

依存性関連をインストールしました:
  httpd24u-tools.x86_64 0:2.4.46-1.el7.ius

完了しました!
#

入りました。とりあえず起動して見ます。

# systemctl start httpd
#

ブラウザでアクセスしてみます。

It works!

It worksが表示されました。

オレオレ証明書作成

SSL必須なのでここの手順でさくっとオレオレ証明書を作ります。

# openssl genrsa 2048 > server.key
Generating RSA private key, 2048 bit long modulus
...............+++
.................+++
e is 65537 (0x10001)
# openssl req -new -key server.key > server.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
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) []:
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
# openssl x509 -days 3650 -req -signkey server.key < server.csr > server.crt
Signature ok
subject=/C=JP/L=Default City/O=Default Company Ltd
Getting Private key
# ls -l
合計 16
-rw-r--r--  1 root root 1103  225 00:47 server.crt
-rw-r--r--  1 root root  952  225 00:47 server.csr
-rw-r--r--  1 root root 1679  225 00:45 server.key
#

生成されました。

SSL証明書の設置

作成されたSSL証明書をhttpdに設定します。

秘密鍵とサーバ証明書の移動
# mkdir -p /etc/httpd/conf/ssl.crt
# mkdir -p /etc/httpd/conf/ssl.key
# mv server.key /etc/httpd/conf/ssl.key/
# mv server.crt /etc/httpd/conf/ssl.crt/
# chmod 400 /etc/httpd/conf/ssl.key/server.key
#

とりあえずこんな感じの設定を入れてみて設定ファイルのテストを実行します。

/etc/httpd/conf.d/testsite.conf
<VirtualHost *:443>
    DocumentRoot /var/www/html
    SSLEngine on
    SSLCertificateFile conf/ssl.crt/server.crt
    SSLCertificateKeyFile conf/ssl.key/server.key
</VirtualHost>
# httpd -t
AH00526: Syntax error on line 3 of /etc/httpd/conf.d/testsite.conf:
Invalid command 'SSLEngine', perhaps misspelled or defined by a module not included in the server configuration
#

エラーとなりました。mod_sslが読み込まれているのか確認します。

# httpd -M | grep -i 'ssl'
AH00526: Syntax error on line 3 of /etc/httpd/conf.d/testsite.conf:
Invalid command 'SSLEngine', perhaps misspelled or defined by a module not included in the server configuration
# vim /etc/httpd/conf.d/testsite.conf
# httpd -M | grep -i 'ssl'
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to suppress this message
#

設定ファイルにsyntax errorがある状態ではコマンド実行できなかったためいったんコメントアウトして再実行しました。どうやらmodsslが存在しないようです。modsslを追加インストールします。

# yum install mod_ssl
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.tsukuba.wide.ad.jp
 * epel: hkg.mirror.rackspace.com
 * extras: ftp.tsukuba.wide.ad.jp
 * remi-safe: mir01.syntis.net
 * updates: ftp.tsukuba.wide.ad.jp
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ mod_ssl.x86_64 1:2.4.6-97.el7.centos を インストール
--> 依存性の処理をしています: httpd = 2.4.6-97.el7.centos のパッケージ: 1:mod_ssl-2.4.6-97.el7.centos.x86_64
--> トランザクションの確認を実行しています。
---> パッケージ httpd.x86_64 0:2.4.6-97.el7.centos を インストール
--> 依存性の処理をしています: httpd-tools = 2.4.6-97.el7.centos のパッケージ: httpd-2.4.6-97.el7.centos.x86_64
--> トランザクションの確認を実行しています。
---> パッケージ httpd-tools.x86_64 0:2.4.6-97.el7.centos を インストール
--> 衝突を処理しています: httpd24u-2.4.46-1.el7.ius.x86_64 は httpd < 2.4.46-1.el7.ius と衝突しています
--> 衝突を処理しています: httpd24u-tools-2.4.46-1.el7.ius.x86_64 は httpd-tools < 2.4.46-1.el7.ius と衝突しています
--> 依存性解決を終了しました。
エラー: httpd24u conflicts with httpd-2.4.6-97.el7.centos.x86_64
エラー: httpd24u-tools conflicts with httpd-tools-2.4.6-97.el7.centos.x86_64
 問題を回避するために --skip-broken を用いることができます。
 これらを試行できます: rpm -Va --nofiles --nodigest
#

yum install modsslだとデフォルトのhttpd用modsslをインストールしようとしてしまいます。yum listからそれっぽいパッケージを探してみます。

# yum list | grep -i 'httpd24u'
httpd24u.x86_64                           2.4.46-1.el7.ius             @ius
httpd24u-filesystem.noarch                2.4.46-1.el7.ius             @ius
httpd24u-tools.x86_64                     2.4.46-1.el7.ius             @ius
httpd24u-devel.x86_64                     2.4.46-1.el7.ius             ius
httpd24u-manual.noarch                    2.4.46-1.el7.ius             ius
httpd24u-mod_ldap.x86_64                  2.4.46-1.el7.ius             ius
httpd24u-mod_proxy_html.x86_64            1:2.4.46-1.el7.ius           ius
httpd24u-mod_security2.x86_64             2.9.3-1.el7.ius              ius
httpd24u-mod_security2-mlogc.x86_64       2.9.3-1.el7.ius              ius
httpd24u-mod_session.x86_64               2.4.46-1.el7.ius             ius
httpd24u-mod_ssl.x86_64                   1:2.4.46-1.el7.ius           ius
httpd24u-mod_xsendfile.x86_64             0.12-1.ius.el7               ius
#

どうやらhttpd24u-mod_sslですね。これを追加インストールして見ます。

# yum install httpd24u-mod_ssl
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.tsukuba.wide.ad.jp
 * epel: hkg.mirror.rackspace.com
 * extras: ftp.tsukuba.wide.ad.jp
 * remi-safe: mir01.syntis.net
 * updates: ftp.tsukuba.wide.ad.jp
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ httpd24u-mod_ssl.x86_64 1:2.4.46-1.el7.ius を インストール
--> 依存性解決を終了しました。

依存性を解決しました

===================================================================================================================================================================================================================
 Package                                                 アーキテクチャー                              バージョン                                                 リポジトリー                                容量
===================================================================================================================================================================================================================
インストール中:
 httpd24u-mod_ssl                                        x86_64                                        1:2.4.46-1.el7.ius                                         ius                                        118 k

トランザクションの要約
===================================================================================================================================================================================================================
インストール  1 パッケージ

総ダウンロード容量: 118 k
インストール容量: 248 k
Is this ok [y/d/N]: y
Downloading packages:
httpd24u-mod_ssl-2.4.46-1.el7.ius.x86_64.rpm                                                                                                                                                | 118 kB  00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  インストール中          : 1:httpd24u-mod_ssl-2.4.46-1.el7.ius.x86_64                                                                                                                                         1/1
  検証中                  : 1:httpd24u-mod_ssl-2.4.46-1.el7.ius.x86_64                                                                                                                                         1/1

インストール:
  httpd24u-mod_ssl.x86_64 1:2.4.46-1.el7.ius

完了しました!
# httpd -M | grep -i 'ssl'
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to suppress this message
 ssl_module (shared)
#

入りました。testsite.confwをvimで開き、コメントアウトした設定を戻してテストしてみます。

# httpd -t
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to suppress this message
Syntax OK
#

Syntax OKになったのでhttpdを再起動してhttpsでアクセスしてみます。

# systemctl restart httpd
Job for httpd.service failed because the control process exited with error code. See "systemctl status httpd.service" and "journalctl -xe" for details.
# journalctl -xe
 225 01:01:01 localhost.localdomain systemd[1]: Started Session 7 of user root.
-- Subject: Unit session-7.scope has finished start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit session-7.scope has finished starting up.
--
-- The start-up result is done.
 225 01:01:01 localhost.localdomain CROND[15523]: (root) CMD (run-parts /etc/cron.hourly)
 225 01:01:01 localhost.localdomain run-parts(/etc/cron.hourly)[15526]: starting 0anacron
 225 01:01:01 localhost.localdomain anacron[15532]: Anacron started on 2021-02-25
 225 01:01:01 localhost.localdomain run-parts(/etc/cron.hourly)[15534]: finished 0anacron
 225 01:01:01 localhost.localdomain anacron[15532]: Normal exit (0 jobs run)
 225 01:01:01 localhost.localdomain systemd[1]: Removed slice User Slice of root.
-- Subject: Unit user-0.slice has finished shutting down
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit user-0.slice has finished shutting down.
 225 01:17:43 localhost.localdomain yum[15562]: Installed: 1:httpd24u-mod_ssl-2.4.46-1.el7.ius.x86_64
 225 01:21:58 localhost.localdomain polkitd[666]: Registered Authentication Agent for unix-process:15576:871767 (system bus name :1.49 [/usr/bin/pkttyagent --notify-fd 5 --fallback], object path /org/freedesk
 225 01:21:58 localhost.localdomain systemd[1]: Stopping The Apache HTTP Server...
-- Subject: Unit httpd.service has begun shutting down
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit httpd.service has begun shutting down.
 225 01:21:59 localhost.localdomain systemd[1]: Stopped The Apache HTTP Server.
-- Subject: Unit httpd.service has finished shutting down
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit httpd.service has finished shutting down.
 225 01:21:59 localhost.localdomain systemd[1]: Starting The Apache HTTP Server...
-- Subject: Unit httpd.service has begun start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit httpd.service has begun starting up.
 225 01:21:59 localhost.localdomain httpd[15585]: AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to
 225 01:21:59 localhost.localdomain systemd[1]: httpd.service: main process exited, code=exited, status=1/FAILURE
 225 01:21:59 localhost.localdomain systemd[1]: Failed to start The Apache HTTP Server.
-- Subject: Unit httpd.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit httpd.service has failed.
--
-- The result is failed.
 225 01:21:59 localhost.localdomain systemd[1]: Unit httpd.service entered failed state.
 225 01:21:59 localhost.localdomain systemd[1]: httpd.service failed.
 225 01:21:59 localhost.localdomain polkitd[666]: Unregistered Authentication Agent for unix-process:15576:871767 (system bus name :1.49, object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale ja
#

エラーとなりました。journalctl -xeだとあまり有用な情報が書かれていないため、httpdのerrorログを見てみます。

/var/log/httpd/error_log
[Thu Feb 25 01:22:41.265211 2021] [ssl:error] [pid 15604:tid 15604] AH02579: Init: Private key not found
[Thu Feb 25 01:22:41.265291 2021] [ssl:error] [pid 15604:tid 15604] SSL Library Error: error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag
[Thu Feb 25 01:22:41.265300 2021] [ssl:error] [pid 15604:tid 15604] SSL Library Error: error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error
[Thu Feb 25 01:22:41.265305 2021] [ssl:error] [pid 15604:tid 15604] SSL Library Error: error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag
[Thu Feb 25 01:22:41.265311 2021] [ssl:error] [pid 15604:tid 15604] SSL Library Error: error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error (Type=RSA)
[Thu Feb 25 01:22:41.265317 2021] [ssl:error] [pid 15604:tid 15604] SSL Library Error: error:04093004:rsa routines:OLD_RSA_PRIV_DECODE:RSA lib
[Thu Feb 25 01:22:41.265321 2021] [ssl:error] [pid 15604:tid 15604] SSL Library Error: error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag
[Thu Feb 25 01:22:41.265327 2021] [ssl:error] [pid 15604:tid 15604] SSL Library Error: error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error (Type=PKCS8_PRIV_KEY_INFO)
[Thu Feb 25 01:22:41.265335 2021] [ssl:emerg] [pid 15604:tid 15604] AH02312: Fatal error initialising mod_ssl, exiting.
[Thu Feb 25 01:22:41.265337 2021] [ssl:emerg] [pid 15604:tid 15604] AH02564: Failed to configure encrypted (?) private key localhost.localdomain:443:0, check /etc/httpd/conf/ssl.key/server.key
AH00016: Configuration Failed

Private key not foundとなっています。ちょっとググってみると、そもそも秘密鍵が正しくない可能性があるみたいなので、とりあえずcatで中を見てみます。

# cat /etc/httpd/conf/ssl.key/server.key
Vim: Caught deadly signal TERM
Vim: preserving files...
Vim: Finished.
#

なんじゃこりゃ。ただ、こういう内容のファイルが出来上がってしまった心当たりがある(コマンドのコピペミスで変なコマンドが大量に実行された)ので、素直に作り直します。
本番じゃなくてよかった。

# openssl genrsa 2048 > server.key
Generating RSA private key, 2048 bit long modulus
..............+++
........................................+++
e is 65537 (0x10001)
# openssl req -new -key server.key > server.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
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) []:
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
# openssl x509 -days 3650 -req -signkey server.key < server.csr > server.crt
Signature ok
subject=/C=JP/L=Default City/O=Default Company Ltd
Getting Private key
# cat server.key
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEA2oQpF1zHx/LdbdUewYnEv2zFa2zeWsT+JW7wkSRODG0y7i9y
+j3YNN91MrzX3iRnuVF7gZBKK3Jh9DFLp345mLspGopQHMN5+4F5dvj7z7j15gCs
... 略 ...
01gTOAdJGce0ivHimsNs9BhqwPvRvObpgHeiYP+ii8Dghd2SSM0UP5vxIYzeUdyz
wFyoIwHhEwXXrNwewnzs0oL0Kq5z3iW5aC0RpeCg4xc93/+BxxE=
-----END RSA PRIVATE KEY-----
#

ちゃんとできてるようなので差し替えてhttpdの再起動を実施します。

# mv server.key /etc/httpd/conf/ssl.key/
mv: `/etc/httpd/conf/ssl.key/server.key' を上書きしますか? yes
[root@localhost ~]# mv server.crt /etc/httpd/conf/ssl.crt/
mv: `/etc/httpd/conf/ssl.crt/server.crt' を上書きしますか? yes
# httpd -t
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to suppress this message
Syntax OK
# systemctl start httpd
#

起動しました。ブラウザでアクセスしてみます。オレオレ証明書なので以下のような警告が出てきますが、アクセスするをクリックするとIt works!が表示されました。

It works!

HTTP/2の有効化

HTTP/2を有効化してみます。とりあえずindex.htmlをドキュメントルート下に配置し、現在の通信プロトコルを確認します。

/var/www/html/index.html
<h1>TEST PAGE</h1>

HTTP/1.1での通信になっています。

作業前

testsite.confに一行追加して再起動、ブラウザでアクセスしてみます。

/etc/httpd/conf.d/testsite.conf
<VirtualHost *:443>
    DocumentRoot /var/www/html
    Protocols h2 http/1.1
    SSLEngine on
    SSLCertificateFile conf/ssl.crt/server.crt
    SSLCertificateKeyFile conf/ssl.key/server.key
</VirtualHost>

作業前

変わっていません。キャッシュをクリアするとよいとの記事もあったのでシークレッドウィンドで試してみましたがやっぱり変わっていませんでした。 モジュールが読み込まれているか確認します。

# httpd -M | grep http
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to suppress this message
 http_module (static)
 http2_module (shared)
 proxy_http_module (shared)
#

読み込まれていそうです。Protocolsをh2, http/1.1とし、http/1.1も許可されている状態なのでhttp/1.1を削除して試してみましたがhttp/1.1で通信されてしまいます。 LogLevelをdebugに変更してapacheを再起動し、ログを見てみます。

/etc/httpd/conf/httpd.conf(抜粋)
#
# LogLevel: Control the number of messages logged to the error_log.
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
#
LogLevel debug
/var/log/httpd/error_log
[Wed Feb 24 23:21:16.003712 2021] [http2:warn] [pid 15152:tid 15152] AH10034: The mpm module (prefork.c) is not supported by mod_http2. The mpm determines how things are processed in your server. HTTP/2 has more demands in this regard and the currently selected mpm will just not do. This is an advisory warning. Your server will continue to work, but the HTTP/2 protocol will be inactive.

debugにするまでもなくログに出てました。preforkだとダメってこと見たいです。00-mpm.confを編集してmpmeventmoduleに変更してみます。

/etc/httpd/conf.modules.d/00-mpm.conf
# Select the MPM module which should be used by uncommenting exactly
# one of the following LoadModule lines:

# prefork MPM: Implements a non-threaded, pre-forking web server
# See: http://httpd.apache.org/docs/2.4/mod/prefork.html
# LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

# worker MPM: Multi-Processing Module implementing a hybrid
# multi-threaded multi-process web server
# See: http://httpd.apache.org/docs/2.4/mod/worker.html
#
#LoadModule mpm_worker_module modules/mod_mpm_worker.so

# event MPM: A variant of the worker MPM with the goal of consuming
# threads only for connections with active processing
# See: http://httpd.apache.org/docs/2.4/mod/event.html
#
LoadModule mpm_event_module modules/mod_mpm_event.so

mpmeventmoduleに変更してもダメでした。ただ、ログ上ではhttp/2がNGとはなっていないです。

/var/log/httpd/error_log
[Sat Feb 27 15:01:01.322773 2021] [http2:info] [pid 4549:tid 4549] AH03090: mod_http2 (v1.15.14, feats=CHPRIO+SHA256+INVHD+DWINS, nghttp2 1.33.0), initializing...

curlで詳細ログを出してみてみます。

# /usr/local/bin/curl -Iv --http2 --insecure https://localhost/
*   Trying ::1:443...
* Connected to localhost (::1) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
* successfully set certificate verify locations:
*  CAfile: /etc/pki/tls/certs/ca-bundle.crt
*  CApath: none
* TLSv1.2 (OUT), TLS header, Certificate Status (22):
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
* ALPN, server accepted to use http/1.1
* Server certificate:
*  subject: C=--; ST=SomeState; L=SomeCity; O=SomeOrganization; OU=SomeOrganizationalUnit; CN=l2-test.mshome.net; emailAddress=root@l2-test.mshome.net
*  start date: Feb  9 02:28:49 2021 GMT
*  expire date: Feb  9 02:28:49 2022 GMT
*  issuer: C=--; ST=SomeState; L=SomeCity; O=SomeOrganization; OU=SomeOrganizationalUnit; CN=l2-test.mshome.net; emailAddress=root@l2-test.mshome.net
*  SSL certificate verify result: unable to get local issuer certificate (20), continuing anyway.
> HEAD / HTTP/1.1
> Host: localhost
> User-Agent: curl/7.75.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
HTTP/1.1 200 OK
< Date: Sat, 27 Feb 2021 08:17:45 GMT
Date: Sat, 27 Feb 2021 08:17:45 GMT
< Server: Apache/2.4.46 (IUS) OpenSSL/1.0.2k-fips
Server: Apache/2.4.46 (IUS) OpenSSL/1.0.2k-fips
< Last-Modified: Wed, 24 Feb 2021 16:46:13 GMT
Last-Modified: Wed, 24 Feb 2021 16:46:13 GMT
< ETag: "13-5bc17c5dc4a35"
ETag: "13-5bc17c5dc4a35"
< Accept-Ranges: bytes
Accept-Ranges: bytes
< Content-Length: 19
Content-Length: 19
< Content-Type: text/html; charset=UTF-8
Content-Type: text/html; charset=UTF-8

<
* Connection #0 to host localhost left intact
#
  • ALPN, server accepted to use http/1.1

これ見る限りサーバ側の問題っぽいですね。
長くなったのでいったん終わり。