当前位置: 首页 > news >正文

记录一次Android11系统证书安装失败

背景

从设置里面安装证书,提示报错。
一种是只有公钥的证书,系统提示需要私钥。
一种是带私钥的证书,系统反复提示输入密码。

原因

只有公钥证书

只有公钥的证书,Android会检查证书的CA属性,如果不包含或者CA=false,则提示需要私钥。
这里的CA属性与机构无关,只是签发证书的时候:basicConstraints=CA:TRUE

解决

签发是增加以上即可,类似信息如下:

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:TRUE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names[alt_names]
DNS.1 = localhost
IP.2 = 127.0.0.1
DNS.3 = test.com
DNS.4 = *.test.com

包含私钥的证书

反复提示的输入:1.密码错误,重新确认密码;2证书解析失败。
本次遇到是第二种情况,主要是证书使用的算法:

oid(1.2.840.113549.1.5.12) PBKDF2 

系统无法识别这个OID SecretKeyFactory。没有任何provider支持。
原生BC provider是支持的。
从代码发现,Android支持的BC provider 去掉这个的声明:
com.android.internal.org.bouncycastle.jcajce.provider.symmetric.PBEPBKDF2.java

 public static class Mappingsextends AlgorithmProvider{private static final String PREFIX = PBEPBKDF2.class.getName();public Mappings(){}public void configure(ConfigurableProvider provider){// Android-note: Provided classes differ significantly from upstream.// Before BC 1.56, this class was omitted in Android and the algorithms we desired// were provided in org.bouncycastle.jcajce.provider.digest.SHA1.  During that// time, Android added some additional versions of these algorithms for fixed key sizes.// BC eventually consolidated the algorithms into this class.  As a result, when// upgrading to BC 1.56, we added this class but replaced its contents with// our versions.// BEGIN Android-removed: Bouncy Castle versions of algorithms./*provider.addAlgorithm("AlgorithmParameters.PBKDF2", PREFIX + "$AlgParams");provider.addAlgorithm("Alg.Alias.AlgorithmParameters." + PKCSObjectIdentifiers.id_PBKDF2, "PBKDF2");provider.addAlgorithm("SecretKeyFactory.PBKDF2", PREFIX + "$PBKDF2withUTF8");provider.addAlgorithm("Alg.Alias.SecretKeyFactory.PBKDF2WITHHMACSHA1", "PBKDF2");provider.addAlgorithm("Alg.Alias.SecretKeyFactory.PBKDF2WITHHMACSHA1ANDUTF8", "PBKDF2");provider.addAlgorithm("Alg.Alias.SecretKeyFactory." + PKCSObjectIdentifiers.id_PBKDF2, "PBKDF2");provider.addAlgorithm("SecretKeyFactory.PBKDF2WITHASCII", PREFIX + "$PBKDF2with8BIT");provider.addAlgorithm("Alg.Alias.SecretKeyFactory.PBKDF2WITH8BIT", "PBKDF2WITHASCII");provider.addAlgorithm("Alg.Alias.SecretKeyFactory.PBKDF2WITHHMACSHA1AND8BIT", "PBKDF2WITHASCII");provider.addAlgorithm("SecretKeyFactory.PBKDF2WITHHMACSHA224", PREFIX + "$PBKDF2withSHA224");provider.addAlgorithm("SecretKeyFactory.PBKDF2WITHHMACSHA256", PREFIX + "$PBKDF2withSHA256");provider.addAlgorithm("SecretKeyFactory.PBKDF2WITHHMACSHA384", PREFIX + "$PBKDF2withSHA384");provider.addAlgorithm("SecretKeyFactory.PBKDF2WITHHMACSHA512", PREFIX + "$PBKDF2withSHA512");provider.addAlgorithm("SecretKeyFactory.PBKDF2WITHHMACSHA3-224", PREFIX + "$PBKDF2withSHA3_224");provider.addAlgorithm("SecretKeyFactory.PBKDF2WITHHMACSHA3-256", PREFIX + "$PBKDF2withSHA3_256");provider.addAlgorithm("SecretKeyFactory.PBKDF2WITHHMACSHA3-384", PREFIX + "$PBKDF2withSHA3_384");provider.addAlgorithm("SecretKeyFactory.PBKDF2WITHHMACSHA3-512", PREFIX + "$PBKDF2withSHA3_512");provider.addAlgorithm("SecretKeyFactory.PBKDF2WITHHMACGOST3411", PREFIX + "$PBKDF2withGOST3411");provider.addAlgorithm("SecretKeyFactory.PBKDF2WITHHMACSM3", PREFIX + "$PBKDF2withSM3");*/// END Android-removed: Bouncy Castle versions of algorithms.// BEGIN Android-added: Android versions of algorithms.provider.addAlgorithm("Alg.Alias.SecretKeyFactory.PBKDF2WithHmacSHA1AndUTF8", "PBKDF2WithHmacSHA1");provider.addAlgorithm("Alg.Alias.SecretKeyFactory.PBKDF2with8BIT", "PBKDF2WithHmacSHA1And8BIT");provider.addAlgorithm("Alg.Alias.SecretKeyFactory.PBKDF2withASCII", "PBKDF2WithHmacSHA1And8BIT");provider.addAlgorithm("SecretKeyFactory.PBKDF2WithHmacSHA1", PREFIX + "$PBKDF2WithHmacSHA1UTF8");provider.addAlgorithm("SecretKeyFactory.PBKDF2WithHmacSHA224", PREFIX + "$PBKDF2WithHmacSHA224UTF8");provider.addAlgorithm("SecretKeyFactory.PBKDF2WithHmacSHA256", PREFIX + "$PBKDF2WithHmacSHA256UTF8");provider.addAlgorithm("SecretKeyFactory.PBKDF2WithHmacSHA384", PREFIX + "$PBKDF2WithHmacSHA384UTF8");provider.addAlgorithm("SecretKeyFactory.PBKDF2WithHmacSHA512", PREFIX + "$PBKDF2WithHmacSHA512UTF8");provider.addAlgorithm("SecretKeyFactory.PBEWithHmacSHA1AndAES_128", PREFIX + "$PBEWithHmacSHA1AndAES_128");provider.addAlgorithm("SecretKeyFactory.PBEWithHmacSHA224AndAES_128", PREFIX + "$PBEWithHmacSHA224AndAES_128");provider.addAlgorithm("SecretKeyFactory.PBEWithHmacSHA256AndAES_128", PREFIX + "$PBEWithHmacSHA256AndAES_128");provider.addAlgorithm("SecretKeyFactory.PBEWithHmacSHA384AndAES_128", PREFIX + "$PBEWithHmacSHA384AndAES_128");provider.addAlgorithm("SecretKeyFactory.PBEWithHmacSHA512AndAES_128", PREFIX + "$PBEWithHmacSHA512AndAES_128");provider.addAlgorithm("SecretKeyFactory.PBEWithHmacSHA1AndAES_256", PREFIX + "$PBEWithHmacSHA1AndAES_256");provider.addAlgorithm("SecretKeyFactory.PBEWithHmacSHA224AndAES_256", PREFIX + "$PBEWithHmacSHA224AndAES_256");provider.addAlgorithm("SecretKeyFactory.PBEWithHmacSHA256AndAES_256", PREFIX + "$PBEWithHmacSHA256AndAES_256");provider.addAlgorithm("SecretKeyFactory.PBEWithHmacSHA384AndAES_256", PREFIX + "$PBEWithHmacSHA384AndAES_256");provider.addAlgorithm("SecretKeyFactory.PBEWithHmacSHA512AndAES_256", PREFIX + "$PBEWithHmacSHA512AndAES_256");provider.addAlgorithm("SecretKeyFactory.PBKDF2WithHmacSHA1And8BIT", PREFIX + "$PBKDF2WithHmacSHA18BIT");// END Android-added: Android versions of algorithms.}}

上面代码注释中的:
provider.addAlgorithm(“Alg.Alias.SecretKeyFactory.” + PKCSObjectIdentifiers.id_PBKDF2, “PBKDF2”);
导致无法通过OID识别。

解决

1.修改系统源码,去掉注释
2.改变证书使用的算法,如果不是自己签发,可以使用三方工具。

参考信息

OID 查询:
https://oid-rep.orange-labs.fr/cgi-bin/
证书转换工具:portecle-1.11。


http://www.mrgr.cn/news/8277.html

相关文章:

  • 《机器学习》 逻辑回归 大批量数据的下采样 <8>
  • Unity 资源 之 Photon Inventory 2 (Game Creator 2)
  • 【面试】jvm栈的大小通过什么参数设置?
  • Java 2.4 - JVM
  • WordPress简约响应式个人博客Kratos主题
  • 通过主成分分析实现检测金融中的异常交易模式
  • 游戏开发设计模式之状态模式
  • arm接口技术一--arm核总结
  • nas挂载到电脑上当文件夹使用(ubuntu 和windows电脑的挂载方式)
  • springboot如何解决跨域问题
  • 【Spring】Spring缺点是DI依赖注入功能依赖反射,影响性能。为什么反射会影响性能?
  • 【机器学习】以KNN为例的交叉验证 网格搜索
  • Java—Arrays api
  • iZotope Ozone 11 Advanced:专业音频制作与母带处理的巅峰之作
  • httpClient与openfeign
  • 联网可视化:引领智能出行新时代
  • day34(8/22)——Docker
  • 硬件寄存器的简单理解
  • harmony next 服务卡片实时刷新
  • docker镜像,ip,端口映射,持久化