如何使用Java将PEM格式RSA私钥转换为DER格式
Java实现RSA私钥格式转换(等价指定OpenSSL命令效果)
转换逻辑说明
你使用的OpenSSL命令openssl pkcs8 -topk8 -inform PEM -outform DER -in secret.pem -nocrypt secret.key,核心是完成以下操作:
- 输入为PEM编码的PKCS#1格式RSA私钥(即你持有的头尾标注
-----BEGIN RSA PRIVATE KEY-----的文件内容) - 将私钥结构转换为标准PKCS#8格式
- 不对私钥做加密处理,最终输出DER二进制编码的私钥文件
可直接运行的实现方案
Java原生API没有直接解析PKCS#1格式PEM私钥的能力,推荐使用加密领域常用的BouncyCastle库实现,转换结果和OpenSSL命令输出完全一致。
第一步:引入依赖
如果使用Maven管理项目,添加以下依赖即可(Gradle等其他构建工具可自行调整对应坐标):
<dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcpkix-jdk15on</artifactId> <version>1.70</version> </dependency>
第二步:核心转换代码
import org.bouncycastle.openssl.PEMParser; import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter; import java.io.FileReader; import java.nio.file.Files; import java.nio.file.Paths; import java.security.PrivateKey; import java.security.Security; public class RsaPkcs1ToPkcs8Converter { public static void main(String[] args) throws Exception { // 注册BouncyCastle加密提供者 Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); // 读取源PKCS#1 PEM私钥文件,替换为你的实际文件路径 try (PEMParser pemParser = new PEMParser(new FileReader("secret.pem"))) { Object parsedKeyObj = pemParser.readObject(); JcaPEMKeyConverter keyConverter = new JcaPEMKeyConverter().setProvider("BC"); PrivateKey pkcs8PrivateKey = keyConverter.getPrivateKey( (org.bouncycastle.asn1.pkcs.RSAPrivateKey) parsedKeyObj ); // 获取PKCS#8 DER格式的私钥字节数组 byte[] derOutputBytes = pkcs8PrivateKey.getEncoded(); // 写入目标文件,输出结果与OpenSSL命令生成的secret.key完全一致 Files.write(Paths.get("secret.key"), derOutputBytes); } } }
结果校验
代码运行生成secret.key后,可将其与OpenSSL命令生成的同内容文件做哈希校验,二者MD5/SHA值完全一致即证明转换正确。
注意:如果不想引入第三方依赖,需要手动实现ASN.1结构编码逻辑来拼接PKCS#8头和PKCS#1私钥内容,代码冗余度高且容易出现兼容问题,生产环境不推荐使用。
内容的提问来源于stack exchange,提问作者Jean Khechfe
相关产品推荐
相关产品推荐

