对于我正在开发的应用程序,我需要能够在他或她不知情的情况下安装 CA 和用户证书和私钥。
我将拥有完整的系统特权,并且可以公平地假设用户在此之前将拥有密码。如果是 CA 证书,我将拥有 x509,如果是用户证书 + 私钥文件,我将拥有 pk12,如果是用户证书 + 私钥,我将拥有密码。我需要这样做才能自动设置 WPA-EAP wifi 配置,并且最好我希望在员工不必注意任何事情的情况下发生这种情况。
如果有人也知道如何列出所有已安装的证书,我将不胜感激。
我已经检查了一整天,并使用keystore_cli进行了一些测试,但没有成功,而且我还通读了 CertInstaller 代码,但没有得到任何更明智的结果。那里的所有东西都是包范围的,所以我不能直接调用这些方法,+ 它似乎将东西发送到更远的地方 com.android.settings"、"com.android.settings.CredentialStorage"。
任何建议都会非常棒。
编辑对于那些想知道的人,这是我使用 CA 证书的方式。应用程序需要能够以系统用户身份运行(android:sharedUserId="android.uid.system"
在 android manifest 中)。
// 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();
}