编辑:我现在在非三星KitKat 4.4.3设备(Gigabyte/Zebra TC55)上看到此错误.
我试图KeyStore在我的自定义X509TrustManager类中初始化null .在构造函数中,我执行以下操作:
public EasyX509TrustManager(KeyStore keystore) throws NoSuchAlgorithmException, KeyStoreException, IOException, CertificateException {
super();
//keystore.load(null);
TrustManagerFactory factory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
factory.init((KeyStore) null); <--- ERROR HERE
TrustManager[] trustmanagers = factory.getTrustManagers();
if (trustmanagers.length == 0) {
throw new NoSuchAlgorithmException("no trust manager found");
}
this.standardTrustManager = (X509TrustManager) trustmanagers[0];
}
Run Code Online (Sandbox Code Playgroud)
并获得以下堆栈跟踪:
java.security.KeyStoreException: initialization failed
at org.spongycastle.jsse.provider.ProvTrustManagerFactorySpi.engineInit(ProvTrustManagerFactorySpi.java:127)
at javax.net.ssl.TrustManagerFactory.init(TrustManagerFactory.java:191)
at my.android.app.http.EasyX509TrustManager.<init>(EasyX509TrustManager.java:51)
at my.android.app.http.EasySSLSocketFactory.createEasySSLContext(EasySSLSocketFactory.java:53)
at my.android.app.http.EasySSLSocketFactory.getSSLContext(EasySSLSocketFactory.java:83)
at my.android.app.http.EasySSLSocketFactory.createSocket(EasySSLSocketFactory.java:133)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:165)
at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:670)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:509)
at …Run Code Online (Sandbox Code Playgroud) 鉴于Android Keystore存在许多已知问题及其丢失数据的能力,或者只是普遍失败(请参见此处,此处,此处,此处,此处和此处),我很想知道是否有任何开发人员实际使用过Android Keystore在用于生成密钥的实时应用程序中,还没有遇到与Keystore无法从密钥库创建或检索密钥相关的大量崩溃报告?你是如何解决已知问题的?我特别感兴趣的是,KeyPairGenerator该类用于生成不需要用户身份验证的私钥 - 公钥对(即不需要在设备上设置屏幕锁定).
编辑:我在下面列出了我用于通过Android Keystore生成私钥 - 公钥对的代码:
KeyPair createPrivateKeyEntry(@NonNull Context context,
@NonNull String keyAlias) throws CryptoException {
try {
AlgorithmParameterSpec spec = getAlgorithmParameterSpec(context, keyAlias);
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(
"RSA",
"AndroidKeyStore"
);
keyPairGenerator.initialize(spec);
return keyPairGenerator.generateKeyPair();
} catch (Exception e) {
String message = "Unexpected error when attempting to create a private key entry.";
throw new CryptoException(message, e);
}
}
private AlgorithmParameterSpec getAlgorithmParameterSpec(@NonNull Context context, …Run Code Online (Sandbox Code Playgroud) 有一个随机密钥来通过 AES 加密本地凭据,我正在按照以下教程尝试安全地存储该密钥,然后能够在以后解密:
nelenkov.blogspot.co.uk 在 android 中存储应用程序机密
本教程解释了如何访问系统密钥库并将密码存储在其中。
我面临的问题集中在调用UNLOCK ( android.credentials.UNLOCK ) KeyStore 上。未初始化 KeyStore 的设备(目前 API 低于 14),它们会显示一个对话框,要求输入 8 位密码。
本教程运行良好,但是显示此对话框甚至只显示一次,它会打扰大多数用户。
有什么办法可以跳过这个对话框吗?
如果有人描述了一种在本地保留密钥的更好方法,我会更高兴。