【问题标题】:Connect Android to WiFi Enterprise network EAP(PEAP)将 Android 连接到 WiFi 企业网络 EAP(PEAP)
【发布时间】:2012-03-02 05:28:04
【问题描述】:

在过去的几天里,我一直在尝试以编程方式将我的 android 设备连接到企业网络,但没有成功,我一直在网上关注多个示例,但我发现的大多数示例都是针对 EAP(TLS) 网络和我工作的一个是 EAP(PEAP),这里是网络类型。

802.1x EAP

EAP 方法:PEAP

第 2 阶段身份验证:MSCHAPV2

身份验证总是失败,logcat 没有告诉我问题出在哪里,我只知道在执行身份验证时它失败了。

这是我当前代码的副本以及 logcat 失败的日志:

/****************** 代码 *************************** ***/

public class WPAActivity extends LauncherActivity 
{

private static final String TAG = "WPAActivity";

/************* Definitions to find variables ***************************/
private static final String INT_PRIVATE_KEY = "private_key";
private static final String INT_PHASE2 = "phase2";
private static final String INT_PASSWORD = "password";
private static final String INT_IDENTITY = "identity";
private static final String INT_EAP = "eap";
private static final String INT_CLIENT_CERT = "client_cert";
private static final String INT_CA_CERT = "ca_cert";
private static final String INT_ANONYMOUS_IDENTITY = "anonymous_identity";
final String INT_ENTERPRISEFIELD_NAME ="android.net.wifi.WifiConfiguration$EnterpriseField";
/************************************************************************/

/********************************Configuration Strings*********************/
final String ENTERPRISE_EAP = "PEAP";
final String ENTERPRISE_CLIENT_CERT = "";
final String ENTERPRISE_PRIV_KEY = "";
final String ENTERPRISE_PHASE2 = "\"MSCHAPV2\"";
final String ENTERPRISE_ANON_IDENT = "";
final String ENTERPRISE_CA_CERT = "";
final String userName = "\"my Username";
final String passString = "\"my Password\"";

/**************************************************************************/


/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) 
{


super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
    WifiConfiguration wc = new WifiConfiguration();
    wc.SSID = "\"mySSID\"";
    wc.preSharedKey  = "\"my Password\"";
    wc.hiddenSSID = true;
    wc.status = WifiConfiguration.Status.ENABLED;        

    wc.allowedKeyManagement.clear();
    wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.IEEE8021X);
    wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP);


    /*Group Ciphers*/
    wc.allowedGroupCiphers.clear();
    wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
    wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);

    /*Protocols*/
    wc.allowedProtocols.clear();
    wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
    wc.allowedProtocols.set(WifiConfiguration.Protocol.WPA);

    Class[] enterpriseFieldArray  = WifiConfiguration.class.getClasses();
    Class<?> enterpriseFieldClass = null;


    for(Class<?> myClass : enterpriseFieldArray)
    {
        if(myClass.getName().equals(INT_ENTERPRISEFIELD_NAME))
        {
        enterpriseFieldClass = myClass;
        break;
        }
    }
    Log.d(TAG, "class chosen " + enterpriseFieldClass.getName() );


    Field anonymousId = null, caCert = null, clientCert = null, 
        eap = null, identity = null, password = null, 
        phase2 = null, privateKey =  null;

    Field[] fields = WifiConfiguration.class.getFields();


    for (Field tempField : fields) 
    {
        if (tempField.getName().trim().equals(INT_ANONYMOUS_IDENTITY))
        {
        anonymousId = tempField;
        Log.d(TAG, "field " + anonymousId.getName() );
        }
        else if (tempField.getName().trim().equals(INT_CA_CERT))
        {
        caCert = tempField;
        }
        else if (tempField.getName().trim().equals(INT_CA_CERT))
        {
        }
        else if (tempField.getName().trim().equals(INT_CLIENT_CERT))
        {
        clientCert = tempField;
        Log.d(TAG, "field " + clientCert.getName() );
        }    
        else if (tempField.getName().trim().equals(INT_EAP))
        {
        eap = tempField;
        Log.d(TAG, "field " + eap.getName() );
        }
        else if (tempField.getName().trim().equals(INT_IDENTITY))
        {
        identity = tempField;
        Log.d(TAG, "field " + identity.getName() );
        }
        else if (tempField.getName().trim().equals(INT_PASSWORD))
        {
        password = tempField;
        Log.d(TAG, "field " + password.getName() );
        }
        else if (tempField.getName().trim().equals(INT_PHASE2))
        {
        phase2 = tempField;
        Log.d(TAG, "field " + phase2.getName() );

        }
        else if (tempField.getName().trim().equals(INT_PRIVATE_KEY))
        {
        privateKey = tempField;
        }
    }


    Method setValue = null;


    for(Method m: enterpriseFieldClass.getMethods())
    {
        if(m.getName().trim().equals("setValue"))
        {
        Log.d(TAG, "method " + m.getName() );
        setValue = m;
        break;
        }
    }

    try
    {
        // EAP
        setValue.invoke(eap.get(wc), ENTERPRISE_EAP);

        // EAP Phase 2
        setValue.invoke(phase2.get(wc), ENTERPRISE_PHASE2);

        // EAP Anonymous Id
        setValue.invoke(anonymousId.get(wc), ENTERPRISE_ANON_IDENT);

        // EAP CA Certificate
        setValue.invoke(caCert.get(wc), ENTERPRISE_CA_CERT);

        // Private Key
        setValue.invoke(privateKey.get(wc), ENTERPRISE_PRIV_KEY);

        // EAP Identity
        setValue.invoke(identity.get(wc), userName);

        // EAP Password
        setValue.invoke(password.get(wc), passString);

        // EAP Client certificate
        setValue.invoke(clientCert.get(wc), ENTERPRISE_CLIENT_CERT);

    }
    catch (Exception e)
    {

    }

    Log.d("WifiPreference", "2");
    int res = wifi.addNetwork(wc);
    Log.d("WifiPreference", "add Network returned " + res );
    boolean b = wifi.enableNetwork(res, true);        
    Log.d("WifiPreference", "enableNetwork returned " + b );
    }
}

这些是指示连接尝试失败的日志

/************************这里是日志********************** ***/

02-09 09:23:30.514: I/ActivityManager(2084): Displayed activity com.test.wpa/.WPAActivity: 445 ms (total 445 ms)

02-09 09:23:31.514: I/wpa_supplicant(27633): CTRL-EVENT-SCAN-RESULTS  Ready

02-09 09:23:31.514: I/wpa_supplicant(27633): Trying to associate with 00:1c:0f:82:04:e0 (SSID='*****' freq=2437 MHz)

02-09 09:23:31.514: I/wpa_supplicant(27633): CTRL-EVENT-STATE-CHANGE id=-1 state=3

02-09 09:23:31.649: V/WifiMonitor(2084): Event [Trying to associate with 00:1c:0f:82:04:e0 (SSID='*****' freq=2437 MHz)]

02-09 09:23:31.649: V/WifiMonitor(2084): Event [CTRL-EVENT-STATE-CHANGE id=-1 state=3]

02-09 09:23:31.654: V/WifiStateTracker(2084): Changing supplicant state: SCANNING ==> ASSOCIATING

02-09 09:23:31.654: D/NetworkStateTracker(2084): setDetailed state, old =SCANNING and new state=CONNECTING

02-09 09:23:31.659: D/ConnectivityService(2084): ConnectivityChange for WIFI: CONNECTING/CONNECTING

02-09 09:23:32.621: I/wpa_supplicant(27633): CTRL-EVENT-STATE-CHANGE id=0 state=4

02-09 09:23:32.621: V/WifiMonitor(2084): Event [CTRL-EVENT-STATE-CHANGE id=0 state=4]

02-09 09:23:32.624: I/wpa_supplicant(27633): Associated with 00:1c:0f:82:04:e0

02-09 09:23:32.624: I/wpa_supplicant(27633): CTRL-EVENT-EAP-STARTED EAP authentication started

02-09 09:23:32.629: V/WifiMonitor(2084): Event [Associated with 00:1c:0f:82:04:e0]

**02-09 09:23:32.629: V/WifiMonitor(2084): Event [CTRL-EVENT-EAP-STARTED EAP authentication started]**

02-09 09:23:32.629: V/WifiStateTracker(2084): Changing supplicant state: ASSOCIATING ==> ASSOCIATED

**02-09 09:23:32.629: D/NetworkStateTracker(2084): setDetailed state, old =CONNECTING and new state=CONNECTING**

**02-09 09:23:32.634: I/wpa_supplicant(27633): CTRL-EVENT-DISCONNECTED - Disconnect event - remove keys**

02-09 09:23:32.644: I/wpa_supplicant(27633): CTRL-EVENT-STATE-CHANGE id=0 state=0

**02-09 09:23:32.644: V/WifiMonitor(2084): Event [CTRL-EVENT-DISCONNECTED - Disconnect event - remove keys]**

02-09 09:23:32.644: V/WifiMonitor(2084): Event [CTRL-EVENT-STATE-CHANGE id=0 state=0]

我在网上找不到有关以编程方式进行 EAP (PEAP) 身份验证的示例,我尝试更改 WiFi 配置但没有成功。关于如何连接到企业网络 EAP (PEAP) 的任何想法或有用的网站/示例,或者有人可以指出正确的方向吗?

【问题讨论】:

  • 我想不通,所以我决定简单地告诉用户手动连接,如果没有找到连接或抛出异常,它似乎工作得更好。

标签: android wifi connect enterprise


【解决方案1】:

最后,我击败了我的 CiSCO EAP-FAST 公司 wifi 网络,现在我们所有的 Android 设备都可以连接到它。

我为从 Android 设备访问此类网络而进行的漫游比您想象的要简单。

Google Play 商店中有一个 Wifi 配置编辑器,您可以在设置 EAP wifi 连接时使用“激活”辅助 CISCO 协议。

它的名字是Wifi Config Advanced Editor。

  • 首先,您必须手动设置无线网络,使其尽可能接近“官方”公司 wifi 参数。

  • 保存。

  • 进入 WCE 并编辑您在上一步中创建的网络的参数。

  • 您应该激活 3 或 4 系列设置,以强制 Android 设备使用它们作为连接方式(我认为您要访问的主站点是 Enterprise Configuration,但不要如果需要,忘记检查所有参数以更改它们。
    作为建议,即使您有 WPA2 EAP-FAST 密码,也请在您的设置中尝试 LEAP。它对我来说是一种魅力。

  • 完成配置编辑后,转到主 Android wifi 控制器,并强制连接到此网络。

  • 不要再次使用 Android wifi 界面编辑网络。

我已经在三星 Galaxy 1 和 2、Note 移动设备以及联想 Thinkpad 平板电脑上对其进行了测试。

【讨论】:

  • 所以解决方案是使用 LEAP?
【解决方案2】:

感谢您启发我们 Cypawer。

我也试过这个应用https://play.google.com/store/apps/details?id=com.oneguyinabasement.leapwifi

它完美地工作。

【讨论】:

    【解决方案3】:

    我正在尝试在我的程序中连接公司的 eap wifi。

    前置条件:

    1.让 IT 人员将您设备的 mac 地址添加到网络配置中。

    2.我的网络配置:

    EAP method:PEAP
    
    Phase2MethodVerify:NULL
    
    CACertificateVerify:NULL
    
    Identity:""
    
    Password:""
    

    首先,我添加了一些登录设置,这样我就知道点击wifi提交按钮时发生了什么。

    打印如下:

    * ID: -1 SSID: "SSID" PROVIDER-NAME: null BSSID: null FQDN: null PRIO: 0 HIDDEN: false
     NetworkSelectionStatus NETWORK_SELECTION_ENABLED
     hasEverConnected: false
     KeyMgmt: WPA_EAP IEEE8021X Protocols:
     AuthAlgorithms:
     PairwiseCiphers:
     GroupCiphers:
     PSK: 
    Enterprise config:
    password <removed>
    ca_path NULL
    engine 0
    proactive_key_caching 1
    client_cert NULL
    anonymous_identity NULL
    ca_cert NULL
    identity "name"
    domain_suffix_match NULL
    key_id NULL
    engine_id NULL
    IP config:
    IP assignment: DHCP
    Proxy settings: NONE
     cuid=-1 luid=-1 lcuid=0 userApproved=USER_UNSPECIFIED noInternetAccessExpected=false isCarrierNetwork=false roamingFailureBlackListTimeMilli: 1000
    triggeredLow: 0 triggeredBad: 0 triggeredNotHigh: 0
    ticksLow: 0 ticksBad: 0 ticksNotHigh: 0
    triggeredJoin: 0
    

    我在代码中的配置是:

                config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP);
            config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.IEEE8021X);
    
            config.enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.PEAP);
            config.enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.NONE);
            config.enterpriseConfig.setCaCertificate(null);
            config.enterpriseConfig.setAnonymousIdentity(null);
            config.enterpriseConfig.setDomainSuffixMatch(null);
    
            String ssid = "";
            String psw = "";
            config.enterpriseConfig.setIdentity(ssid);
            config.enterpriseConfig.setPassword(psw);
    

    它会这样打印:

        * ID: -1 SSID: "SSID" PROVIDER-NAME: null BSSID: null FQDN: null PRIO: 0 HIDDEN: false
     NetworkSelectionStatus NETWORK_SELECTION_ENABLED
     hasEverConnected: false
     KeyMgmt: WPA_EAP IEEE8021X Protocols:
     AuthAlgorithms:
     PairwiseCiphers:
     GroupCiphers:
     PSK: 
    Enterprise config:
    anonymous_identity NULL
    password <removed>
    identity "name"
    domain_suffix_match NULL
    proactive_key_caching 1
    IP config:
    IP assignment: UNASSIGNED
    Proxy settings: UNASSIGNED
     cuid=-1 luid=-1 lcuid=0 userApproved=USER_UNSPECIFIED noInternetAccessExpected=false isCarrierNetwork=false roamingFailureBlackListTimeMilli: 1000
    triggeredLow: 0 triggeredBad: 0 triggeredNotHigh: 0
    ticksLow: 0 ticksBad: 0 ticksNotHigh: 0
    triggeredJoin: 0
    

    终于成功了~

    【讨论】:

      猜你喜欢
      • 2011-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-15
      • 2015-05-20
      相关资源
      最近更新 更多