UWP アプリは localhost へ接続できない

2020.07.29

TL;DR

UWP (Windows Store) アプリはデフォルトでループバック (localhost) に接続できないので免除リストに登録する必要がある

概要

Charles で Windows Store アプリ (UWP アプリ) の通信を確認したかったが一向に通信がキャプチャできない. しかも Charles を起動したら UWP アプリだけ一切の通信ができなくなってしまった.

原因

UWP アプリはデフォルトでループバックアドレス (localhost) へのアクセスをブロックされている:

プロセス間通信 (IPC) - UWP applications

Charles や MITM Proxy 等はローカルにプロキシサーバを起動し, Windows のプロキシ設定をそこに向ける. Charles の場合, デフォルトでは 127.0.0.1:8888 にプロキシサーバが起動し, Windows のプロキシ設定もそこに向けられていた.

しかし, UWP アプリは 127.0.0.1 にアクセスできないため, 一切の通信が行えなくなった.

解決

UWP アプリをループバック規制の免除リストに追加する.

PackageFamilyName を確認

Store ページとかディレクトリとか簡単に確認する方法が無いかいろいろ試したが駄目っぽい. 仕方ないので PowerShell を使う:

PS > Get-AppxPackage | Select -Property Name,PackageFamilyName
...
Microsoft.XboxApp                                  Microsoft.XboxApp_8wekyb3d8bbwe
Microsoft.MinecraftUWP                             Microsoft.MinecraftUWP_8wekyb3d8bbwe
Microsoft.BingNews                                 Microsoft.BingNews_8wekyb3d8bbwe
NVIDIACorp.NVIDIAControlPanel                      NVIDIACorp.NVIDIAControlPanel_56jybvy8sckqj
...

名前で当たりを付けるなら:

PS > PS > Get-AppxPackage | Select -Property Name,PackageFamilyName | Select-String "minecraft"
@{Name=Microsoft.MinecraftUWP; PackageFamilyName=Microsoft.MinecraftUWP_8wekyb3d8bbwe}

Name にも PackageFamilyName にもアプリ名が含まれていないアプリもあったので気合でなんとかする必要もあるかもしれない.

リストへ追加

管理者権限が必要.

試しに Minecraft を追加してみる.

PS > CheckNetIsolation.exe LoopbackExempt -a -n="Microsoft.MinecraftUWP_8wekyb3d8bbwe"
OK.

確認する.

PS > CheckNetIsolation.exe LoopbackExempt -s
[1] -----------------------------------------------------------------
    Name: microsoft.minecraftuwp_8wekyb3d8bbwe
    SID:  S-1-15-2-1958404141-86561845-1752920682-3514627264-368642714-62675701-733520436

[2] -----------------------------------------------------------------
...

追加できているので, アプリでループバックへ接続できるか試す.

余談

Minecraft for Windows 10 (Bedrock Edition) でローカルに建てた Dedicated Server に接続できないのも, これが原因である. サーバに同梱されている README にも同じ対処法が記載されている:

On some systems, when you wish to connect to the server using a client running on the same machine as the server is running on, you will need to exempt the Minecraft client from UWP loopback restrictions:

CheckNetIsolation.exe LoopbackExempt –a –p=S-1-15-2-1958404141-86561845-1752920682-3514627264-368642714-62675701-733520436

ドキュメントにはマニフェストをいじれば制限の対象外に出来るような記述があったけれど, UWP いじったことないので適当なことは言えない…