モバイルSuicaのSSL復号化問題を解決する。
Cloudflare Zero TrustのSSL復号化機能を有効にするとiPhoneのモバイルSuicaで残高をチャージする際にエラーが発生します。この問題の解決に取り組みました。
2024年5月16日
モバイルSuicaのSSL復号化問題
Cloudflare Zero TrustのSSL復号化機能を有効にするとiPhoneのモバイルSuicaで残高をチャージする際にエラーが発生します。先日のSSL証明書ピンニングについて記事を書きましたが、モバイルSuicaも証明書がアプリ内に埋め込まれているため、Cloudflareが発行した証明書とミスマッチしてエラーが起きていると考えられます。
Suicaをオートチャージにしていて、改札を通過した際や券売機でFelicaを使ったチャージは問題ないようです。
チャージしたい場合にはCloudflare WARPアプリ(1.1.1.1)から保護を無効にすれば良いのですが、そうすると切り替えの手間や、戻し忘れが発生してしまいます。Cloudflareにはユーザー側で保護を無効にさせない機能があり、企業利用の場合はセキュリティを担保できるメリットがあります。これが使えなくなってしまいます。
モバイルSuicaが通信しているサーバを特定し、それをSSL復号化の対象から除外すれば解決すると思われるので、調査してみます。
調査結果
先に結果をお伝えしますと、問題の解決には至りませんでした。Cloudflare Zero TrustでモバイルSuicaに関係しそうな通信をできる限り洗い出し、除外してみたもののエラーは解消されませんでした。 調査の結果特定できた通信先サーバと思わしきドメイン名や原因切り分けの記録をまとめることで、誰かのお役に立てればと思い記事にさせてもらいます。
エラーの発生状況と切り分け
通信ログを追う前に、アプリの動作やCloudflare側でSSL復号化を有効、無効に切り替えた場合の動作を確認してみます。
iOS 17
、モバイルSuicaアプリVer3.3.0
でエラーが発生する。- モバイルSuicaのチャージ処理を実行後にしばらく待った後で、エラーが発生する。
- クレジットカード払い、ApplePay共にエラーが発生する。
- Suicaの利用履歴照会(SF履歴)機能は問題ないが、グリーン券購入は不明
- CloudflareでSSL復号化を有効にしているとエラーが発生し、無効化するとエラー解消し問題なくチャージできる。ネットワーク経路に違いはないと考えられるので、SSL証明書関係のエラーと思われる。
CloudflareのGatewayログから通信を調査
Zero TrustのLogs > Gateway
からDNSやHTTPのアクセスログを調べられます。
設定でSSL復号化を無効にしてから、iPhoneでモバイルSuicaのチャージをやってみます。DNS
にはDNSへ名前解決したログがしばらくすると記録されます。HTTP
にはウェブサーバへリクエストしたログが記録されます。それぞれ使用してるデバイスでフィルターできますが、アプリケーションやエージェントはわからないので、時刻やドメイン名からどのログがモバイルSuicaに関連するものか当たりを付けます。
調査の結果、4つのドメインがモバイルSuicaのチャージに関連していると思われます。モバイルSuica本家のドメイン以外は決済サービスのようです。
- mobilesuica.com
- stripe.com
- stripe.network
- fnopf.com
判明したドメインへの通信をSSL復号化の対象から除外
GatewayのFirewall Poricies
で特定したドメインを監査除外(Do Not Inspect
)とします。そうするとログの結果結果が変わって、Action
列の値がBYPASS
となりSSL復号化の対象となっていることが確認できます。
しかし、エラー解消されず
モバイルSuicaのチャージ処理を行ったタイミングで発生している通信は、すべて監査除外されているようですが、依然としてエラーは解消されませんでした。次のような原因が考えられますが、今回のところは解決を断念しました。
- HTTPS以外でSSL証明書を使った通信が行われていて、ログにはそれが記録されていない。
- ログの記録が遅延していたり、何らかの理由で欠損している。
Wireshark
などのパケットキャプチャできる環境を整えられたら、再度挑戦してみたいと思います。