Skip to content

Instantly share code, notes, and snippets.

@sysraccoon
Last active February 10, 2026 06:36
Show Gist options
  • Select an option

  • Save sysraccoon/da3c337b2053985551e8c3a48fc9c310 to your computer and use it in GitHub Desktop.

Select an option

Save sysraccoon/da3c337b2053985551e8c3a48fc9c310 to your computer and use it in GitHub Desktop.
Шпаргалка по установке сертификатов на Android

Шпаргалка по установке CA сертификатов на Android

Оригинальное видео

Использование пользовательского хранилища CA и патчинг приложения

  1. Для burp-suite, конвертируем сертификат в PEM:
$ openssl x509 -inform DER -in cert.der -out cert.pem
  1. Ставим PEM сертификат обычными средствами Android.
  2. Декомпилируем apk файл:
$ apktool d application.apk --out rev-application
  1. В AndroidManifest.xml добавляем в тег <application> атрибут android:networkSecurityConfig:
<application android:networkSecurityConfig="@xml/network_security_config" ...etc...>
  1. Создаём файл res/xml/network_security_config.xml и добавляем в него разрешение на использование user CA store:
<network-security-config> 
    <base-config> 
        <trust-anchors> 
            <!-- Trust system CAs --> 
            <certificates src="system" /> 
            <!-- Trust user CAs --> 
            <certificates src="user" /> 
        </trust-anchors> 
    </base-config> 
</network-security-config>
  1. Пересобираем приложение:
$ apktool b .
  1. Генерируем ключ:
$ keytool -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias android-patch
  1. Дальше действия отличаются в зависимости от инструмента для подписи:
    • Подпись V1, поддерживается Android ≤ 10

      1. Подписываем с помощью jarsigner
      $ jarsigner -keystore key.jks dist/package.apk android-patch
      1. Выравниваем с помощью zipalign (иногда выравнивание не нужно. Если приложение падает при запуске, пересоберите приложение и пропустите этот шаг)
      $ zipalign -p -f 4 dist/package.apk dist/package-align.apk
    • Подпись V2, поддерживается Android ≥ 7

      1. Выравниваем с помощью zipalign
      $ zipalign -p -f 4 dist/package.apk dist/package-align.apk
      1. Подписываем с помощью apksigner
      $ apksigner sign --ks key.jks --ks-key-alias android-patch dist/package-align.apk
  2. Удаляем старое приложение и устанавливаем новое:
$ adb install dist/package-align.apk

Добавление сертификатов в системное хранилище

Про автоматизированный вариант можно почитать тут: adb-install-cert

Для ручного способа, необходимо сначала подготовить сертификат. 0. Для burp-suite, конвертируем сертификат в PEM:

$ openssl x509 -inform DER -in cert.der -out cert.pem
  1. Высчитываем хеш:
$ openssl x509 -inform PEM -subject_hash_old -noout -in cert.pem
e210c8c4
  1. Создаём копию нашего сертификата, называя его в формате hash.0, подставляя вместо hash результат исполненной ранее команды:
$ cp cert.pem e210c8c4.0
  1. Добавляем развёрнутую информацию о сертификате (опционально, обычно работает и без этого шага):
$ openssl x509 -inform PEM -text -fingerprint -noout -in cert.pem >> e210c8c4.0
  1. Загружаем итоговый сертификат:
$ adb push e210c8c4.0 /data/local/tmp/

Android ≤ 9

Note

Эмулятор Android-а необходимо запускать с параметром -writable-system

  1. Открываем через adb shell с правами рута.
$ adb shell
adb$ su
adb#
  1. Перемонтируем /system в режим для чтения и записи.
adb# mount -o rw,remount,rw /system
  1. Перемещаем загруженный ранее сертификат в каталог /system/etc/security/cacerts/:
adb# mv /data/local/tmp/e210c8c4.0 /system/etc/security/cacerts/
  1. Меняем права доступа:
adb# chmod 644 /system/etc/security/cacerts/e210c8c4.0
  1. Перемонтируем файловую систему обратно в режим только для чтения:
adb# mount -o ro,remount,ro /system
  1. Для того чтобы изменения вступили в силу, может потребоваться перезагрузка устройства:
adb reboot

Android 10 - 13

  1. Открываем через adb шелл с правами рута:
$ adb shell
adb$ su
adb#
  1. Создаём временную директорию:
adb# mkdir -p -m 700 /data/local/tmp/cacerts
  1. Копируем в неё существующие сертификаты:
adb# cp /system/etc/security/cacerts/* /data/local/tmp/cacerts/
  1. Монтируем tmpfs поверх исходного каталога cacerts:
adb# mount -t tmpfs tmpfs /system/etc/security/cacerts/
  1. Копируем сохранённые ранее сертификаты:
adb# cp /data/local/tmp/cacerts/* /system/etc/security/cacerts/
  1. Переносим наш сертификат:
adb# mv /data/local/tmp/e210c8c4.0 /system/etc/security/cacerts/
  1. Меняем ему права доступа:
adb# chmod 644 /system/etc/security/cacerts/e210c8c4.0
  1. Исправляем метки для SELinux-а:
adb# chcon u:object_r:system_file:s0 /system/etc/security/cacerts/*

Android ≥ 14

  1. открываем через adb шелл с правами рута.
$ adb shell
adb$ su
adb#
  1. Создаём временную директорию:
adb# mkdir -p -m 700 /data/local/tmp/cacerts
  1. Копируем в неё сертификаты из apex-conscrypt:
adb# cp /apex/com.android.conscrypt/cacerts/* /data/local/tmp/cacerts/
  1. И дальше проделываем такие же действия как и для 10 андроида. Монтируем tmpfs поверх системного каталога cacerts:
adb# mount -t tmpfs tmpfs /system/etc/security/cacerts/
  1. Копируем сохранённые ранее сертификаты:
adb# cp /data/local/tmp/cacerts/* /system/etc/security/cacerts/
  1. Переносим наш сертификат:
adb# mv /data/local/tmp/e210c8c4.0 /system/etc/security/cacerts/
  1. Меняем ему права доступа:
adb# chmod 644 /system/etc/security/cacerts/e210c8c4.0
  1. Исправляем метки для SELinux-а:
adb# chcon u:object_r:system_file:s0 /system/etc/security/cacerts/*
  1. Выполняем bind mount в пространстве zygote процессов:
ZYGOTE_PID=$(pidof zygote || true)
ZYGOTE64_PID=$(pidof zygote64 || true)
for Z_PID in "$ZYGOTE_PID" "$ZYGOTE64_PID"; do
    if [ -n "$Z_PID" ]; then
        nsenter --mount=/proc/$Z_PID/ns/mnt -- \
            /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts
    fi
done
APP_PIDS=$(
    echo "$ZYGOTE_PID $ZYGOTE64_PID" | \
    xargs -n1 ps -o 'PID' -P | \
    grep -v PID
)
for PID in $APP_PIDS; do
    nsenter --mount=/proc/$PID/ns/mnt -- \
        /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts &
done
wait
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment