הגדרת רשתות

אפשר להשתמש במדיניות כדי להגדיר רשתות 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 אם האפשרות הזו מופעלת, הרשת הזו תיחשב כמועמדת פוטנציאלית להתחברות במהלך בחירת הרשת.
    • המאפיין 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 מאפשרת ל-Framework של 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"
      }
   ]
}