Закрепление TLS и доступ через VPN отвечают на разные вопросы
Закрепление ограничивает, какому серверу доверяет приложение; политика VPN решает, кто попадает в сеть. Ни то, ни другое не покрывает авторизацию или потерянное устройство.
Поставьте частное мобильное приложение за VPN, и разумный человек спросит, нужно ли ему ещё закрепление сертификата. Вопрос звучит как выбор между двумя равноценными средствами контроля, а на самом деле это вопрос о двух разных воротах. VPN решает, может ли это устройство вообще пользоваться путём; приложение решает, тот ли сервер оно достигло, который ожидало. Ответьте на оба вопроса отдельно, и проект станет проще.
Двое ворот, два вопроса
Доступ в сеть касается клиента: зарегистрировано ли это устройство, действительны ли его учётные данные и разрешает ли политика этот путь? Доверие приложения касается сервера: дошло ли соединение до службы с идентичностью, которую приложение принимает? Эти ответы приходят из разных систем, терпят неудачу по разным причинам и исправляются разными командами. Рукопожатие VPN может пройти, пока приложение говорит с просроченным сертификатом за партнёром. Идеально закреплённое приложение всё равно может остаться недоступным ни для кого, потому что устройство так и не попало в сеть.
Оба складываются. Убрать одно значит убрать средство контроля; добавить другое не заменяет его.
Что на самом деле ограничивает закрепление
Закрепление сужает набор идентичностей сервера, которые приложение примет, обычно называя открытый ключ или хеш сертификата вместо доверия каждой цепочке, за которую поручилось бы какое-либо хранилище. Это ограничение, наложенное поверх обычной проверки, а не её замена. Обычная проверка отвечает, надёжна ли цепочка вообще; закрепление отвечает, та ли это цепочка, которую ждёт приложение. Реализация, пропускающая первый шаг, приобретает не безопасность, а только новизну.
Закрепляемый объект различается между платформами, поэтому одно слово говорит очень мало. Скопировать хеш из хранилища доверия одного продукта и считать его тем же самым в мобильном приложении — распространённая и тихая ошибка.
Закрепление на платформе — это конфигурация, а не политика
Android предоставляет закрепление через конфигурацию сетевой безопасности, где набор закреплений хранит дайджесты открытого ключа, и цепочка должна содержать хотя бы один из них. Этот файл задаётся для каждого приложения и требует осознанного изменения сборки. В iOS нет эквивалентного механизма манифеста, поэтому закрепление там живёт в собственном коде оценки доверия приложения.
Поскольку механизм различается, требование нужно писать для каждой платформы. Политика, которая говорит закрепите сертификат, не называя платформу, невыполнима.
Ротация решает, выживет ли закрепление
Трудная часть — не первый выпуск, а обновление сертификата после него. Строгая политика доверия отвергает законный новый ключ так же твёрдо, как и ключ злоумышленника.
Два механизма делают ротацию переносимой: резервное закрепление, которому доверяют ещё до того, как оно понадобится, и дата истечения на наборе закреплений, чтобы принудительное применение заканчивалось, а не блокировало приложение. Оба — политические решения, и именно истечение является сознательным снижением безопасности, а не безобидным таймером. Назовите, кто управляет сборкой приложения, конечной точкой TLS и обновлением сертификата, и сведите их в один процесс изменений. Если это три разные команды, закрепление в конце концов вызовет сбой, которого никто не планировал.
Потерянное устройство — третья проблема
Отзыв учётных данных VPN не обязательно завершает сеанс приложения, а закрепление сервера вообще ничего не делает с телефоном в чужой руке. Блокировка устройства, хранение учётных данных, срок жизни сеанса и удалённый отзыв — отдельные решения с отдельными владельцами. Если свернуть их в обсуждение закрепления, ни одно из них не будет спроектировано.
Проверьте четыре отношения вместо одного видимого: предполагаемый сервер и операцию, учётную запись, которую следует отклонить, идентичность сервера, которую следует отвергнуть, и запланированную ротацию. Работающий VPN упражняет только первое. Запишите, что доказал каждый тест, потому что следующий человек будет считать, что зелёный туннель означает, что все четыре прошли.