私が開発しているアプリケーションの場合、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();
}