پروفایل VPN در iOS: 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، یا پرسوجو با گروه دسترسیای که برنامه نمیتواند استفاده کند، همه آن را تولید میکنند.
کتابخانههای پوششی به این کار دعوت میکنند. کمکی که بایت برمیگرداند با کمکی که ارجاع برمیگرداند قابل تعویض نیست، پس ترمیم معمولاً پرسوجویی متفاوت است نه رمزی متفاوت.
همین ناسازگاری پروفایلی را توضیح میدهد که بیگله ذخیره میشود و بعد وصل نمیشود: آنچه ذخیره شده یک بلاب است، نه دستگیره، و دیمن چیزی برای حلکردن ندارد.
خوب ذخیره میشود، هنگام اتصال شکست میخورد
ذخیرهکردن بستر برنامه شما را به کار میگیرد. اتصال بستر دیمن را، و این دو دسترسی یکسان ندارند. پس یک پروفایل میتواند همه آزمونهای شبیهساز را بگذراند و در نخستین شروع on-demand شکست بخورد.
شکل نشانه ریاستارت هم همین است: تا وقتی برنامه باز است کار میکند و وقتی سیستم تونل را خودش شروع میکند میمیرد.
مسیر پسزمینه را پیش از انتشار آگاهانه بیازمایید. با برنامه بسته یک اتصال on-demand راه بیندازید، سپس کنسول دستگاه را بخوانید نه گزارش برنامه را، چون خرابی را همان فرایندی ثبت میکند که کوشید ارجاع را حل کند. اگر کنسول نشان میدهد که دیمن آیتم را رد میکند، ارجاع درست است و مشکل در دسترسپذیری آیتم است.
دسترسپذیری تعیین میکند که ریاستارت کار میکند یا نه
آیتم باید برای هر فرایند سیستمی که تونل را شروع میکند خواندنی باشد، و این مخاطبی گستردهتر از برنامه شما در پیشزمینه است. همین محدودیت صفت دسترسپذیری را برای شما انتخاب میکند. آیتمی که تا نخستین بازشدن محافظت میشود پس از یک بار بازشدن دستگاه برای شروع پسزمینه در دسترس است؛ آیتمی که میخواهد دستگاه همین حالا باز باشد چنین نیست.
انتخاب کلاس سختگیرانهتر وسوسهانگیز است و دقیقاً همان چیزی است که پروفایل on-demand را روی گوشی قفلشده میشکند.
پس از تغییر کلاس، آیتم را از نو بسازید نه اینکه صفتهای آیتم موجود را ویرایش کنید، سپس پروتکل را با ارجاعی تازه دوباره ذخیره کنید. تغییر صفتها روی آیتم موجود همیشه رفتاری را که مستندات القا میکند تولید نمیکند، و آیتم بازساختهشده شک را برمیدارد.
چرخش همان جایی است که پروفایلهای ذخیرهشده میپوسند
تغییر رمز در زنجیره کلید بهطور خودکار آنچه را پروفایل ذخیرهشده به آن اشاره میکند تغییر نمیدهد. حذف آیتم بدتر است: پروفایل ارجاعی به چیزی نگه میدارد که دیگر وجود ندارد، و خرابی شبیه رد شدن احراز هویت به نظر میرسد.
در یک ترتیب بچرخانید. آیتم را بهروز کنید، ارجاع پایدار تازهای بپرسید، پروتکل را دوباره ذخیره کنید، سپس با برنامه بسته وصل شوید تا ثابت کنید دیمن هنوز میتواند آن را حل کند. رمز کاربر و راز مشترک را در آیتمهای جدا نگه دارید تا هرکدام با برنامه خودش بچرخد، و هرگز دیکشنری پرسوجو یا خود ارجاع را ثبت نکنید. دستگیره راز نیست، اما نقشهای به سوی آن است.