kotlin 如何更改Android设备上生成的KeyPair的根证书?

1hdlvixo  于 2023-10-23  发布在  Kotlin
关注(0)|答案(1)|浏览(171)

我想在我的Android设备上生成一个KeyPair,该设备具有根证书作为 Google Hardware Attestation Root Certificate
我在Android here上的文档中看到,我可以更改自签名证书
对于非对称密钥对,还将生成自签名X.509证书并存储在Android Keystore中。这是因为KeyStore抽象不支持在没有证书的情况下存储密钥对。证书的主题、序列号和有效期可以在此规范中自定义。自签名证书可以在以后被由证书颁发机构(CA)签名的证书替换。
我可以在这里看到,我可以使用keyStore getCertificateChain()获取与硬件支持的密钥库相关联的X.509证书链
使用KeyStore对象的getCertificateChain()方法获取对与硬件支持的密钥库关联的X.509证书链的引用。
但是,我还没有找到如何使用 *Google硬件认证根证书 * 更改KeyPair上的证书

private fun generateKeyPairAttestationAndGetPublicKey(): String {
     val keyStore = KeyStore.getInstance("AndroidKeyStore")
     val keyPairGenerator = KeyPairGenerator.getInstance(
         KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore"
     )

     keyPairGenerator.initialize(
         KeyGenParameterSpec.Builder(
             "my-mobile-key",
             KeyProperties.PURPOSE_SIGN or KeyProperties.PURPOSE_ENCRYPT
            )
             .setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512)
             .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_OAEP)
             .setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PKCS1)
             .build()
     )
     keyPairGenerator.generateKeyPair()

     keyStore.load(null)
     val keyEntry = keyStore.getEntry("my-mobile-key", null) as KeyStore.PrivateKeyEntry
     val x509Cert = keyEntry.certificate as? X509Certificate ?: throw Exception("Certificate generated by the KeyPair is not a X509Certificate")
}

我怎么能这么做呢?

6mw9ycah

6mw9ycah1#

您是正确的,当在Android Keystore中生成非对称密钥对时,它将自动为该密钥对创建自签名证书。要将其替换为链接到Google硬件认证根的证书,您需要:
1.生成密钥对,就像您在代码段中所做的那样。
1.为生成的私钥获取证书签名请求(CSR):

val privKey = (keyEntry.privateKey as PrivateKey)
val csr = PKCS10CertificationRequest(
    "CN=my-mobile-key", 
    privKey,
    AlgorithmId.SHA256_WITH_RSA_ENCRYPTION 
)

val csrBytes = csr.encoded

1.将CSR发送到您的Google Cloud帐户或第三方CA进行签名。它们将返回链接到硬件证明根的证书。
1.将签名的证书链导入密钥库:

val signedCert = // certificate chain signed by Google CA 

val certEntry = KeyStore.TrustedCertificateEntry(signedCert)
keyStore.setEntry("my-mobile-key", certEntry, null)

现在,当您检索条目时,它将包含Google签名的证书,而不是自签名的证书。
关键部分是获取生成的密钥对的CSR,并将自签名证书替换为Google签名的证书。让我知道这是否有助于解释这个过程!

相关问题