Charlesと古いAndroidの組み合わせに助けられた話

2022/05/21

顛末

Androidのとある調査の過程で、自前アプリ以外の通信内容を確認したい局面が出てきました。「自前アプリが連携している別アプリ側の通信内容がわからないと、自前アプリ側で何が起きているかわからない!」みたいな感じ。

「Charlesだと自前アプリしか確認できないんだよな。どうしようかな……」と悩んでいたところで、使い道がなくて放置していたAndroid 5.1の端末があることを思い出しました。

この端末を引っ張り出してきて、Charlesと組み合わせることで無事SSL通信の中身を確認できた、という話です。

技術的背景

AndroidのSSL通信をCharlesで確認する際は、Charlesが発行する証明書をAndroid端末にインストールします。この証明書はCharles内の自己認証局(CA)がサインしたオレオレ証明書です。

この手の証明書の扱いがAndroidのバージョンによって異なるんですよね。

ネットワーク セキュリティ構成  |  Android デベロッパー  |  Android Developers』のページに

デフォルトでは、すべてのアプリのセキュアな接続(TLS や HTTPS などのプロトコルを使用)は、システムにプリインストールされた CA を信頼し、Android 6.0(API レベル 23)以下を対象とするアプリは、ユーザーが追加した CA ストアも信頼します。アプリは base-config(アプリ全体のカスタマイズ)または domain-config(ドメイン単位のカスタマイズ)を使用して、独自の接続をカスタマイズすることもできます。

と書かれています。つまり、

  • Android 7.0以前:ユーザーが追加したCAも信頼してくれる
  • Android 7.0以降:システムにプリインストールしているCAのみを信頼する
  • アプリは「どのCAを信頼するか」を独自に設定できる

となります。

この影響で、Android7.0以降は「自前のアプリしかSSL通信の中身を確認できない」ことになります。

Charlesの公式サイトのSSL Certificatesページに

As of Android N, you need to add configuration to your app in order to have it trust the SSL certificates generated by Charles SSL Proxying. This means that you can only use SSL Proxying with apps that you control.

と書かれている通りですね。DeepL翻訳によると

Android N では、Charles SSL Proxying が生成する SSL 証明書をアプリに信頼させるために、アプリに設定を追加する必要があります。つまり、SSL Proxyingを使用できるのは、お客様が管理するアプリのみとなります。

とのこと。

今回のように自前アプリ以外のSSL通信を確認したい場合は、Android7.0より前の端末を使うのが手っ取り早いわけですね。

余談

Android 5.1の端末には「Runtime Permissionに対応していない」という挙動差異もあります。Runtime PermissionはAndroid 6.0で導入された機能なので。今回の調査ではこの違いにも地味に助けられました。

この端末、調査用として今後も大事に保管しておきます。




関連(するかもしれない)記事


おススメ