iOS VPN профил: passwordReference, а не лозинка
Референца на привезак кључева је ручка, а не тајна. Пренос бајтова објашњава грешку -50, неуспех при рестарту и замку ротације у сачуваним VPN профилима.
Инсталирате профил, тунел се подиже и све изгледа завршено. Затим се телефон рестартује, on-demand буди везу без апликације у првом плану, и тунел одбија да се покрене. Профил је још ту и лозинка је још тачна, зато овај квар шаље људе да траже на погрешном месту. Network Extension не може да прочита вашу тајну из профила: потребна му је референца на привезак кључева коју може сам да разреши.
Приказ испод прати један покушај повезивања кроз то предавање, од упита који гради референцу до рестарта који је проверава.
Профил чува ручку, не тајну
NEVPNProtocol излаже passwordReference и sharedSecretReference с разлогом. Када демон покрене тунел, можда не ради унутар вашег процеса, па не може да позове ваш код и затражи лозинку. Чита трајну референцу на привезак кључева, разрешава је у свом контексту и сам добавља ставку.
Ту референцу градите тако што је затражите од привеска кључева, а то је другачији захтев од захтева за подацима:
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrService as String: "vpn-credentials",
kSecAttrAccount as String: "user",
kSecReturnPersistentRef as String: true,
kSecMatchLimit as String: kSecMatchLimitOne
]Предајте враћени објекат протоколу, не податке ставке. У пракси профил бележи где тајна живи, зато ни резервна копија конфигурације не дуплира лозинку тихо у plist.
Зашто API одговара са -50
errSecParam значи да су захтев или вредност били неисправни за ту операцију, и то је грешка која се најчешће види када се захтеви за референцом и подацима помешају. Тражење података док код који прима очекује референцу, додељивање сирових бајтова пољу passwordReference или упит са групом за приступ коју апликација не може да користи, све то је производи.
Библиотеке-омотачи на то позивају. Помоћник који враћа бајтове није заменљив са оним који враћа референцу, па је поправка обично други упит, а не друга лозинка.
Иста неусклађеност објашњава профил који се чува без жалбе и затим не може да се повеже: сачувано је blob, а не ручка, и демон нема шта да разреши.
Чува се добро, пада при повезивању
Чување вежба контекст ваше апликације. Повезивање вежба демонов, и њих двоје немају исти приступ. Профил зато може да прође сваки тест у симулатору и падне на првом on-demand покретању.
То је и облик симптома при рестарту: ради док је апликација отворена и умире када систем сам покрене тунел.
Тестирајте позадинску путању намерно пре испоруке. Изазовите on-demand везу са затвореном апликацијом, па читајте конзолу уређаја, а не дневник апликације, јер квар бележи процес који је покушао да разреши референцу. Ако конзола показује да демон одбија ставку, референца је у реду и проблем је у доступности ставке.
Доступност одлучује да ли рестарт ради
Ставка мора бити читљива за који год системски процес да покрене тунел, а то је шира публика од ваше апликације у првом плану. То ограничење само бира атрибут доступности. Ставка заштићена до првог откључавања доступна је за позадинско покретање након што је уређај једном откључан; ставка која захтева да уређај буде откључан управо сада није.
Избор строже класе је примамљив и управо он квари on-demand профил на закључаном телефону.
Након промене класе поново створите ставку уместо да мењате атрибуте на постојећој, па поново сачувајте протокол са свежом референцом. Промене атрибута на постојећој ставци не дају увек понашање које документација имплицира, а обновљена ставка уклања сумњу.
Ротација је место где сачувани профили труну
Промена лозинке у привеску кључева не мења аутоматски оно на шта сачувани профил показује. Брисање ставке је горе: профил држи референцу на нешто што више не постоји, а квар изгледа као одбијена аутентификација.
Ротирајте у једном редоследу. Ажурирајте ставку, затражите нову трајну референцу, поново сачувајте протокол, па се повежите са затвореном апликацијом да докажете да демон још може да је разреши. Држите корисничку лозинку и заједничку тајну у одвојеним ставкама да би се свака ротирала по свом распореду, и никада не логујте речник упита ни саму референцу. Ручка није тајна, али јесте мапа до ње.