Подключите Android к корпоративной сети Wi-Fi EAP (PEAP)

Я безуспешно пытался программно подключить свое устройство Android к корпоративной сети в течение последних нескольких дней, я следил за несколькими примерами в Интернете, но большинство из них я нашел для сетей EAP (TLS), работа EAP(PEAP), вот тип сети.

802.1х ЕАР

Метод 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)


Наконец, я победил свою корпоративную сеть Wi-Fi CiSCO EAP-FAST, и теперь все наши устройства Android могут подключаться к ней.

Обход, который я выполнил, чтобы получить доступ к такого рода сетям с устройства Android, проще, чем вы можете себе представить.

В магазине Google Play есть редактор конфигурации Wi-Fi, который вы можете использовать для «активации» вторичных протоколов CISCO при настройке Wi-Fi-соединения EAP.

Его имя — расширенный редактор конфигурации Wi-Fi.

  • Во-первых, вам нужно вручную настроить беспроводную сеть как можно ближе к вашим «официальным» корпоративным параметрам Wi-Fi.

  • Сохрани это.

  • Перейдите в WCE и отредактируйте параметры сети, которую вы создали на предыдущем шаге.

  • Есть 3 или 4 серии настроек, которые вы должны активировать, чтобы заставить Android-устройство использовать их как способ подключения (основной сайт, который, я думаю, вы хотите посетить, это Enterprise Configuration, но не забудьте проверить все параметры чтобы изменить их при необходимости.
    В качестве предложения, даже если у вас есть шифр WPA2 EAP-FAST, попробуйте LEAP в вашей настройке. Это сработало для меня как шарм.

  • Когда вы закончите редактировать конфигурацию, перейдите к основному контроллеру Wi-Fi Android и принудительно подключитесь к этой сети.

  • Не редактируйте сеть снова с интерфейсом Wi-Fi Android.

Я протестировал его на мобильных устройствах Samsung Galaxy 1 и 2, Note и на планшете Lenovo Thinkpad.

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

Я пытаюсь подключить корпоративный Wi-Fi в своей программе.

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

1. Позвольте ИТ-персоналу добавить MAC-адрес вашего устройства в конфигурацию сети.

2.моя конфигурация сети:

EAP method:PEAP

Phase2MethodVerify:NULL

CACertificateVerify:NULL

Identity:""

Password:""

Во-первых, я добавил некоторые настройки входа в систему, таким образом, я знаю, что происходит, когда я нажимаю кнопку отправки Wi-Fi.

Он печатает так:

* 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 Connector

person HimalayanCoder    schedule 20.06.2013