הגדרת רשתות

אפשר להשתמש במדיניות כדי להגדיר רשתות Wi-Fi במכשיר. ‫Android Management API משתמש ב-Open Network Configuration, פורמט סטנדרטי מבוסס JSON שפותח במקור כחלק מפרויקט Chromium.

כדי לכלול הגדרת רשת פתוחה במדיניות, מגדירים את השדה openNetworkConfiguration במשאב Policy.

במכשירים בניהול מלא, אפשר למנוע ממשתמש להגדיר ידנית את הגדרות ה-Wi-Fi במכשיר שלו. לשם כך, צריך להגדיר את wifiConfigDisabled לערך true במשאב Policy.

תכונות נתמכות

‫Android Management API תומך רק בקבוצת משנה של מפרט Open Network Configuration.

  • אובייקט ברמה העליונה:
    • צריך להשמיט את הערך של Type או להגדיר אותו בתור UnencryptedConfiguration. אין צורך להצפין את הגדרות הרשת במדיניות, כי המדיניות כולה מוצפנת בשירות Android Management API. בנוסף, יש שכבת הצפנה שנייה למידע רגיש כמו ביטויי גישה ומפתחות פרטיים.
  • NetworkConfiguration objects:
    • GUID, Name, Type וגם WiFi הם שדות נתמכים, וכולם נדרשים.
    • השדה ProxySettings הוא אופציונלי. אם משתמשים בשיטה הזו, רק Manual ו-PAC (Proxy Auto-Configuration) נתמכים.
    • הערך של Type חייב להיות WiFi. אין תמיכה בסוגים אחרים של רשתות.
  • WiFi objects:
    • המאפיינים SSID ו-HexSSID נתמכים, וצריך לציין לפחות אחד מהם.
      • אם הגדרתם את שני המאפיינים HexSSID ו-SSID, הערכים שלהם צריכים להיות עקביים.
    • יש תמיכה ב-HiddenSSID.
    • אין תמיכה ב-AllowGatewayARPPolling.
    • אין תמיכה ב-SignalStrength.
    • AutoConnect: השדה הזה קובע אם הרשת מופעלת באופן אוטומטי. ההגדרה הזו לא תלויה באפשרות החיבור האוטומטי לכל רשת שזמינה למשתמשים בהגדרות ה-Wi-Fi של המכשיר.
      • אם ההגדרה היא true, הרשת מופעלת, כלומר המכשיר יכול להתחבר אליה באופן אוטומטי בלי שהמשתמש יבחר אותה באופן מפורש בהגדרות ה-Wi-Fi, אלא אם המשתמש משבית את החיבור האוטומטי לרשת הזו.
      • אם הערך הוא false, הרשת נוספת לרשימת הרשתות השמורות אבל לא מופעלת. המכשיר לא מתחבר אליה באופן אוטומטי. כדי שהמכשיר יתחבר לרשת, המשתמש צריך לבחור את הרשת באופן ידני פעם אחת בהגדרות ה-Wi-Fi. אחרי החיבור הידני הראשון, הרשת נחשבת כמופעלת והמכשיר יכול להתחבר אליה באופן אוטומטי, אלא אם המשתמש משבית את החיבור האוטומטי לרשת הזו.
    • המאפיין Security הוא חובה, ואפשר להשתמש בערכים הבאים: – None – WEP-PSK – WPA-PSK – WPA-EAP – WEP-8021X – WPA3-Enterprise_192
  • לסיסמאות של WEP-PSK, יש תמיכה רק בסיסמאות של 40 ביט (10 ספרות) או 104 ביט (26 ספרות).
  • במפרט מצוין שביטויי הגישה WEP-PSK חייבים להתחיל בקידומת 0x. עם זאת, כדי לשמור על עקביות עם Android Framework, הקידומת הזו לא נדרשת.
  • כדי להגדיר את מצב ההקצאה האקראית של כתובות MAC, משתמשים במאפיין MACAddressRandomizationMode עם הערכים Hardware או Automatic. המאפיין הזה לא זמין במפרט Open Network Configuration (ONC), אבל הוא זמין ב-AMAPI ואפשר לציין אותו כשמגדירים רשתות Wi-Fi. ההגדרה הזו רלוונטית רק ל-Android מגרסה 13 ואילך בכל מצבי הניהול.
    • Hardware משתמש בכתובת ה-MAC של היצרן כשהוא מתחבר לרשת.
    • Automatic מאפשר למסגרת ה-Wi-Fi להחליט באופן אוטומטי על אסטרטגיית ההקצאה האקראית של כתובות MAC. אלה יכולות להיות כתובות MAC שנוצרות באופן אקראי וקבועות או לא קבועות, שמשמשות להתחברות לרשת.
  • EAP אובייקטים:
  • אין תמיכה ב-ClientCertPattern.
  • אין תמיכה ב-SaveCredentials כי פרטי הכניסה תמיד נשמרים.
  • אין תמיכה ב-UseSystemCAs.
  • יש תמיכה ב-ServerCARef.
  • יש תמיכה ב-ServerCARefs.
  • יש תמיכה ב-DomainSuffixMatch. הגדרות אלחוטיות של Enterprise ללא השדה הזה (או עם רשימה ריקה כערך) נחשבות לא מאובטחות והפלטפורמה דוחה אותן. הערכים צריכים להיות שמות דומיין תקינים (למשל example.com או subdomain.example.com).
  • הערכים הנתמכים של ClientCertType הם: Ref,‏ KeyPairAlias
  • הערכים הנתמכים של Inner הם: MSCHAPv2, ‏ PAP
  • הערכים הנתמכים של Outer הם: EAP-AKA, ‏ EAP-TLS,‏ EAP-TTLS, ‏ EAP-SIM, ‏ PEAP
  • Certificate objects:
    • אין תמיכה ב-Remove. במקום זאת, אפשר להשמיט את האישור בהגדרה.
    • אין תמיכה ב-TrustBits.

דוגמאות

כמה רשתות Wi-Fi

בדוגמה הזו של קטע מדיניות מוצגות שלוש רשתות Wi-Fi שהוגדרו עם תוכניות אבטחה שונות. קובץ ה-JSON של Open Network Configuration מוטמע בשדה openNetworkConfiguration של קובץ ה-JSON Policy.

"openNetworkConfiguration": {
  "NetworkConfigurations": [
    {
      "GUID": "a",
      "Name": "Example A",
      "Type": "WiFi",
      "WiFi": {
        "SSID": "Example A",
        "Security": "None",
        "AutoConnect": true
      }
    },
    {
      "GUID": "b",
      "Name": "Example B",
      "Type": "WiFi",
      "WiFi": {
        "SSID": "Example B",
        "Security": "WEP-PSK",
        "Passphrase": "1234567890"
      }
    },
    {
      "GUID": "c",
      "Name": "Example C",
      "Type": "WiFi",
      "WiFi": {
        "SSID": "Example C",
        "Security": "WPA-PSK",
        "Passphrase": "baseball"
      }
    },
    {
      "GUID": "networkA",
      "Name": "networkA",
      "Type": "WiFi",
      "WiFi": {
        "SSID": "networkA",
        "Security": "WPA-PSK",
        "Passphrase": "pwd1234567",
        "MACAddressRandomizationMode": "Hardware"
      }
    }
  ]
}

אימות EAP

בקטע המדיניות לדוגמה הזה מוצגת רשת אלחוטית שהוגדרה עם אימות EAP-TLS. בנוסף לאובייקט NetworkConfigurations, הדוגמה כוללת שני אובייקטים מסוג Certificates לאישורי הלקוח והשרת.

"openNetworkConfiguration": {
   "Type": "UnencryptedConfiguration",
   "NetworkConfigurations": [
      {
         "GUID": "a",
         "Name": "Example A",
         "Type": "WiFi",
         "WiFi": {
            "SSID": "Example A",
            "EAP": {
               "Outer": "EAP-TLS",
               "Identity": "example",
               "DomainSuffixMatch": [
                  "example.com",
                  "example.org"
               ],
               "ServerCARefs": ["abc123"],
               "ClientCertType": "Ref",
               "ClientCertRef": "xyz456"
            },
            "Security": "WPA-EAP"
         }
      }
   ],
   "Certificates": [
      {
         "GUID": "abc123",
         "Type": "Server",
         "X509": "TWFuIGlzIGRpc3Rpbmd1a"
      },
      {
         "GUID": "xyz456",
         "Type": "Client",
         "PKCS12": "6PQIEQYJKoZbdDu8gwggRlqCCAPEbAAcGClgvcNAQc"
      }
   ]
}

אפשר גם להגדיר את השדה ClientCertType לערך KeyPairAlias, ולהשתמש בשדה ClientCertKeyPairAlias כדי לציין את הכינוי של זוג מפתחות ב-KeyChain שהותקן (ראו DevicePolicyManager.installKeyPair) או נוצר (ראו DevicePolicyManager.generateKeyPair) ומשמש לאימות Wi-Fi. ב-Android 12 ובגרסאות חדשות יותר, זוג המפתחות של KeyChain עם הכינוי שצוין באמצעות ClientCertKeyPairAlias מקבל הרשאה לאימות ברשתות Wi-Fi ומשמש לאימות ברשת ה-Wi-Fi המתאימה. לפני Android 12, מדווחת nonComplianceDetail עם API_LEVEL סיבה. ‫A nonComplianceDetail with INVALID_VALUE reason and ONC_WIFI_KEY_PAIR_ALIAS_NOT_CORRESPONDING_TO_EXISTING_KEY specific reason is reported if specified key pair alias does not correspond to an existing key. דוגמה למדיניות:

"openNetworkConfiguration": {
   "Type": "UnencryptedConfiguration",
   "NetworkConfigurations": [
      {
         "GUID": "a",
         "Name": "Example A",
         "Type": "WiFi",
         "WiFi": {
            "SSID": "Example A",
            "EAP": {
               "Outer": "EAP-TLS",
               "Identity": "example",
               "DomainSuffixMatch": [
                  "example.com",
                  "example.org"
               ],
               "ServerCARefs": ["abc123"],
               "ClientCertType": "KeyPairAlias",
               "ClientCertKeyPairAlias": "key-alias"
            },
            "Security": "WPA-EAP"
         }
      }
   ],
   "Certificates": [
      {
         "GUID": "abc123",
         "Type": "Server",
         "X509": "TWFuIGlzIGRpc3Rpbmd1a"
      }
   ]
}

השדה Security יכול להיות גם WPA3-Enterprise_192, שזה רשת WPA-EAP שהוגדרה עם מצב WPA3 192-bit.

"openNetworkConfiguration": {
   "Type": "UnencryptedConfiguration",
   "NetworkConfigurations": [
      {
         "Type": "WiFi",
         "Name": "Example A",
         "GUID": "A",
         "WiFi": {
            "SSID": "Example A",
            "EAP": {
               "Outer": "EAP-TLS",
               "Identity": "example",
               "ServerCARefs": ["abc123"],
               "ClientCertType": "Ref",
               "ClientCertRef": "xyz456",
               "DomainSuffixMatch": ["example.com"]
            },
            "Security": "WPA3-Enterprise_192",
            "AutoConnect": true
         }
      }
   ],
   "Certificates": [
      {
         "GUID": "abc123",
         "Type": "Server",
         "X509": "TWFuIGlzIGRpc3Rpbmd1a"
      },
      {
         "GUID": "xyz456",
         "Type": "Client",
         "PKCS12": "6PQIEQYJKoZbdDu8gwggRlqCCAPEbAAcGClgvcNAQc"
      }
   ]
}