⚒️

msquic@Linux

2021/08/09に公開

QUICの実装はいろいろある

その中の msquic のビルド&テストを試した。

Windows10, Mac(Big Sur) では簡単に Test を通すことができた(※)が、自分のターゲットプラットフォームの Linux では苦戦した。結論としては、CentOS 8 では数百件発生したエラーを解消しきれなかったが、Ubuntu 18.04 上に構築するとすんなり Win や Mac と同等に Test 通すことができた。

※:src/platform/selfsign_openssl.c の431行目~の "not yet supported" な関数 CxPlatGetTestCertificate を使用する4つのテストは Fail になる(仕方ない)。

  • CredValidation.ConnectExpiredClientCertificate
  • CredValidation.ConnectExpiredServerCertificate
  • CredValidation.ConnectValidClientCertificate
  • CredValidation.ConnectValidServerCertificate

Ubuntu のインストール

Windows 10 Pro Hyper-V に Ubuntu 18.04 LTS をインストール を参考に、Hyper-V 上に Ubuntu をインストールした。

WSL上でもうまくいくかもしれないが、先に Hyper-V 上で試した CentOS と条件を揃えたかったため Hyper-V 上にインストールした。

使用した iso は 18.04.5-desktop-amd64

バージョンは msquic のビルド手順に登場する 18.04 を選択しておいた方がよいと思う。チャレンジするにしても、dotnet がサポートしている 21.04, 20.04 あたりがよい。

なお、標準インストールを選択した(最小インストールではない。インストール後にどうとでもなるのでこれは気にする必要はない)。

msquic のビルド

公式 に書いてあるが、複数ページを参照せずに済むように実行手順を以下に書き下す。

リポジトリをクローンする。

$ sudo apt install git
$ git clone https://github.com/microsoft/msquic.git
$ cd msquic/
$ git submodule update --init --recursive

CMake (>= 3.16) をインストールする。

外部リポジトリを追加しなければ Cmake >= 3.16 を満たせない。公式手順に記載のとおり、https://apt.kitware.com/ に従ってインストールする。

$ wget -q https://apt.kitware.com/kitware-archive.sh
$ chmod 755 kitware-archive.sh 
$ sudo ./kitware-archive.sh 
$ sudo apt-get install -y cmake

Powershell と dotnet をインストールする。

$ wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb
$ sudo dpkg -i packages-microsoft-prod.deb 
$ sudo apt-get update
$ sudo add-apt-repository universe
$ sudo apt-get install -y powershell
$ sudo apt-get update
$ sudo apt-get install -y apt-transport-https
$ sudo apt-get update
$ sudo apt-get install -y dotnet-sdk-5.0

ビルド

$ pwsh
PS > ./scripts/prepare-machine.ps1 -Configuration Dev
PS > ./scripts/build.ps1 -Tls openssl

テスト

PS > ./scripts/test.ps1 -Tls openssl

おまけ

全テストケースのリスト表示(実行はしない)

PS > ./scripts/test.ps1 -Tls openssl -ListTestCases

テストケースの除外

TlsTest.HandshakeCertFromFile を除外する場合は次のようにする。

PS > ./scripts/test.ps1 -Tls openssl -Filter *-TlsTest.HandshakeCertFromFile

Discussion