gpt4 book ai didi

java - 是否可以在没有 P12 的情况下向 Android 上的 KeyChain 添加私钥 + 证书?

转载 作者:行者123 更新时间:2023-12-02 13:41:24 24 4
gpt4 key购买 nike

以下代码允许我将 PKCS12 文件添加到 KeyChain 效果很好:

val pkcs12Bytes = pkcs12Location.readBytes()
val installIntent = KeyChain.createInstallIntent()
installIntent.putExtra(KeyChain.EXTRA_PKCS12, pkcs12Bytes)
startActivity(installIntent)
但是,出于安全原因,我希望将私钥和证书添加到 KeyChain无需在设备上存储 P12。私钥由 keyGen.generateKeyPair() 创建后存储在内存中.
这是我在使用 P12 实现时得到的弹出窗口(注意“一个用户 key ”):
enter image description here

到目前为止,我已经能够将证书添加到 KeyChain使用此代码
val installIntent = KeyChain.createInstallIntent()
installIntent.putExtra(KeyChain.EXTRA_CERTIFICATE, x509Certificate)
startActivity(installIntent)
但我找不到将私钥包含在 the documentation 中的方法.是否可以在没有 P12 的情况下将私钥 + 证书添加到 Android 上的钥匙串(keychain)?
这是我在使用证书实现时得到的弹出窗口(仅注意证书):
enter image description here

最佳答案

有了创意之后,答案是有点。
似乎不可能完全绕过 KeyChain.EXTRA_PKCS12方法,但我确实找到了一种将 P12 存储在内存中的方法,这样它就不会存储在 Android 的文件系统中。这种方式比将其存储在文件系统上更安全,但仍然不如我们能够将私钥和证书直接添加到 KeyChain 中那样安全。 .
这是我用来在内存中而不是在文件系统上创建 PKCS12 的方法:

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;

public static byte[] createPKCS12InMemory(byte[] x509AsPEM, PrivateKey privKey, String pkcs12Password) throws KeyStoreException, CertificateException, NoSuchAlgorithmException, IOException {
InputStream stream = new ByteArrayInputStream(x509AsPEM);
CertificateFactory fact = CertificateFactory.getInstance("X.509");
X509Certificate cert = (X509Certificate) fact.generateCertificate(stream);
KeyStore pkcs12 = KeyStore.getInstance("PKCS12");
pkcs12.load(null, null);
pkcs12.setKeyEntry("device_certificate", privKey, pkcs12Password.toCharArray(), new Certificate[] {cert});
ByteArrayOutputStream p12 = new ByteArrayOutputStream();
pkcs12.store(p12, pkcs12Password.toCharArray());
return p12.toByteArray();
}
一旦您将 PKCS12 作为内存中的字节,您可以将其直接传递到 installIntent ,实际上永远不会在文件系统上存储 p12!

关于java - 是否可以在没有 P12 的情况下向 Android 上的 KeyChain 添加私钥 + 证书?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63180430/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com