Свържете Android към WiFi корпоративна мрежа EAP(PEAP)

Опитвам се програмно да свържа устройството си с 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) или може ли някой да ме насочи в правилната посока?


person Camilo Tejeiro    schedule 09.02.2012    source източник
comment
Не можах да разбера това, така че реших просто да кажа на потребителя да се свърже ръчно, ако не бъде намерена връзка или ако бъде хвърлено изключение, изглежда, че работи по-добре.   -  person Camilo Tejeiro    schedule 29.05.2012


Отговори (3)


Най-накрая победих моята CiSCO EAP-FAST корпоративна wifi мрежа и всичките ни устройства с Android вече могат да се свързват с нея.

Обходът, който извърших, за да получа достъп до този вид мрежи от устройство с Android, е най-лесният, отколкото можете да си представите.

Има Wifi Config Editor в Google Play Store, който можете да използвате, за да „активирате“ вторичните CISCO протоколи, когато настройвате EAP wifi връзка.

Името му е Wifi Config Advanced Editor.

  • Първо, трябва да настроите вашата безжична мрежа ръчно възможно най-близо до вашите „официални“ корпоративни wifi параметри.

  • Запази го.

  • Отидете до WCE и редактирайте параметрите на мрежата, която сте създали в предишната стъпка.

  • Има 3 или 4 серии от настройки, които трябва да активирате, за да принудите устройството с Android да ги използва като начин за свързване (основният сайт, който мисля, че искате да посетите, е Enterprise Configuration, но не забравяйте да проверите всички параметри за да ги промените, ако е необходимо.
    Като предложение, дори ако имате WPA2 EAP-FAST Cipher, опитайте LEAP във вашата настройка. За мен сработи като чар.

  • Когато приключите с редактирането на конфигурацията, отидете на основния wifi контролер на Android и принудете да се свържете с тази мрежа.

  • Не редактирайте отново мрежата с wifi интерфейса на Android.

Тествах го на Samsung Galaxy 1 и 2, мобилни устройства Note и на Lenovo Thinkpad Tablet.

person Cypawer    schedule 14.09.2012
comment
така че решението е да се използва LEAP? - person Mikael Dúi Bolinder; 04.12.2013

Опитвам се да свържа eap wifi на компанията в моята програма.

Предварително условие:

1. позволете на ИТ персонала да добави 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

Най-накрая работи~

person you    schedule 07.05.2021

Благодаря, че ни просветли Cypawer.

Изпробвах и това приложение https://play.google.com/store/apps/details?id=com.oneguyinabasement.leapwifi

и работеше безупречно.

Leap Wifi конектор

person HimalayanCoder    schedule 20.06.2013