2014-02-18 5 views
1

WifiEnterpriseConfig setClientKeyEntry метод принимает закрытый ключ & ссылки на сертификаты. У меня есть сертификат .p12, хранящийся в хранилище сертификатов Android. Могу ли я использовать KeyChain API (getCertificateChain, getPrivateKey), чтобы получить секретный ключ и ссылку на сертификат и передать его в setClientKeyEntry? В качестве альтернативы, если у меня есть сертификат .p12 в формате String или byte array, тогда мне нужно сохранить его в хранилище сертификатов, чтобы иметь возможность использовать его для Wifi EAP-TLS?Android Wifi EAP TLS с использованием WifiEnterpriseConfig setClientKeyEntry

Предположения: setClientKeyEntry-метод необходим для программно заданного EAP-TLS на клиенте Android 4.3+.

+0

Из моего тестирования я заметил, что, когда я получаю ссылку PrivateKey с помощью метода KeyPrintKeyNainKey, и затем использую его в setClientKeyEntry, тогда он выдает исключение-java.lang.IllegalArgumentException: закрытый ключ не может быть закодирован. Метод setClientKeyEntry выдает это исключение, если метод getEncoded возвращает значение null для ссылки на объект PrivateKey. Непонятно, почему getEncoded возвращает null. – user802467

ответ

1

Попробуйте это:

WifiConfiguration wc = new WifiConfiguration(); 
wc.SSID = "\"your_ssid\""; 
wc.allowedKeyManagement.set(KeyMgmt.WPA_EAP); 
wc.allowedKeyManagement.set(KeyMgmt.IEEE8021X); 
wc.enterpriseConfig.setEapMethod(Eap.TLS); 
wc.status = WifiConfiguration.Status.ENABLED; 

... 

KeyStore pkcs12ks = KeyStore.getInstance("pkcs12"); 

in = new BufferedInputStream(new FileInputStream(new File("/path/to/your.p12"))); 
// alternatively you can read from any input stream, e.g. ByteArrayInputStream to read from String 

pkcs12ks.load(in, "pasword".toCharArray()); 

Enumeration<String> aliases = pkcs12ks.aliases(); 
while (aliases.hasMoreElements()) { 
    String alias = aliases.nextElement(); 
    Log.d(TAG, "Processing alias " + alias); 

    X509Certificate cert = (X509Certificate) pkcs12ks.getCertificate(alias); 
    Log.d(TAG, cert.toString()); 

    PrivateKey key = (PrivateKey) pkcs12ks.getKey(alias, "password".toCharArray()); 
    Log.d(TAG, key.toString()); 

    wc.enterpriseConfig.setClientKeyEntry(key, cert); 
    wc.enterpriseConfig.setIdentity("WiFi-1"); 
} 

... 

int netID = wifiManager.addNetwork(wc); 
wifiManager.saveConfiguration(); 
wifiManager.enableNetwork(netID, true); 

Надлежащее обработка исключений не показана.