AndroidのプレインストールされたCAにCAを追加する
Android 7以降からCAの扱いが代わり、デフォルトではユーザが追加したカスタムのCAはアプリ毎に設定を書かないと信頼されなった。 システムにプレインストールされたCAは制限することも可能だが、基本的には信頼されている。 以下は、Root化された端末にプレインストールされたCAとして、カスタムのCAを追加する手順メモです(プレとは?)。
android-developers.googleblog.com
自己責任&悪用厳禁でお願いします。
環境
・検証環境
OS: LineageOS 14.1 Android version: 7.1.2 Device model: Nexus7
追加するのはProxyツールのBurp Suiteの証明書。
❯ openssl x509 -inform DER -in cacert.der -text -noout Certificate: Data: Version: 3 (0x2) Serial Number: 1402072607 (0x5391ee1f) Signature Algorithm: sha256WithRSAEncryption Issuer: C=PortSwigger, ST=PortSwigger, L=PortSwigger, O=PortSwigger, OU=PortSwigger CA, CN=PortSwigger CA Validity Not Before: Jun 6 16:36:47 2014 GMT Not After : Jun 6 16:36:47 2037 GMT Subject: C=PortSwigger, ST=PortSwigger, L=PortSwigger, O=PortSwigger, OU=PortSwigger CA, CN=PortSwigger CA Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public Key: (2048 bit) Modulus (2048 bit): 00:a2:43:8d:b6:91:10:bc:f9:ea:d9:d3:0c:39:d5: 34:11:dd:ed:d6:0e:76:41:57:85:b0:0d:c6:26:60: 2b:1d:a3:2a:d6:b1:f6:58:fe:3d:9a:70:91:fd:4e: 99:61:84:14:46:3f:22:f4:4e:8a:01:c2:3d:36:1a: 50:2b:17:84:0d:1d:53:8f:ff:ed:15:86:77:4d:6c: 80:c2:3c:12:46:5f:18:08:f9:53:f5:ff:f6:55:2b: 09:96:bd:a3:e9:11:d5:0f:fd:11:15:37:28:17:d8: fa:6a:bb:cc:50:65:13:fa:15:99:10:77:06:12:02: 01:a4:ea:9c:3c:86:e2:00:6c:71:c6:a9:6c:88:17: 5e:2e:f9:29:2c:97:94:4b:94:7c:23:94:78:bf:23: 18:18:a3:29:56:9f:5a:90:e1:a3:8f:2d:48:e9:fb: 11:ac:f9:80:ce:cf:80:a4:37:89:1a:1f:4c:96:fa: 77:d7:fa:da:69:f4:ac:f6:01:16:ea:29:25:4f:50: 16:cc:fe:10:f2:70:de:77:f2:e7:96:6c:00:3e:6e: 37:b9:59:d8:8c:cc:62:da:74:10:b6:6e:a1:df:c5: d6:3d:85:9d:6b:66:4c:d9:db:4b:c2:87:80:57:c2: 1f:80:44:89:04:8a:61:87:c6:69:1f:00:e6:37:0f: 7b:d1 Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Basic Constraints: critical CA:TRUE, pathlen:0 X509v3 Subject Key Identifier: 34:98:2B:45:74:9A:D6:56:55:64:CE:DA:62:FD:45:0C:4C:3A:D3:57 Signature Algorithm: sha256WithRSAEncryption 9e:2a:ad:2b:26:cf:80:ec:b5:1d:c5:95:05:9e:81:3c:69:4e: 3f:45:f8:ed:32:ce:ae:a3:b6:a3:33:5b:30:49:bd:87:07:32: be:e5:5a:12:0d:9b:31:38:95:3d:6a:33:cc:04:f7:eb:92:70: 76:ea:e7:f4:5c:8e:2d:b6:d1:28:15:0d:27:00:69:fe:3c:e9: 76:26:e6:b1:f8:14:94:51:80:1e:2a:a1:ab:fa:9b:e1:f3:b6: c3:38:0b:43:82:3f:31:9b:fa:50:a5:e2:26:4b:6b:2f:6a:4c: 9f:c6:4b:07:06:fb:ed:65:6e:78:35:77:17:28:35:00:73:77: 7f:f2:c8:1e:3b:f6:39:00:c2:bd:f3:38:c8:e3:20:8e:ce:ab: 3c:d6:ce:d6:ea:4e:01:af:32:42:62:e2:e2:a6:3b:3d:0e:7d: 93:bb:ee:ab:02:f6:09:54:d7:aa:06:69:87:77:c2:0b:5c:94: bf:56:83:e4:09:2f:af:aa:92:3c:42:6b:39:3f:a9:97:55:c1: 08:37:b3:05:d9:70:de:fa:86:fc:b3:0c:89:31:49:20:1b:83: e2:8f:cc:e9:9d:d4:76:40:63:9f:08:de:a9:d8:27:1c:cb:59: de:ec:84:a0:fa:e9:e5:3f:07:c6:a2:ab:96:a0:34:dc:25:e6: 25:19:85:01
カスタムCAの用意
subject_hashの値をとる。
❯ openssl version OpenSSL 0.9.8zh 14 Jan 2016 ❯ openssl x509 -noout -subject_hash -in cacert.der -inform DER 9a5ba575
OpenSSLのバージョンが1.0.0以降の場合は、 -subject_hash
ではなく、 -subject_hash_old
を使うらしい。
PEMフォーマットに変換し、ファイル名を(subject_hashの値 + .0
)で保存する。
❯ openssl x509 -inform DER -in cacert.der -outform PEM > 9a5ba575.0
AndroidにカスタムCAを追加する
AndroidのプレインストールされたCAは、 /system/etc/security/cacerts
に置かれている。ただここに置けば良い。
ただし、最初は /system はread onlyでマウントされているので注意する。
❯ adb push ./9a5ba575.0 /data/local/tmp [100%] /data/local/tmp/9a5ba575.0 ❯ adb shell flo:/ $ su flo:/ # mount -o rw,remount /system flo:/ #mv /data/local/tmp/9a5ba575.0 /system/etc/security/cacerts/
設定 → セキュリティ → 信頼できる認証情報 から確認できる。 再起動した方が良いという情報もあったが、手元の環境では再起動しなくても追加され使用できた。
ファイル名がsubject_hashと異なる値でもUI上には表示されるが参照されないようだった。
まとめ
Burpのルート証明書をAndroidのプレインストールされているフォーマットやファイル名を合わせてインストールした。
開発者がこのようなCAを拒否したい場合は、ネットワーク セキュリティ構成機能を使いプレインストールされたCAに対しても制限がかけることができる。 developer.android.com