Android KeyStore:生成自签名证书失败,日期字符串无效。

9

我正在尝试使用Android Keystore创建密钥对,以下是我的代码:

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版本号为6.0,构建编号为3.35.401.12

  • 日期格式示例:开始时间:2016年3月12日星期六23:10:08 GMT+03:00。结束时间:2026年3月12日星期四23:10:08 GMT+03:00。

提前感谢您的帮助。


1
  1. 此问题发生在哪个 Android 设备上?请提供设备型号、Android 版本和构建编号。
  2. 在 generateKeyPair 之前,如果打印 start 和 end 变量,会输出什么内容?
- Alex Klyubin
设备:HTC M9,Android v.6.0,构建号:3.35.401.12。 - Radi
1
@Radi Ah,我的错误。这是一个奇怪的问题,看起来你提供的日期有些混乱。它正在尝试解析的日期“afcabhdedfGMT+00:00”似乎是无意义的。 - Bryan
1
@Radi,你找到任何解决方案了吗? - Dr.jacky
显示剩余4条评论
2个回答

1

使用阿拉伯语或波斯语时的密钥库问题

当密钥库生成密钥对时,它会生成一个自签名证书。Android密钥库内部使用的ASN1解析器没有正确地接受区域设置,这会导致设备区域设置为从右到左的语言失败。示例堆栈跟踪:

Caused by: java.lang.IllegalArgumentException: invalid date string: Unparseable date: "÷ððñðñððððððGMT+00:00" at com.android.org.bouncycastle.asn1.ASN1UTCTime.(ASN1UTCTime.java:115) at com.android.org.bouncycastle.asn1.DERUTCTime.(DERUTCTime.java:23) at com.android.org.bouncycastle.asn1.x509.Time.(Time.java:67) at android.security.keystore.AndroidKeyStoreKeyPairGeneratorSpi.generateSelfSignedCertificateWithFakeSignature(AndroidKeyStoreKeyPairGeneratorSpi.java:696)

向Google报告的问题:https://code.google.com/p/android/issues/detail?id=207613


1

正如 @Muralidhar 所说,这是一个与 AndroidKeyStore 相关的已知问题

Android KeyStore 没有正确地接受语言环境,导致设备语言从右到左的本地化失败。

一种解决方法是在生成密钥对之前设置英文语言环境,在所有操作完成后再将其改回。请参阅此答案


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接