我正在尝试使用Android Keystore按照我的代码创建keyPair:
Calendar start = Calendar.getInstance();
Calendar end = Calendar.getInstance();
end.add(Calendar.YEAR, 10);
KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(MyApplication.getInstance())
.setAlias(m_alias)
.setSubject(new X500Principal("CN="+m_alias))
.setSerialNumber(BigInteger.ONE)
.setStartDate(start.getTime())
.setEndDate(end.getTime())
.build();
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
generator.initialize(spec);
KeyPair keyPair = generator.generateKeyPair();
在运行时我遇到了这个例外:
java.security.ProviderException: Failed to generate self-signed certificate
at android.security.keystore.AndroidKeyStoreKeyPairGeneratorSpi.generateKeyPair(AndroidKeyStoreKeyPairGeneratorSpi.java:504)
at java.security.KeyPairGenerator$KeyPairGeneratorImpl.generateKeyPair(KeyPairGenerator.java:276)
....
Caused by: java.lang.IllegalArgumentException: invalid date string: Unparseable date: "af`cab`hdedfGMT+00:00" (at offset 0)
at com.android.org.bouncycastle.asn1.ASN1UTCTime.<init>(ASN1UTCTime.java:115)
at com.android.org.bouncycastle.asn1.DERUTCTime.<init>(DERUTCTime.java:23)
at com.android.org.bouncycastle.asn1.x509.Time.<init>(Time.java:67)
我搜索了这个问题并找不到任何可能的解决方案,请帮助我解决问题。
注意: - 设备:HTC M9,Android v.6.0,内部版本号:3.35.401.12
提前致谢。
答案 0 :(得分:0)
阿拉伯语或波斯语的密钥库问题
当密钥库生成密钥对时,它会生成自签名证书。 Android Keystore内部使用的ASN1解析器无法正确接受语言环境,并且会导致设备语言环境的失败,语言从右到左。样本堆栈跟踪:
引起:java.lang.IllegalArgumentException:无效的日期字符串:无法解析的日期:“÷ððñðñððððððGMT+ 00:00” 在com.android.org.bouncycastle.asn1.ASN1UTCTime。(ASN1UTCTime.java:115) 在com.android.org.bouncycastle.asn1.DERUTCTime。(DERUTCTime.java:23) 在com.android.org.bouncycastle.asn1.x509.Time。(Time.java:67) 在android.security.keystore.AndroidKeyStoreKeyPairGeneratorSpi.generateSelfSignedCertificateWithFakeSignature(AndroidKeyStoreKeyPairGeneratorSpi.java:696)
向Google报告的问题:https://code.google.com/p/android/issues/detail?id=207613
答案 1 :(得分:0)
正如@Muralidhar所说,它是known issue with AndroidKeyStore。
Android KeyStore没有正确接受语言环境,导致设备语言环境失败,语言从右到左。
解决方法是在生成密钥对之前设置英语区域设置并最终将其更改回来。看看this answer。