如何让BouncyCastle的JcaPEMWriter生成PKCS#8格式私钥?
让JcaPEMWriter输出PKCS#8格式私钥的方法
当然可以搞定!你现在的代码输出PKCS#1格式(带-----BEGIN RSA PRIVATE KEY-----标识)是因为JcaPEMWriter默认会根据RSA私钥的类型自动适配专用格式。要切换到通用的PKCS#8格式(-----BEGIN PRIVATE KEY-----),只需要用BouncyCastle的PrivateKeyInfo类把私钥包装一下就行,这是最直接的方式。
下面是修改后的完整代码:
import org.bouncycastle.asn1.pkcs.PrivateKeyInfo; import org.bouncycastle.openssl.jcajce.JcaPEMWriter; import java.io.StringWriter; import java.security.KeyPair; import java.security.KeyPairGenerator; public static void main(String[] args) throws Exception { // 生成RSA密钥对的逻辑不变 final KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); kpg.initialize(2048, null); final KeyPair kp = kpg.generateKeyPair(); final PrivateKey privateKey = kp.getPrivate(); // 关键步骤:用PrivateKeyInfo包装私钥,指定PKCS#8格式 PrivateKeyInfo pkcs8KeyInfo = PrivateKeyInfo.getInstance(privateKey.getEncoded()); final StringWriter s = new StringWriter(); try (JcaPEMWriter w = new JcaPEMWriter(s)) { // 写入包装后的PrivateKeyInfo对象 w.writeObject(pkcs8KeyInfo); } System.out.println(s); }
简单解释下原理:
- PKCS#1是RSA私钥的专属格式,而PKCS#8是通用私钥容器,能兼容所有类型的非对称私钥(比如ECDSA、DSA等)。
PrivateKeyInfo是BouncyCastle中对应PKCS#8标准的ASN.1结构实现,当你把它传给JcaPEMWriter时,Writer会自动识别并输出标准的PKCS#8格式内容,标识就是-----BEGIN PRIVATE KEY-----。
你也可以试试另一种方式:直接把私钥转换成PKCS8EncodedKeySpec再生成私钥对象,但上面的方法更简洁,因为它直接利用了BouncyCastle的内置处理,不用自己手动处理编码转换的细节。
运行修改后的代码,就能得到你想要的PKCS#8格式私钥啦~
内容的提问来源于stack exchange,提问作者Simon Kissane
相关产品推荐
相关产品推荐

