ローカル環境にChromeでアクセス可能なHTTP/3サーバを立てる

OpenLiteSpeed (lsws)を使用してローカル環境にHTTP/3サーバを構築する手順を記載します。構築したサーバにはGoogle Chromeでアクセス可能になります。

ローカル環境にHTTP/3サーバを構築する際の課題

HTTP/3 (QUIC) はTLS 1.3が必須です。すなわちhttpsのみ使用でき、httpによるアクセスは出来ません。ローカル環境でちょっと試したい時には少々面倒になります。オレオレ証明書(自己証明書)を作成することでhttpsでアクセス可能になりますが、デフォルトではHTTP/3でアクセスできません(証明書の警告が出てHTTP/2にフォールバックされます)。HTTP/3でアクセス可能にするためには、Chromeの起動オプションによって警告を無視するようにする必要があります。

実行環境

実行環境は下記のようにWidows PCとUbuntuが直結した構成です。WindowのChromeから”https://myserver.com”と指定してHTTPサーバにアクセスします。

OpenLiteSpeedのインストール

OpenLiteSpeedのリポジトリを追加してパッケージをインストールします。

Bash
$ sudo wget -O - http://rpms.litespeedtech.com/debian/enable_lst_debian_repo.sh | sudo bash
$ sudo apt install openlitespeed

インストール後、下記のシェルを実行してOpenLiteSpeedの管理画面にログインするためのユーザ名、パスワードを設定します。

Bash
$ sudo /usr/local/lsws/admin/misc/admpass.sh

http://<HTTPサーバのIPアドレス>:7080にアクセスすることで管理画面にログインすることができます。

参考:Ubuntu Linux 20.04 LTSにLiteSpeedのオープンソース版(OpenLiteSpeed)をインストールしてみる

オレオレ証明書の作成

証明書にSubjectAltName(SAN)を設定するため下記ファイルを用意します。

Bash
$ cat subjectnames.txt
subjectAltName = DNS:myserver.com, IP:192.168.232.100

下記コマンドを実行して証明書を作成します。

Bash
$ openssl genrsa 2048 > server.key
$ openssl req -new -key server.key -subj "/C=JP/CN=myserver.com" > server.csr
$ openssl x509 -days 3650 -req -extfile subjectnames.txt -signkey server.key < server.csr > server.crt
Certificate request self-signature ok
subject=C = JP, CN = myserver.com

下記のコマンドで証明書の内容を確認できます。

Bash
$ openssl x509 -in server.crt -text -noout

参考:Chromeで使えるオレオレ証明書を作成する方法

OpenLiteSpeedの設定・証明書の配置

Listener・Virtual Hostの作成

HTTP/3でアクセスするためのListenerを作成します。この例では443ポートをHTTP/3でアクセスできるようにします。

左のメニューからListenerを作成します。

続いてListenerの名前、ポート番号、Secure情報(https有無)の情報を入力します。

Listnerを新規作成後、作成したListenerをクリックして編集画面を開き、Virtual Host Mapping(対応するページの情報)を追加します。

とりあえずVirtual Hostには最初から存在するデモページ(Example)を指定します。

証明書の配置

/usr/local/lsws/sslにディレクトリを掘って配下に先ほど作成したオレオレ証明書を配置します。

Bash
mokulog@myserver:/usr/local/lsws/ssl$ pwd
/usr/local/lsws/ssl
mokulog@myserver:/usr/local/lsws/ssl$ ls -lrth
total 8.0K
-rw-r--r-- 1 root root 1.7K Apr 25 12:15 server.key
-rw-r--r-- 1 root root 1.2K Apr 25 12:15 server.crt

OpenLiteSpeedのListenerの編集画面を開き、Private Key FileおよびCertificate Fileに証明書のパスを記載します。$SERVER_ROOTが/usr/local/lswsに対応します。

パスを記載したらOpenLiteSpeedの更新ボタンを押して設定を反映します。

Google Chromeの起動パラメータ

下記のコマンドで証明書のハッシュ値を求めます。Chromeに警告を無視してもらうために必要になります。

Bash
$ openssl x509 -noout -pubkey -in server.crt | openssl pkey -pubin -outform der  | openssl dgst -sha256 -binary | base64
L64j4lvYpywaaReKzV2OwXgkV1VZNg61Phvvi38iSJM=

Chromeの起動パラメータ “–ignore-certificate-errors-spki-list=” に先ほど求めたハッシュ値を指定します。その他、HTTP/3でアクセスしにいくようにいくつかパラメータを追加します。下記のようなbatファイルにすると楽です。

Bash
$ cat chrome.bat
"C:\Program Files\Google\Chrome\Application\chrome.exe" --new-window --enable-quic --quic-version=h3 --origin-to-force-quic-on=myserver.com:443 --ignore-certificate-errors-spki-list="L64j4lvYpywaaReKzV2OwXgkV1VZNg61Phvvi38iSJM=" https://myserver.com

参考:ChromeでHTTP/3サーバーをlocalhostに立てて自己証明書を信頼させてもHTTP/3通信できない + 解決策

ホスト名の登録

myserver.comがHTTPサーバのIPアドレス(192.168.232.100)に変換されるようにWindows PC上のhostsファイル編集します。

Bash
mokulog@WSL:/mnt/c/Windows/System32/drivers/etc$ cat hosts
...(途中省略)...
192.168.232.100       myserver.com

参考:hostsファイルの設定方法(Windows)

実行結果

batファイルをクリックしてChromeを起動し、ChromeでOpenLiteSpeedのデモページが表示できること、通信プロトコルがh3になっていることが確認できれば成功です。