Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何提取PKCS12密钥库(包含pkcs#8的密钥对和证书)_Java_Bouncycastle_Keystore_Android Keystore - Fatal编程技术网

Java 如何提取PKCS12密钥库(包含pkcs#8的密钥对和证书)

Java 如何提取PKCS12密钥库(包含pkcs#8的密钥对和证书),java,bouncycastle,keystore,android-keystore,Java,Bouncycastle,Keystore,Android Keystore,当用户提供密钥库时,密钥库通常包含密钥对(RSA加密的私钥,x.509证书)和CA证书。 我想提取keystore的内容并将其写入另一个文件中 我能够读取证书的内容,没有任何问题,但在尝试读取密钥和写入文件时,内容是未加密的形式 如何将私钥文件的内容从自身加密写入 我已获取密钥和证书,如下所示: key = (PrivateKey)keyStore.getKey(keyAlias, password.toCharArray()); cert = keyStore.getCertificate(k

当用户提供密钥库时,密钥库通常包含密钥对(RSA加密的私钥,x.509证书)和CA证书。 我想提取keystore的内容并将其写入另一个文件中

我能够读取证书的内容,没有任何问题,但在尝试读取密钥和写入文件时,内容是未加密的形式

如何将私钥文件的内容从自身加密写入

我已获取密钥和证书,如下所示:

key = (PrivateKey)keyStore.getKey(keyAlias, password.toCharArray());
cert = keyStore.getCertificate(keyAlias);
我还试着使用bouncycastle

使用java库:

PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(key.getEncoded());
byte[] privatekey = encoder.encode(pkcs8EncodedKeySpec.getEncoded());
使用bouncycastle:

 JceOpenSSLPKCS8EncryptorBuilder encryptorBuilder = new JceOpenSSLPKCS8EncryptorBuilder(PKCS8Generator.PBE_SHA1_RC2_128);  
 encryptorBuilder.setRandom(new SecureRandom());  
 encryptorBuilder.setPasssword("abcde".toCharArray()); // password  
 OutputEncryptor encryptor = encryptorBuilder.build();  

 JcaPKCS8Generator gen2 = new JcaPKCS8Generator(key, encryptor);  
 PemObject obj2 = gen2.generate();  
 StringWriter sw2 = new StringWriter();  
 try (JcaPEMWriter pw = new JcaPEMWriter(sw2)) {  
   pw.writeObject(obj2);  
 }  
 String pkcs8Key2 = sw2.toString();  
 FileOutputStream fos2 = new FileOutputStream(privateKeyLocation);  
 fos2.write(pkcs8Key2.getBytes());  
 fos2.flush();  
 fos2.close();  
当使用普通Javalibs时,内容会被解密,我可能希望附加页眉和页脚标记


当使用bouncy castle时,我得到了一些数据,其中包含
----开始加密私钥------
----结束加密私钥------
,但内容与原始文件不同。我还尝试使用不同的PKCS8Gnerator.algorithms,但没有任何用处。

只有私钥的文件有几十种格式,有些是加密的,其中大约一半由BouncyCastle支持。您编写的代码格式PKCS8 encrypted PEM是许多格式中的有效格式。如果因为某种原因不适合,你需要更清楚地知道你想要什么。请注意,任何privatekey-only文件在结构上都与PKCS12(或其他Java密钥库文件)不同,甚至两个相同格式的加密privatekey文件在使用的加密方式上也会有所不同,因为使用了正确的基于密码的加密,即使是简单对称加密也是随机的。我只想读取密钥库中存在的加密私钥,并将其内容写入文件。如果要读取PKCS12中存储的私钥的加密(在“CovertedKeyBag”中),请查看BouncyCastle。如果您想读取不受支持的JKS中存储的私钥加密,并且任何其他软件都无法使用该结果,因为尽管它是PKCS8格式,但它完全是非标准的专有加密。如果您想要的是一个包含私钥加密的文件,但不是相同的加密,那么您的代码已经这样做了。谢谢您的更正,我的代码工作正常。仅私钥文件有几十种格式,一些是加密的,大约一半由BouncyCastle支持。您编写的代码格式PKCS8 encrypted PEM是许多格式中的有效格式。如果因为某种原因不适合,你需要更清楚地知道你想要什么。请注意,任何privatekey-only文件在结构上都与PKCS12(或其他Java密钥库文件)不同,甚至两个相同格式的加密privatekey文件在使用的加密方式上也会有所不同,因为使用了正确的基于密码的加密,即使是简单对称加密也是随机的。我只想读取密钥库中存在的加密私钥,并将其内容写入文件。如果要读取PKCS12中存储的私钥的加密(在“CovertedKeyBag”中),请查看BouncyCastle。如果您想读取不受支持的JKS中存储的私钥加密,并且任何其他软件都无法使用该结果,因为尽管它是PKCS8格式,但它完全是非标准的专有加密。如果您想要的是一个包含私钥加密的文件,但不是相同的加密,那么您的代码已经这样做了。谢谢您的更正,我的代码工作正常。