iOS 14 Safariではホスト名にアンダースコア(_)が含まれるWebページへのHTTPSアクセスが失敗する【一部未検証箇所あり】


TL;DR

ホスト名にアンダースコア _ は使わないこと。
下記の条件下で問題が起きる。

  • HTTPSページにSafariでアクセスする
  • iOS 14
  • ホスト名にアンダースコアが含まれる

下記は未検証

  • 証明書がワイルドカード証明書のときに起こったが、それ以外の証明書でも起こるのか?

DO NOT use any underscore _ in HTTPS hostname, or you will encounter a SSL certificate error while accessing HTTPS web page in Safari on iOS 14 or later version.

発見の経緯

起こった不具合

iOS 14にアップデートしたところ弊社(onecareer.jp)サイト内の某LPのコンテンツが表示されなくなった。

対象ページについて

Headless CMSを使ってコンテンツ入稿し、ajaxでCMSからコンテンツ取得してjQueryでページにコンテンツを埋め込んでいた。

トラブルシュート

初動

iOS 14のSafariでしか起こっていないので、iPhoneをMacにつないでSafariの開発者モードを起動。
失敗しているHTTPリクエストを調査。
SSLエラーによりコンテンツ取得していないことが判明。

調査

iOS 14に関する証明書絡みのネタを洗った。
2020年9月1日以降に発行した証明書は1年ちょっと以内の有効期限じゃないといけなくなる変更が発表されているが、今回の証明書はそのNGパターンに該当しない。
けれども、証明書検証ロジックに変更があったのは確かっぽい。

Headless CMSのサイト側も怪しいので、ajaxから叩くエンドポイント以外でも再現するページがないか、iOS Safariでアクセスしてみる。
一部の管理側ページも同様のエラーが起こることを確認。
エラーが発生する条件を帰納的に調べたところ、アンダースコア _ がホスト名に含まれるサイトで同様の不具合が発生することが分かった。

考察

そもそも、RFC的にはホスト名にアンダースコアは含めることができない。
だが、今回利用していたHeadless CMSは、CMSのワークスペースを生成するときにアンダースコアを含むワークスペース名を指定することができた。
また、そのCMSはワークスペース名をそのままサブドメイン部に用いたサイトを生成し、その中でコンテンツ管理をする仕様になっていた。

これまでのバージョンのiOS Safariは、RFCの定義に反し暗黙のうちにアンダースコアを含むホスト名の証明書検証をパスしてきた模様。
一方、直近のiOS Safariでの証明書検証ロジックが変更され、アンダースコア周りの処理条件も暗黙のうちに厳格化されたと考えられる。

まとめ

Webの世界はたくさんRFC非準拠な実装が溢れているが、自分だけはRFCを守ろう。
それが自分の身と、自分の周りの大切な人を守ることに繋がる。