3

私が開発しているアプリケーションの場合、CAとユーザー証明書、および秘密鍵を集中せずにインストールできる必要があります。

私には完全なシステム特権があり、これが発生する前にユーザーがパスワードを持っていると想定するのは公平です。CA証明書の場合はx509、ユーザー証明書+秘密鍵ファイルの場合はpk12、USer証明書+秘密鍵の場合はパスワードを使用します。WPA-EAP Wi-Fi構成を自動的にセットアップできるようにするには、これを行う必要があります。おそらく、従業員が何も気付かずにこれを実行したいと考えています。

インストールされているすべての証明書を一覧表示する方法も知っている人がいれば、とてもありがたいです。

私は一日中チェックし、keystore_cliで少しテストしましたが、成功しませんでした。また、賢明になることなくCertInstallerコードを読みました。すべてがパッケージ全体にあるため、メソッドを直接呼び出すことはできません。+さらに、com.android.settings "、"com.android.settings.CredentialStorage"にデータを送信しているようです。

どんなアドバイスもとても素晴らしいでしょう。


編集疑問に思っている人のために、これが私がCA証明書でそれをどのように行ったかです。アプリケーションは、システムユーザーとして実行できる必要があります(android:sharedUserId="android.uid.system"Androidマニフェスト内)。

            // Android...why do you enjoy doing my life so difficult...
            try {
                Class<?> keyStoreClass = WifiConfiguration.class.getClassLoader().loadClass("android.security.KeyStore");

                Method getInstanceMethod = keyStoreClass.getMethod("getInstance");
                Object keyStore = getInstanceMethod.invoke(null);

                Log.d("DeviceManager", "Got keystore" + keyStore.toString());

                // Put(Key, Value)
                Method putCertificateMethod = keyStoreClass.getMethod("put", String.class, byte[].class);

                Log.d("DeviceManager", "Putting...");

                RandomAccessFile file = new RandomAccessFile("/data/ca.crt", "r");
                byte[] b = new byte[(int)file.length()];
                file.read(b);
                byte[] cacert = b;

                Log.d("DeviceManager", "Certificate is bytes long: " + b.length);

                putCertificateMethod.invoke(keyStore, "CACERT_name", cacert);


            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
4

2 に答える 2

1

幸い、これはストックデバイスでは不可能です。そうしないと、不正なアプリがユーザーの同意なしにCA証明書をインストールする可能性があります。デバイスのセットが少ない場合は、事前にプロビジョニングする必要がある場合があります。PKCS#12ファイルはパスワードで保護されているため、誰かがパスワードを入力する必要があります。

「完全なシステム権限」の意味はわかりませんが、アプリをプラットフォームコードにリンクし、システム証明書で署名できる場合は、KeyChainServiceメソッドを直接呼び出すことができます。これにより、証明書をインストールできます。さらに、CA証明書はファイルとして保存されるだけなので、適切な場所にコピーできます。詳細はこちら: http: //nelenkov.blogspot.jp/2011/11/ics-credential-storage-implementation.html

于 2012-06-22T03:26:20.000 に答える
0

次の方法では、CA証明書とユーザー証明書を使用してWPA/EAP-TLSWi-Fi構成を構成します。他のEAP構成にも使用できます。

public static void createEapConfig(Context context、String ssid、String password、boolean connectAutomatically、boolean hiddenNetwork、
                                   整数eapMethod、整数phase2、文字列ID、文字列anonymousIdentity、文字列caCertificateData、
                                   文字列clientCertificateData、文字列clientCertPass){
    if(ssid == null || eapMethod == null){
        戻る;
    }
    WifiManager wifiManager =(WifiManager)context.getSystemService(Context.WIFI_SERVICE);
    boolean connect = connectAutomatically;
    boolean isWifiReceiverRegistered = false;
    試す {
        Logger.logEnteringOld();

        WifiConfiguration config = new WifiConfiguration();
        config.SSID = "\" "+ ssid +" \ "";
        config.hiddenSSID = hiddenNetwork; // false; //非表示のネットワークは常にfalseに設定されます。
        config.status = WifiConfiguration.Status.ENABLED;
        config.priority = 40;
        試す {
            wifiManager.getClass()。getMethod( "setWifiApEnabled"、WifiConfiguration.class、boolean.class).invoke(wifiManager、config、false);
        } catch(例外e){
            Logger.logError(e);
        }
        Settings.isWifiHotspotEnabled(false);
        if(!wifiManager.isWifiEnabled()){
            wifiManager.setWifiEnabled(true);
            Thread.sleep(5000);
        }

        if(接続){
            lastActNetId = wifiManager.getConnectionInfo()。getNetworkId();
            wifiManager.disableNetwork(lastActNetId);
            wifiManager.disconnect();
        }
        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP);
        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.IEEE8021X);

        //デフォルトを設定します
        if(phase2 == null)phase2 = WifiEnterpriseConfig.Phase2.NONE;
        if(identity == null)identity = "";
        if(anonymousIdentity == null)anonymousIdentity = "";
        if(caCertificateData == null)caCertificateData = "";
        if(clientCertificateData == null)clientCertificateData = "";
        if(Build.VERSION.SDK_INT> = 18){
            if(Util.isNullOrEmpty(password)){
                config.enterpriseConfig.setPassword(password);
            }

            config.enterpriseConfig.setEapMethod(eapMethod);

            if(phase2!= null){
                config.enterpriseConfig.setPhase2Method(phase2);
            }
            if(!Util.isNullOrEmpty(identity)){
                config.enterpriseConfig.setIdentity(identity);
            }
            if(!Util.isNullOrEmpty(anonymousIdentity)){
                config.enterpriseConfig.setAnonymousIdentity(anonymousIdentity);
            }
            InputStreamは=null;
            if(!Util.isNullOrEmpty(caCertificateData)){
                試す {
                    byte [] decodeCaCert = Base64.decode(caCertificateData);
                    // is = new FileInputStream(Environment.getExternalStorageDirectory()+ "/ local-root(1).cer");
                    CertificateFactory cf = CertificateFactory.getInstance( "X.509");
                    試す {

                        is = new ByteArrayInputStream(decodedCaCert);
                        X509Certificate caCert =(X509Certificate)cf.generateCertificate(is);
                        config.enterpriseConfig.setCaCertificate(caCert);
                    } catch(CertificateException ex){
                        Logger.logError(ex);
                    } ついに {
                        if(is!= null){
                            近いよ();
                        }
                    }
                } catch(Throwable t){
                    Logger.logError(t);
                }
            }
            if(!Util.isNullOrEmpty(clientCertificateData)&&!Util.isNullOrEmpty(clientCertPass)){
                試す {
                    byte [] decodeClientCert = Base64.decode(clientCertificateData);
                    KeyStore p12 = KeyStore.getInstance( "pkcs12");
                    is = new ByteArrayInputStream(decodedClientCert);
                    // is = new FileInputStream(Environment.getExternalStorageDirectory()+ "/ createdDERCert(1).pfx");
                    p12.load(is、clientCertPass.toCharArray());
                    列挙型エイリアス=p12.aliases();
                    for(String alias:Collections.list(aliases)){

                        if(alias == null){
                            継続する;
                        }

                        PrivateKey privateKey =(PrivateKey)p12.getKey(alias、clientCertPass.toCharArray());
                        if(privateKey == null){
                            継続する;
                        }

                        X509Certificate clientCert =(X509Certificate)p12.getCertificate(alias);

                        if(clientCert!= null){
                            config.enterpriseConfig.setClientKeyEntry(privateKey、clientCert);
                        }
                    }
                } catch(Throwable t){
                    Logger.logError(t);
                } ついに {
                    if(is!= null){
                        試す {
                            近いよ();
                        } catch(IOException e){
                            e.printStackTrace();
                        }
                    }
                }
            }
        }

        int networkId = -1;
        networkId = wifiManager.addNetwork(config);

        wifiManager.enableNetwork(networkId、true);
        wifiManager.saveConfiguration();

        if(接続){
            wifiManager.reconnect();
            IntentFilter filter = new IntentFilter();
            filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
            Settings.cntxt.registerReceiver(wifiReceiver、filter);
            isWifiReceiverRegistered = true;
            Thread.sleep(15000);
        }
    } catch(InterruptedException ie){
        if(NetworkStateReceiver.activeConnection(Settings.cntxt)){
            lastActNetId = wifiManager.getConnectionInfo()。getNetworkId();
        }
    } catch(Exception ex){
        Logger.logError(ex);
    } ついに {
        //wifi状態レシーバーの登録を解除します
        if(connect && isWifiReceiverRegistered){
            isWifiReceiverRegistered = false;
            Settings.cntxt.unregisterReceiver(wifiReceiver);
        }
    }

    Logger.logEnteringOld();
}

于 2017-12-21T12:09:04.643 に答える