Android 11使用WifiNetworkSuggestion连接WPA2 Enterprise EAP PEAP网络报错
报错根因
Android 11起原生系统强制要求企业级WPA2/WPA3网络配置必须做服务器身份校验,未配置CA证书、服务器域名的不安全配置会直接抛出IllegalArgumentException: Enterprise configuration is insecure异常。
现有代码问题排查
你当前代码存在配置冲突错误:setWpa2Passphrase是个人版WPA2网络的配置方法,和企业级配置setWpa2EnterpriseConfig互斥。如果传入的wifiConnection对象携带sharedKey参数,两个配置同时生效会直接触发异常,需要删除如下逻辑:
if (wifiConnection.sharedKey != null) { networkSuggestionBuilder.setWpa2Passphrase(wifiConnection.sharedKey) }
这也是你在不同场景下调用setUntrusted有时仍报错的核心原因。
可选解决方案
方案1:配置CA证书与服务器校验(最推荐,合规稳定)
CA证书不需要必须内置到应用资源,可通过用户手动选择导入、服务端下发等任意方式获取,只要最终转换为X509Certificate实例即可使用。
配置示例代码:
private fun initWpa2EnterpriseWifiSuggestion(wifiConnection: WifiConnectionEntity) = if (wifiConnection.user != null && wifiConnection.password != null) { val networkSuggestionBuilder = WifiNetworkSuggestion.Builder() networkSuggestionBuilder.setSsid(wifiConnection.ssid) val enterpriseConfig = WifiEnterpriseConfig() enterpriseConfig.identity = wifiConnection.user enterpriseConfig.password = wifiConnection.password enterpriseConfig.eapMethod = WifiEnterpriseConfig.Eap.PEAP enterpriseConfig.phase2Method = WifiEnterpriseConfig.Phase2.MSCHAPV2 // 新增CA证书配置 val certificateFactory = CertificateFactory.getInstance("X.509") // 这里以从raw资源加载为例,可替换为其他来源的证书输入流 val caInput: InputStream = resources.openRawResource(R.raw.your_ca_file) val caCert = certificateFactory.generateCertificate(caInput) as X509Certificate caInput.close() enterpriseConfig.caCertificate = caCert // 新增服务器域名配置,替换为实际认证服务器的域名 enterpriseConfig.altSubjectMatch = "DNS:auth.yourdomain.com" networkSuggestionBuilder.setWpa2EnterpriseConfig(enterpriseConfig) Pair(networkSuggestionBuilder.build(), null) } else { Pair( null, if (wifiConnection.user == null) ERROR_USER_NOT_PROVIDED else ERROR_PASSWORD_NOT_PROVIDED ) }
方案2:无证书模式(仅适合测试/特殊场景)
原生WifiNetworkSuggestion API本身不支持公开的无证书配置,你之前调用setUntrusted(true)后连接失败,可补充匿名身份配置尝试修复:
// 配置WifiEnterpriseConfig时新增 enterpriseConfig.anonymousIdentity = "anonymous" // 构造suggestion时开启untrusted模式 networkSuggestionBuilder.setUntrusted(true)
注:你在系统设置页看到的“无证书”选项是厂商ROM对原生逻辑做的定制修改,原生API无对应公开接口,该方案兼容性不稳定,部分设备依然会触发配置不安全报错。
方案3:替代实现方案
如果WifiNetworkSuggestion始终无法适配你的场景,可改用WifiNetworkSpecifier配合系统网络请求API实现连接,缺点是配置不会持久化保存到系统WiFi列表,每次连接都需要用户手动确认授权。
内容的提问来源于stack exchange,提问作者Jorge Díaz

