msquic@Linux
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