Ошибка доверия Android IKEv2: отправьте промежуточный CA, а не корневой
Телефон отклоняет шлюз, потому что полученная цепочка обрывается слишком рано. Решите: отправить промежуточный, исправить идентичность или сменить тип ключа.
Телефон отказывается подключаться и выводит No trusted RSA public key found for vpn.example.net, хотя тот же сертификат шлюза работает с ноутбука в той же сети. Заманчивый шаг — перевыпустить сертификат. Прежде чем это делать, определите, какая из трёх неисправностей у вас, потому что только одна из них касается содержимого сертификата. Сообщение охватывает неполную цепочку, несовпадение идентичности и неподдерживаемый ключ или подпись, и у каждой своё исправление.
Три неисправности за одним сообщением
Android строит цепочку от сертификата шлюза до CA, выбранного в профиле VPN, затем сравнивает имя сервера с профилем. Уведомление сообщает результат, а не этап. Неисправность доверия означает, что цепочку не удалось завершить из сертификатов, переданных в обмене; неисправность идентичности означает, что цепочка проверена, но имя не совпало; неисправность алгоритма означает, что устройство или профиль не принимает тип ключа или подпись.
| What you see | What it points to | First move |
|---|---|---|
| Chain stops after the leaf in the daemon log | intermediate not loaded or not sent | load the intermediate as CA material |
| Chain validates, name differs from the profile | identity mismatch | fix the profile name or the certificate SAN |
| Chain validates, handshake still fails | key or signature not accepted | compare key type against the device |
Решайте по доказательствам, а не перебирая исправления по порядку. Одна попытка на уровне журнала 2 против демона скажет, в какой вы строке, и обойдётся дешевле перевыпуска сертификата, который никогда не был неправильным.
Сначала решите: пришла ли вся цепочка?
strongSwan отправляет сертификат, настроенный для этого соединения, а промежуточные сертификаты — отдельные учётные данные. Их нужно загрузить как сертификаты CA, прежде чем демон сможет поместить их в полезную нагрузку, поэтому схема, где сертификат сервера подписан промежуточным, корневой является якорем доверия, а промежуточный лежит только в каталоге сборки CA, даёт именно эту неисправность: на проводе только лист, цепочка рано заканчивается на телефоне.
Проверьте, что хранит демон, с помощью swanctl --list-certs в развёртывании swanctl или ipsec listcerts со старым starter. Промежуточный должен отображаться как сертификат CA с корневым над ним. Если его нет, никакая настройка клиента не поможет; если он есть, переходите к следующему вопросу.
Затем проверьте, будет ли он отправлен. Справочник swanctl.conf описывает send_cert, чьё значение по умолчанию ifasked отправляет сертификаты только когда партнёр запросил; always отправляет всегда. Устаревший эквивалент — leftsendcert=always в ipsec.conf. Эта настройка управляет отправкой, а не доступностью, поэтому не может компенсировать промежуточный, который демон так и не загрузил.
Если цепочка коротка, загрузите промежуточный туда, где ищет демон
Поместите промежуточный в каталог CA, а не рядом с листом: /etc/ipsec.d/cacerts для конфигурации ipsec.conf, /etc/swanctl/x509ca для swanctl или путь, который подставляет ваш пакет. Перезагрузите конфигурацию и снова перечислите сертификаты. Некоторые версии также отправляют пакет, содержащий цепочку в файле листа, но каталог CA — переносимое решение для разных версий и пакетов.
Проверьте и со стороны клиента. Телефон видит только то, что перенёс обмен, поэтому журнал демона на уровне 2 должен показывать промежуточный среди переданных сертификатов. Если журнал его показывает, а телефон всё равно не подключается, вы в другой строке таблицы, и дальнейшая правка файлов CA не изменит результат.
Если цепочка полная, прекратите редактировать сертификаты
Неисправность идентичности — это несовпадение имени в профиле VPN и имени в сертификате. Android сравнивает настроенную вами идентичность сервера с сертификатом, который проверил, поэтому профиль, указывающий на адрес, тогда как сертификат называет имя хоста, или профиль с именем хоста, которое сертификат не покрывает, терпит неудачу после успешной проверки цепочки. Исправьте неверную сторону и поддерживайте согласованность профиля и сертификата при изменении любого из них.
Неисправность алгоритма проявляется при действительной цепочке и совпадающем имени. Версии Android различаются тем, какие типы ключей и схемы подписи они принимают, и сам тип профиля ограничивает варианты. Если шлюз использует старую или необычную комбинацию, сравните её с тем, что поддерживает устройство, прежде чем считать сертификат повреждённым. Журнал демона покажет, что рукопожатие продвигается дальше, чем в случае доверия, и это сигнал, что цепочка больше не проблема.
Не устанавливайте промежуточный как пользовательский корневой на телефоне
Установка недостающего промежуточного как пользовательского сертификата на телефоне убирает предупреждение и меняет модель доверия телефона для каждого приложения, принимающего установленные пользователем корневые сертификаты. Это также скрывает ошибку доставки, которая ударит по следующему клиенту, и оставляет шлюз отправляющим неполную цепочку каждому будущему устройству. Надёжное исправление — на сервере, один раз, для всех клиентов.
Держите три решения отдельно в записи об изменениях: какие сертификаты были переданы, какая идентичность сравнивалась и какой алгоритм согласован. Шлюз, всегда отправляющий полную цепочку, профиль, правильно называющий сертификат, и тип ключа, поддерживаемый парком, — это три маленьких факта, и они составляют всю эту неисправность.