博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
从keystore(jks)文件中提取私钥
阅读量:4501 次
发布时间:2019-06-08

本文共 2814 字,大约阅读时间需要 9 分钟。

转自:https://zhlj11.iteye.com/blog/2260918

 

JKS文件是使用keytool生成的keystore文件,存放私钥和证书。但是我们用keytool的时候,私钥并没有单独生成出来。这个不利于我们后期的一些扩展工作。所以,我们需要把私钥从keytool中提取出来。

 

经过研究,确认如下两种方法是可靠的。

 

方案1:

使用OpenSSL工具来完成
1、从JKS转换到PKCS12
D:\ssl>keytool -importkeystore -srckeystore keystore_old.jks -destkeystore keystore_old.p12 -srcstoretype JKS -deststoretype PKCS12 -srcstorepass changeit -deststorepass changeit -srcalias tom_server -destalias xxx -srckeypass changeit -destkeypass changeit -noprompt
2、从PKCS12转换成PEM格式
openssl pkcs12 -in keystore_old.p12 -out keystore_old.pem -passin pass:changeit -passout pass:changeit
3、用记事本打开PEM格式文件,从PEM格式的certificate chain中取出私钥,保存为privateKey.key
4、生成私钥
openssl rsa -in privateKey.key -check
私钥将被显示在命令行界面上
方案2:
Keystore是一个密码保护的文件,存放私钥和证书。可以通过JDK自带的keytool工具生成。
但是keytool工具,并没有提供方便的方法,从keystore文件中到处私钥和证书。
所以可以通过JDK提供的java.security.KeyStore 类来编码完成相关工作。
   import java.io.File;  
   import java.io.FileInputStream;  
   import java.io.FileWriter;  
   import java.security.Key;  
   import java.security.KeyPair;  
   import java.security.KeyStore;  
   import java.security.KeyStoreException;  
   import java.security.NoSuchAlgorithmException;  
   import java.security.PrivateKey;  
   import java.security.PublicKey;  
   import java.security.UnrecoverableKeyException;  
   import java.security.cert.Certificate;  
   import sun.misc.*;  
   public class ExportPrivateKey {  
   private File keystoreFile;  
   private String keyStoreType;  
   private char[] password;  
   private String alias;  
   private File exportedFile;  
   public static KeyPair getPrivateKey(KeyStore keystore, String alias, char[] password) {  
   try {  
   Key key=keystore.getKey(alias,password);  
   if(key instanceof PrivateKey) {  
   Certificate cert=keystore.getCertificate(alias);  
   PublicKey publicKey=cert.getPublicKey();  
   return new KeyPair(publicKey,(PrivateKey)key);  
   }  
   } catch (UnrecoverableKeyException e) {  
   } catch (NoSuchAlgorithmException e) {  
   } catch (KeyStoreException e) {  
   }  
   return null;  
   }  
   public void export() throws Exception{  
   KeyStore keystore=KeyStore.getInstance(keyStoreType);  
   BASE64Encoder encoder=new BASE64Encoder();  
   keystore.load(new FileInputStream(keystoreFile),password);  
   KeyPair keyPair=getPrivateKey(keystore,alias,password);  
   PrivateKey privateKey=keyPair.getPrivate();  
   String encoded=encoder.encode(privateKey.getEncoded());  
   FileWriter fw=new FileWriter(exportedFile);  
   fw.write("—–BEGIN PRIVATE KEY—–\n");  
   fw.write(encoded);  
   fw.write("\n");  
   fw.write("—–END PRIVATE KEY—–");  
   fw.close();  
   }  
   public static void main(String args[]) throws Exception{  
   ExportPrivateKey export=new ExportPrivateKey();  
   export.keystoreFile=new File("/Users/Luke/Workspace/StringTest/src/com/lukejin/stringtest/keystore.jks");  
   export.keyStoreType="JKS";  
   export.password="changeit".toCharArray();  
   export.alias="tom_server";  
   export.exportedFile=new File("luke");  
   export.export();  
   }  
   }  

转载于:https://www.cnblogs.com/z1500592/p/10338185.html

你可能感兴趣的文章
一个小时搭建一个全栈 Web 应用框架(下)——美化与功能
查看>>
第七周进度条博客
查看>>
20145316《Java程序设计》第9周学习总结
查看>>
2017年6月9日10:12:40 了解自己才能掌控自己 与 深度学习
查看>>
Android 手机的屏幕分辨率大小汇总
查看>>
PhpStorm修改字体
查看>>
经典的一款jQuery soChange幻灯片
查看>>
response.write不要放到try里去,不然会报一个错误 a instance object什么的
查看>>
Charles 连接手机抓包出现Unknown,一直无法抓包的问题解决
查看>>
快速排序(Quick Sort)的C语言实现
查看>>
VIM-->基础操作汇总
查看>>
oracle cursor
查看>>
Response.StatusCode的HTTP状态代码列表
查看>>
win7下maven安装和配置
查看>>
C# 多线程编程 ThreadStart ParameterizedThreadStart
查看>>
Android Camera Parameters 方法出错,求教
查看>>
一个仿照系统UIAlertView写的提示框
查看>>
Genymotion集成到Eclipse
查看>>
代码简洁之四 统一抽象层次
查看>>
IOS 缩放图片常用方法
查看>>