Как правило, клиентские SSL-сертификаты хранятся в хранилищах ключей (BKS отформатирован в случае Android), а хранилище ключей входит в качестве ресурса в ваш APK. Keystores зашифрованы и защищены паролем. Таким образом, этот сертификат клиента нельзя легко извлечь из APK, поскольку он хранится в зашифрованном виде.
Теперь ... что вы делаете с паролем? Вот суть вопроса, и у вас есть две альтернативы.
Если вы хотите, чтобы ваше приложение могло взаимодействовать с сервером (чтобы иметь возможность доступа к сертификату) без взаимодействия с пользователем, вам нужно будет встроить пароль в ваше приложение, и тогда, да, злоумышленник сможет отменить спроектируйте свой код, чтобы найти его, возьмите хранилище ключей, а затем расшифруйте его, чтобы восстановить сертификат. Вы можете применять такие методы, как запутывание своего кода, чтобы злоумышленнику было труднее это сделать, но это только замедлит кого-то, а не предотвратит его.
Ваш альтернативный вариант - запрашивать у пользователя пароль каждый раз, когда ваше приложение связывается с сервером, и использовать его для расшифровки хранилища ключей (или спрашивать, когда приложение запускается и кэшировать сертификат в течение определенного периода времени). Преимущество здесь в том, что если кто-то обратный инжиниринг вашего APK, они найдут зашифрованное хранилище ключей и без пароля, поэтому ваш сертификат в безопасности. Недостатком является предоставление пользователем пароля.
Какой подход лучше? Это полностью зависит от чувствительности данных, которые вас интересуют, и уровня риска, который вы готовы принять. Только вы можете ответить на этот вопрос.