הפרופיל עדיין ברשימה, התעודה עדיין מוצגת כמותקנת, וכפתור ההתחברות נכשל בהודעה שאומרת רק «שגיאת Keystore» ולא דבר אחר. לפני שמוחקים את אחסון האפליקציה או מוסרים את הטלפון, קבעו איזו פעולת מפתח נכשלה. שלוש תוצאות מייצרות את אותה תיבת דו-שיח, והן מגיבות לשלוש פעולות שונות — רק אחת מהן הרסנית. ההשוואה שווה עשר דקות, כי הענף הלא נכון עולה לכם בזהות שניסיתם לשמור.

שלושה כשלים מאחורי תיבת דו-שיח אחת

הראשון הוא אימות. המפתח קיים ותקף, אך השימוש בו דורש שהמשתמש יוכיח נוכחות — שחרור נעילה של המכשיר, ביומטריה או אתגר מפרופיל העבודה. אם זמן הנעילה, הביומטריה הרשומה או מצב הפרופיל השתנו לאחרונה, השימוש במפתח עלול להיכשל בעוד המפתח עצמו תקין לחלוטין.

השני הוא פסילה קבועה. חומר מפתח מסוים נפסל על ידי מדיניות הפלטפורמה כאשר שיטת הנעילה מתאפסת או הרישום הביומטרי משתנה, משום שהכריכה שהגנה עליו אינה תקפה עוד. לא ניתן לתקן את המפתח וניסיון חוזר אינו תוכנית התאוששות; יש להחליף את הזהות באמצעות תהליך הרישום שהנפיק אותה.

השלישי הוא כשל של הספק: שירות ה-keystore לא הצליח להשלים את הפעולה כעת. זו הקטגוריה שלעיתים שווה לנסות שוב, והיחידה.

FailureWhat it meansWhat recovers itWhat does not
User not authenticatedKey needs a presence checkSupported unlock or authorization flowA VPN account password reset
Key permanently invalidatedBinding is gone; key unusableReplacement enrollment for that identityRetrying, rebooting, reinstalling the client
Transient provider errorService could not complete nowThe provider's documented retry pathClearing app data

שימו לב ששתיים מהשלוש אינן הרסניות ולאחת אין כל פתרון ברמת המכשיר. אף אחת מהן אינה נפתרת במחיקת הטלפון, שהוא הצעד שאנשים עושים ראשון מפני שתיבת הדו-שיח אינה נותנת להם דבר אחר לפעול לפיו.

רישום מחדש לעומת מחיקת נתונים

שתי אלה נראות דומות מבחוץ ואינן כאלה. רישום מחדש מבקש ממערכת ההנפקה זהות חדשה — תעודה או מפתח חדשים הכרוכים במכשיר הזה — ומוציא לגמלאות את הישנה. מחיקת נתונים מוחקת את המצב השמור של האפליקציה, מה שעלול להסיר את ההפניה למפתח בלי להסיר את המפתח, או להסיר את המפתח ולהשאיר אתכם בלי סמכות ליצור אותו מחדש.

ההבחנה חשובה משום שמפתחות שאינם ניתנים לייצוא אינם ניידים מעצם התכנון. הם חיים ב-keystore של המכשיר, בגיבוי החומרה או הספק הזמינים, והם אינם משהו שגיבוי לוכד ושחזור מחזיר. אם הזהות של הפריסה היא מפתח שאינו ניתן לייצוא, תכננו רישום מחדש בתור ההתאוששות, ואשרו מראש שיש לכם מסלול מאושר להשגת אותו רישום — ארגונים מסוימים דורשים לשם כך גישה לרשת פרטית, וזה בדיוק מה שה-VPN השבור סיפק.

אז הסדר הוא: נסו את מסלול האימות הנתמך, אחר כך קבעו אם המפתח פסול לצמיתות, והחליפו את הזהות רק אם כן. מחיקת האחסון באה אחרונה, לאחר שיודעים מה ייווצר מחדש, ולא ראשונה מפני שהיא קלה.

נסו שוב רק את מה שאפשר לנסות שוב

גרסאות פלטפורמה ישנות יותר איחדו שגיאות keystore לחריגה אחת, וזו הסיבה שלקוחות כה רבים מנסים הכול שוב. מ-API 33 סוג החריגה נושא מבנה: שגיאה מספרית, דגל כשל חולף ומדיניות ניסיון חוזר. למפתח לקוח, מדיניות הניסיון החוזר משמעותית רק כאשר דגל החולפות אמיתי; לפסילה קבועה אין לוח זמנים לניסיון חוזר, והכאה עליה בלולאה רק מרוקנת את הסוללה וממלאת את היומן.

אם אתם מאבחנים ולא כותבים את הלקוח, ההשלכה המעשית זהה. כשלים זהים בכל ניסיון שוללים תקלה חד-פעמית, אך הם אינם מפרידים בין מפתח שנפסל לצמיתות לבין ספק שאינו זמין כבר זמן מה — הפסקה של הספק נראית בדיוק אותו דבר בניסיון העשירי כמו בראשון. בלי השדות המובנים של API 33, התייחסו לחזרה כסיבה לחפש אות שני — קוד השגיאה אם הבנייה שלכם חושפת אותו, מצב המפעיל, או מפתח אחר באותו מכשיר שמצליח — ולא כהוכחה שהמפתח מת.

קראו את שרשרת הסיבה, לא את התווית

אפליקציות עוטפות את החריגה המקורית, והמחרוזת הידידותית בממשק לעיתים קרובות מסתירה את השדה היחיד שמכריע את הענף. שמרו את שרשרת הסיבה ואת חתימת הזמן של הניסיון: החריגה החיצונית בדרך כלל נוקבת בשם הפעולה, והסיבה נוקבת במצב המפתח.

התנגדו להסקה ששתי אפליקציות כושלות מוכיחות מכשיר פגום. מפתחות שונים יכולים להיתמך על ידי ספקים ורמות אבטחה שונים, ואפליקציה שעדיין עובדת אולי כלל אינה מבצעת את אותה פעולה — חתימה, פענוח ואישור מפתח הם בקשות שונות לאותו שירות. הפניית KeyStoreException מתארת את השדות המובנים ברמות API חדשות יותר והיא המקום לבדוק מה הבנייה שלכם באמת יכולה לדווח.

מה שיתמוך במסקנה חומרתית צר יותר ממה שרוב האנשים מניחים: אותה פעולה, אצל אותו ספק, נכשלת במפתחות בלתי תלויים בשגיאה ברמת הספק ולא ברמת המפתח. זו שאלה לאבחון של הפלטפורמה, לא לשרשור בפורום תמיכה על מכשירים מקבוצה אחת.

מה לתעד בזמן שאתם מחליטים

תעדו את הבנייה של Android, את גרסת הלקוח, את הפרופיל שנבחר, את הפעולה שנכשלה, והאם משהו השתנה לאחרונה — עדכון מערכת הפעלה, שינוי במסך הנעילה, טביעת אצבע חדשה, רישום מחדש. תעדו את הרצף כהקשר ולא כהוכחת סיבה; שינוי נעילה לפני כשל מפתח הוא מתאם סביר, לא הוכחה.

אחר כך פעלו לפי הענף שקבעתם. חולף: שמרו על הזהות, השתמשו במסלול הניסיון החוזר הנתמך. נדרש אימות: השלימו את זרימת שחרור הנעילה הנתמכת ושמרו על מדיניות הנעילה שהפריסה דורשת במקום להשבית אותה כדי לעבור תיבת דו-שיח. פסול לצמיתות: החליפו והוציאו לגמלאות את הזהות באמצעות רישום רגיל.

סיימו בהוכחת התוצאה על חיבור מורשה חדש, למשאב אמיתי, עם אימות שרת עדיין פעיל. כל דבר שעובד רק עם בדיקות תעודה מרופפות לא תיקן את בעיית המפתח — הוא העביר אותה לשכבת הרשת, שם היא תעלה מאוחר יותר עם תסמינים גרועים יותר.

  • שלושה ענפים: נדרש אימות, פסול לצמיתות, חולף אצל הספק.
  • רק השלישי מרוויח מניסיון חוזר, ורק לפי מדיניות הניסיון החוזר שלו.
  • רישום מחליף מחזיר גישה; מחיקת נתונים מסירה את האפשרות.
  • אמתו בחיבור חדש ובבדיקות זהות שרת רגילות.

מאמרים קשורים