Экспорт VPN на Android: что на самом деле переносится на новый телефон
Экспорт VPN на Android передаёт настройки и иногда ключ, но никогда — авторизацию устройства. Проверьте, что на самом деле переносится, прежде чем стирать старый телефон.
Экспорт профиля VPN из Android воспринимается как шаг резервного копирования, и меню, которое его предлагает, ничего не делает, чтобы исправить это впечатление. На руках у вас остаются входные данные для парсера, ключ, который операционная система может никогда не вернуть, и авторизация, выданная именно этому телефону. Разделите эти три вещи, и появится полезный вопрос: какой части ещё нет на новом устройстве?
Файл — это простая часть. Две другие решают, сработает ли перенос.
Что на самом деле содержит экспортированный профиль
Откройте файл в текстовом редакторе, прежде чем ему доверять. Профиль OpenVPN — это небольшой язык конфигурации: remote, proto, data-ciphers и часто встроенные блоки <ca>, <cert>, <key> или <tls-crypt>, которые клиент передаёт своему стеку TLS. Конфигурация WireGuard проще: [Interface] содержит PrivateKey и Address, затем по одному [Peer] на каждую конечную точку с PublicKey, AllowedIPs и Endpoint. IKEv2 приходит как .mobileconfig со словарями полезной нагрузки вместо блоков ключей.
Ни один из этих текстов сам по себе не является учётными данными. Учётные данные — это закрытый ключ, и каждый формат либо вставляет его внутрь, либо ссылается на псевдоним, который разрешается только внутри клиента, создавшего его.
Где ключ на самом деле живёт в Android
Android хранит данные приложений в /data/data/<package>, читать их может только UID этого приложения. Поддерживаемого способа скопировать приватный каталог другого приложения с телефона без root нет, а adb backup перестал быть общим ответом после того, как Android 12 отменил его, а клиенты начали объявлять allowBackup="false". Поэтому экспорт из клиента Android означает то, что реализует этот клиент, а не копию файловой системы.
Слой идентичности находится под приложением. Если клиент импортировал ваш ключ в Android Keystore, материал генерируется или оборачивается там, и последующие экспорты могут нести ссылку на псевдоним Keystore вместо байтов. Ключи с аппаратной защитой устроены так, что даже само приложение не может их прочитать, как описывает Keystore documentation, поэтому профиль со ссылкой на этот псевдоним чисто импортируется на том же телефоне и терпит неудачу везде остальном.
Это не сломанный экспорт. Это свойство, которое попросили обеспечить у платформы.
Что профиль не может перенести
Сопоставьте объекты с тем, что примет принимающая сторона:
| Объект | Переносится? | Почему |
|---|---|---|
| Протокол и конечная точка | Да, если клиент назначения это поддерживает | Открытый текст в профиле |
| Сертификат CA и проверка имени хоста | Обычно | Публичный материал, но имя хоста всё равно должно совпадать с сертификатом |
| Клиентский сертификат | Да, если он не привязан к устройству | Сертификаты переносимы; издатель решает, сколько устройств может использовать один |
| Закрытый ключ | Только если он создан вне Keystore | Ключи с аппаратной защитой нельзя экспортировать, только заменить |
| Учётная запись, MFA, сеанс SSO | Нет | Токены истекают и остаются привязанными к устройству, которое их получило |
| Маршруты, DNS и охват приложений | Только как текст конфигурации | Android применяет их при подключении через VpnService.Builder |
| Список приложений раздельного туннеля | Редко | Имена пакетов различаются между устройствами, а список — это состояние клиента |
Две строки вызывают большую часть путаницы. Ключ, созданный на устройстве и помеченный как неэкспортируемый, действительно исчезает вместе с данными приложения, поэтому замена — это новый ключ плюс выданный для него сертификат. Токен сеанса, скопированный на новый телефон, обычно умирает при первом обновлении, что выглядит как неудачный импорт.
Импорт — это разбор, а затем запрос согласия
На принимающей стороне импорт — это разбор, за которым следует запись. Клиент читает конфигурацию, проверяет, что каждый указанный блок существует, а затем записывает определение туннеля в свою песочницу, поэтому файл, выбранный из Загрузок, не является тем, что подключается потом.
Затем наступает шаг авторизации, который не может пропустить ни один файл. Android требует, чтобы приложение вызвало VpnService.prepare() и получило ваше согласие, прежде чем установить туннель, поэтому только что импортированный профиль всё равно один раз покажет системный диалог. Затем туннель строится явно через addAddress, addRoute, addDnsServer и addAllowedApplication или addDisallowedApplication для маршрутизации по приложениям. Ничего из этого не следует из конечной точки, поэтому один и тот же профиль может дать разный набор действующих маршрутов в двух клиентах.
Конфигурации на основе сертификатов добавляют ещё одну развилку. Когда сервер выдаёт сертификат конкретному устройству, как это делают MDM и регистрация SCEP, его повторное использование на втором телефоне либо работает, пока сервер не потребует один сеанс на идентичность, либо терпит неудачу на рукопожатии TLS. Проверьте политику издателя, прежде чем планировать повторное использование.
Проверьте новое устройство, прежде чем списывать старое
Держите старый телефон подключённым, пока новый не пройдёт что-то лучшее, чем зелёный значок. Подтвердите адрес выхода с нового устройства и DNS-резолвер, который оно действительно использовало. Если split tunneling важно, запустите приложение, которое должно обходить туннель, и то, которое не должно, и посмотрите, какое доходит до вашего провайдера.
Одна проверка решает вопрос адреса выхода. Откройте https://ifconfig.me в браузере телефона, затем выполните curl -s https://ifconfig.me с ноутбука в той же сети Wi-Fi и сравните оба ответа с адресом, который назначил ваш провайдер.
Только после этого списывайте старую идентичность, и делайте это через издателя: отзовите сертификат или удалите устройство из учётной записи. Удаление файла из Загрузок ничего не завершает, потому что два устройства с одним сертификатом выглядят в журнале сервера одинаково.
Если экспорт окажется непереносимым, решение — новая регистрация, а не публичный пакет конфигурации. Запросите профиль для второго устройства или создайте пару ключей на новом телефоне и отправьте CSR; медленнее, и это путь, который поддерживает издатель.
Пройдите контрольный список, прежде чем что-либо удалять: новое устройство подключается, адрес выхода и DNS совпадают, охват по приложениям такой, как вы задумали, старая идентичность отозвана, а любой сохранённый файл конфигурации лежит в зашифрованном хранилище.