丁寧に手を抜く

頑張らない努力

iOS 13.3 (Xcode 11.3) から .devと.appがHSTS preload listに追加された件

f:id:craftzdog:20191215211603j:plain

12月10日にXcode 11.3がリリースされた

InkdropというMarkdownアプリのモバイル版をReact Nativeアプリで開発している。 今日Xcodeを11.3にアップデートした。それに伴い、シミュレータのiOSのバージョンが13.3になった。 するとアプリから開発用サーバにHTTPリクエストを飛ばせなくなり、代わりにSSLのハンドシェイクエラーが起こるようになった。

React Nativeのソースコードを追うも、リクエストは正しく http で飛ばしている。 しかし、NSURLSession周りの処理で件のエラーとなり、エラーメッセージに示されたリクエストURLはなぜかhttpsに書き換えられているのだ。 はいはいApp Transport Security(ATS)ねと思いきや、設定は間違っていない様子。 調べてみるとどうやらHTTP Strict Transport Security (HSTS)臭い。

Xcodeのアップデート起因なので、そこが悪いと睨んでリリースノートを読んだらまさに合致する項目があった。以下引用:

Certain top-level domains (TLDs) such as.devand.appare now in the FoundationURLSessionandNSURLConnectionHTTP Strict Transport Security (HSTS) preload list. An app which usesURLSessionto visit a matching URL will always navigate to the URL ashttps://, and never as cleartexthttp://. See theHTTP Strict Transport Security (HSTS) Specificationfor more information about HSTS. (56247242)

-- iOS & iPadOS 13.3 Release Notes | Apple Developer Documentation

つまり、TLD.dev.app が今回のリリースでHSTSのプリロードリストに追加されたというのだ。 .app は既にGoogle ChromeからもHTTPSしかリクエストを受け付けなくなっている。 それと同じ規約がiOS上でも適用される事になったのだ。 自分のサービスのドメイン名は inkdrop.app だったので、影響を受けたという訳だ。

どうしてもHTTPリクエストを飛ばしたい場合は localhost か、.test TLDを使うのが確実だろう。 /etc/hosts を編集して、例えば hoge.test を自分の開発用サーバに向ければOK。

お陰様でReact NativeのiOS側のネットワーク周りの実装に詳しくなれたよ。

以上。