CloudflareのSSL通信復号化でアプリエラー
Cloudflare Zero TrustのSSL復号化(Decryption)を使っていると、一部のiPhoneアプリでエラーが発生した。その対策を記録する。
2024年5月6日
CloudflareのSSL復号化すると、iPhoneアプリでエラー発生
Cloudflare Zero Trustの機能でSSL復号化(SSL Decryption)
が使えます。この機能を有効にするとブラウザとウェブサーバ間で暗号化されているSSL通信をCloudflareが解読して、HTTPヘッダーやコンテンツによるフィルタリング、ウィルスチェックが可能になります。
機能評価のためしばらく使っていたのですが、一部のiPhoneアプリでエラーが発生していることに気づきました。私が使っていないアプリやエラーに気づいていない可能性もありますから、もっと多くのアプリに影響があったかもしれません。また、各アプリですべての機能をチェックしていないので、他にエラーになっている機能があるかもしれません。
AppストアとiMessage
Appストアは画像のようにコンテンツが表示されないエラーになりました。また、iMessageは過去に受け取ったメッセージが何度か再送されてきました。
モバイルSuica
通常のタッチ決済はできましたが、チャージしようとするとエラーが表示されました。
PayPay
Paypayはアプリを開いた直後から、画面上部にインターネットに接続できません
のエラーが表示されて、アプリが使えない状態になってしまいました。
エラーの原因はSSL証明書ピンニング(SSL Certificate Pinning)
エラーの原因はSSL証明書ピンニング(SSL Certificate Pinning)
でした。SSL/TLS通信はサーバ証明書が正規の認証局から発行されているものであれば信頼してしまいますが、何らかの理由で攻撃者が正規の証明書を発行できて、通信を途中で傍受している場合やユーザーが証明書のエラーを無視して通信してしまっている場合などのリスクがあります。
その対策として、アプリにサーバ証明書そのものやハッシュ値などを埋め込み、自身のアプリが意図した証明書が使われているか認証する行為をSSL証明書ピンニングと呼びます。
CloudflareのSSL復号化は正規のサーバの代わりに、CloudflareがSSL証明書を発行しているため、その証明書がアプリから否認されて、エラーとなってしまいます。
ピンニングしているアプリやサービスを除外する。
対策としては、Cloudflare Gateway
を使って対象サービスをSSL復号化から除外すればよいです。
iCloud系サービスの場合
Cloudflare Zero Trust
のFirewall Policy
へ移動します。
Add Pilicy
から新しいHTTP Policyを追加します。
ポリシー名や説明は任意に入力して、Add Condition
から条件を追加します。
以下画像のように、Application
がDo Not Inspect
グループに含まれているという条件を入力します。この場合ですと、iCloud以外のサービスもSSL復号化から除外されてしまいますので、iCloudなど特定のサービスのみで構わない場合は、Apple(Do Not Inspect)
のように個別サービスのみチェックします。
条件に一致した場合の動作をDo Not Inspect
を選択して、ポリシーを保存すれば完了です。
モバイルSuica、PayPayなど日本独自サービスの場合
グローバルなサービスはCloudflareがあらかじめ選択肢を用意してくれていますが、モバイルSuicaなど日本独自のサービスはそうはいきませんでした。自分で除外対象のドメインやIPアドレスを調べて、ポリシーを追加するしかありません。
Cloudflare Zero TrustのLogs > Gateway > DNS
からDNSリクエストのログを確認できます。アプリでエラーが発生している時点のログを調べれば、アプリがどのようなホストへ通信をしようとしているのか、おおよそ把握できます。
PayPayの場合はpaypay.ne.jp
ドメインのホストに通信を行っているようなので、iCloudの場合と同様にGatewayのFirewallからHTTPポリシーを追加して、条件にドメイン名を選択します。
まとめ
Cloudflareがデフォルトで対応していないSSLピンニングをしているサービスですと、自分でドメイン名などを調べないといけないため、ひと手間かかりますし指定漏れがあるとエラーが解消しないかもしれません。SSL復号化はそういったリスクを含めて実施するものと思います。