ssl 如何使用Android上的密钥库创建证书签名请求?

sirbozc5  于 2022-12-29  发布在  Android
关注(0)|答案(3)|浏览(173)

我正在使用KeyStore API在Android应用程序中生成SSL密钥对。我希望根据公钥/私钥对创建证书签名请求(CSR),以便将其发送到外部CA进行签名。
这是可能的吗?如果可能的话,我想使用内置的Android库而不是BouncyCastle,以便让Android安全地存储密钥。

yqlxgs2m

yqlxgs2m1#

Certificate enrollment process
检查这个链接。它生成密钥对和CSR。关于在Android手机上生成CSR(证书签名请求),我认为使用Spongycastle代替是相当直接的。它是Bouncycastle的Android端口。

mqkwyuun

mqkwyuun2#

您可以使用Bouncy Castle来使用Android KeyStore中的密钥。这并不意味着您必须将Bouncy Castle设置为安全提供程序。包含库就足够了:

implementation 'org.bouncycastle:bcpkix-jdk18on:1.72'

注:海绵城堡已过时。标准Bouncy Castle库必须包含在您的Android应用程序中。有关原因的详细信息,请参阅:https://github.com/rtyley/spongycastle/issues/34

val keyPairGenerator: KeyPairGenerator = KeyPairGenerator.getInstance(
    KeyProperties.KEY_ALGORITHM_EC,
    "AndroidKeyStore"
)
val keySpecBuilder = KeyGenParameterSpec.Builder(
    Constants.clientCertificateKeyAlias,
    KeyProperties.PURPOSE_SIGN or KeyProperties.PURPOSE_VERIFY
).setDigests(KeyProperties.DIGEST_NONE, KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512)
keyPairGenerator.initialize(keySpecBuilder.build())
val pair = keyPairGenerator.generateKeyPair()

val p10Builder: PKCS10CertificationRequestBuilder = JcaPKCS10CertificationRequestBuilder(
    X500Principal("CN=My Client Certificate"), pair.public
)
val csBuilder = JcaContentSignerBuilder("SHA256withECDSA")
val signer: ContentSigner = csBuilder.build(pair.private)
val csr: PKCS10CertificationRequest = p10Builder.build(signer)

val pemObject = PemObject("CERTIFICATE REQUEST", csr.encoded)
val csrAsString = csrAsStringingWriter()
val pemWriter = PEMWriter(csrAsString)
pemWriter.writeObject(pemObject)
pemWriter.close()
csrAsString.close()
Log.v("CSR", "CSR: $csrAsString")
4urapxun

4urapxun3#

由于Android应用程序是使用Java构建的,因此您可以使用Java keytool工具生成CSR:从CA请求签名证书。

相关问题