近日,从合作方拿到一个rsa的字符串私钥,但是程序中需要使用pfx格式的文件,
所以需要转化格式,通过咨询,合作方是通过如下方法得到私钥的:
private JSONObject RsaKeyGet() throws Exception{
JSONObject obj = new JSONObject();
Map<String, Object> keyMap = RSAUtils.genKeyPair();
String publicKey = RSAUtils.getPublicKey(keyMap);
String privateKey = RSAUtils.getPrivateKey(keyMap);
obj.put("publicKey", publicKey);
obj.put("privateKey", privateKey);
return obj;
}
————————————————————————————————
public static Map<String, Object> genKeyPair() throws Exception {
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);
keyPairGen.initialize(1024);
KeyPair keyPair = keyPairGen.generateKeyPair();
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
Map<String, Object> keyMap = new HashMap<String, Object>(2);
keyMap.put(PUBLIC_KEY, publicKey);
keyMap.put(PRIVATE_KEY, privateKey);
return keyMap;
}
——————————————————————————————————
我们的做法如下:
1.将字符串修改成openssl所需格式
private static final String PRIVATE_KEY="MIICdwIBA。。。3DP4=";
我们是通过 openssl genrsa -out my.key 1024 命令观察输入的格式是怎么样的,如下
openssl genrsa -out my.key 1024
[root@redis3 tmp]# cat my.key
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQCZJEBcW0vcZ0NRKpDIb0nXe1bJ+DeJfHAlnVQAraQxBih8rTKQ
pfoPacBhmtE/jono/iM9ebKvBYGOodjWlTHHpU0Cc9V4KLoYLVY5RmMUZGB+uMWL
XUYRVzuSZJGi11x5Bcxy+eic0tdKynaZoKtcKQeRpMgGynDsdGsTuAev9wIDAQAB
AoGAT/U3jYE1iKx532UkFyLUISgK1oU9KhHI1Dri4z/GXLpkZURhBFlEyMtkYRHe
cxrPMtGOQMjL3Mo5LOmgN9nKFS6LjeWBgNM9esOaeEuLMBO5ej8mCQ7A+ohoeIgY
J2SyZavmS64g4Q5Y3LVqOjnIUKDUThAh4qbw61z950BTDJECQQDLEYBsYrqqlcWX
xQl0jadZfa+hX2acEybAT2UWx2eKjrtdcapGUFq05a/HvHsKdHtHoySVXisb7JbC
bQzNuo3LAkEAwQ8zE7URdXnhXfDcOM/oUJ3JDoJJhw2HijJUtj2hFg5ZC4OPnW43
+lkBkG76gt0CHpGMIoWA8Mpu/4kTRdthBQJAXa8eW2KVEbv1I9awTQhJC51TmJRl
x12ChDhcv8yQ9ThyMmMNFlFd95T7qp9G+ITSlzMp3otKQiC9UMd0n7kQTwJBAKdh
ejM35W8owJAl54kKGKzsYAjIRN9mh4D1qiRmwmbRAbrN0ZH4oWfYC1ciIOecnd3K
6uhzPxuFJz89pQwH69ECQQC32YsAcogYw5Ue5ViJfYHiW0yJ5iLm6rF2a8YPAQyD
GSZXcY64gOuw0VdrDHj+09FEe0OfaJSp3iIRkw2gDt4o
-----END RSA PRIVATE KEY-----
每行64个base64编码的字符,最后剩余的成一行
前面用-----BEGIN RSA PRIVATE KEY-----开头
后面用-----END RSA PRIVATE KEY-----结尾
保存成文件ssl.key
2.然后使用key文件生成证书请求文件
openssl req -new -key ssl.key -out ssl.csr
3生成crt证书文件,这里需要填写相应信息,国家 地区 城市 公司 部门 个人 等信息,密码可以不填写
openssl x509 -req -days 3650 -in ssl.csr -signkey ssl.key -out ssl.crt
4生成我们需要的pfx文件,这里输入密码,保护安全
openssl pkcs12 -export -inkey ssl.key -in ssl.crt -out ssl.pfx
验证:反向提取rsa私钥
1.获取pem格式明文信息
openssl pkcs12 -in ssl.pfx -nodes -out ssl.pem
2.提取私钥
openssl rsa -in ssl.pem -out ssl.key
3.按照pkcs8模式补足,输出的明文就是我们的私钥
openssl pkcs8 -topk8 -inform PEM -in ssl.key -outform PEM -nocrypt
只要保证刚开始的秘钥和最后得到的秘钥是同一个,基本就没有错了!