使用 X509 证书连接 wpa2 企业 Wifi Android

发布时间:2021-03-08 17:47

我遇到了无法连接到带有预装 X509 证书的 wpa2 网络的问题。但是,如果我注释掉证书部分,一切正常。因为 Android 11+ 需要证书,所以我需要针对此问题的解决方案。我将 ca-crt 文件保存在资产文件夹 (app->src->main->assets) 中,它可以正确读取。

public class MainActivity extends AppCompatActivity {

String username = "MyUsername";
String password = "MyPassword";

String networkSSID = "MyNETWORK";

WifiManager wifiManager;
WifiEnterpriseConfig enterpriseConfig;
WifiConfiguration wifiConfig;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
    enterpriseConfig = new WifiEnterpriseConfig();
    wifiConfig = new WifiConfiguration();

    wifiConfig.SSID = String.format("\"%s\"", networkSSID);
    wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP);
    wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.IEEE8021X);

    X509Certificate cert = null;
    try{
        InputStream inStream = getResources().getAssets().open("MyNETWORK-ca.crt");
        BufferedInputStream bis = new BufferedInputStream(inStream);
        CertificateFactory cf = CertificateFactory.getInstance("X.509");
        while(bis.available() > 0){
            cert = (X509Certificate) cf.generateCertificate(bis);
        }
        bis.close();
    } catch (CertificateException e) {
        e.printStackTrace();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    enterpriseConfig.setEapMethod(PEAP);
    enterpriseConfig.setPhase2Method(MSCHAPV2);
    enterpriseConfig.setIdentity(username);
    enterpriseConfig.setAnonymousIdentity(username);
    enterpriseConfig.setPassword(password);
    enterpriseConfig.setCaCertificate(cert);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        enterpriseConfig.setAltSubjectMatch("DNS:radius01.address.xx");
        enterpriseConfig.setDomainSuffixMatch("address.xx");
    }
    wifiConfig.enterpriseConfig = enterpriseConfig;
    int wifiID = wifiManager.addNetwork(wifiConfig);
    wifiManager.enableNetwork(wifiID, true);
}

}

对于 Android 10+,我使用 NetworkSuggestion 连接到 Wifi(省略以节省空间)。

我还在 ManifestFile 中接受了以下权限:

  • 访问 Wifi 状态
  • 更改 Wifi 状态
  • 接入网络状态
  • 访问好位置
  • 访问粗略位置
  • 互联网
回答1