您可以使用政策在设备上配置 Wi-Fi 网络。Android Management API 使用开放网络配置,这是一种基于 JSON 的标准格式,最初是作为 Chromium 项目的一部分开发的。
如需在政策中添加开放网络配置,请在 Policy 资源上设置 openNetworkConfiguration 字段。
对于完全受管理的设备,您可以选择通过在 Policy 资源中将 wifiConfigDisabled 设置为 true,来禁止用户在其设备上手动配置 Wi-Fi 设置。
支持的功能
Android Management API 仅支持 Open Network Configuration 规范的一部分。
- 顶级对象:
- 必须省略 Type或将其设置为UnencryptedConfiguration。无需加密政策中的网络配置,因为整个政策在 Android Management API 服务中都是加密的。此外,对于口令、私钥等敏感信息,系统还提供第二层加密。
 
- 必须省略 
- NetworkConfiguration对象:- GUID、- Name、- Type和- WiFi是受支持的字段,并且都是必需字段。
- ProxySettings是一个可选字段。如果使用此属性,则仅支持- Manual和- PAC(代理自动配置)。
- Type必须设置为- WiFi。不支持其他类型的网络。
 
- WiFi对象:- 支持 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 框架保持一致,此前缀不是必需的。
- 如需设置 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。缺少此字段(或以空列表作为值)的企业无线配置会被视为不安全,并被平台拒绝。值应为有效的域名(例如“example.com”“subdomain.example.com”)。
- ClientCertType支持以下值:- Ref、- KeyPairAlias
- Inner支持以下值:- MSCHAPv2、- PAP
- Outer支持以下值:- EAP-AKA、- EAP-TLS、- EAP-TTLS、- EAP-SIM、- PEAP
- Certificate对象:- 不支持 Remove。改为在配置中省略证书。
- 不支持 TrustBits。
 
- 不支持 
示例
多个 Wi-Fi 网络
此政策片段示例显示了配置了不同安全方案的三个 WLAN 网络。开放网络配置 JSON 嵌套在 Policy JSON 的 openNetworkConfiguration 字段中。
"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 字段可用于指定用于 Wi-Fi 身份验证的已安装(请参阅 DevicePolicyManager.installKeyPair)或生成的(请参阅 DevicePolicyManager.generateKeyPair)KeyChain 密钥对的别名。对于 Android 12 及更高版本,具有通过 ClientCertKeyPairAlias 指定的别名的 KeyChain 密钥对会被授予用于 Wi-Fi 网络身份验证的权限,并用于对相应的 Wi-Fi 网络进行身份验证。在 Android 12 之前,系统会报告具有 API_LEVEL 原因的 nonComplianceDetail。如果指定的密钥对别名与现有密钥不对应,则会报告具有 INVALID_VALUE 原因和 ONC_WIFI_KEY_PAIR_ALIAS_NOT_CORRESPONDING_TO_EXISTING_KEY 具体原因的 nonComplianceDetail。以下是一个政策示例:
"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,即配置了 WPA3 192 位模式的 WPA-EAP 网络。
"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"
      }
   ]
}