• 从keystore(jks)文件中提取私钥


    转自: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—– ");  
       fw.write(encoded);  
       fw.write(" ");  
       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();  
       }  
       }  

  • 相关阅读:
    创业公司新品如何寻求科技媒体的报道?
    DevStore分享:详析消费者十大心理学
    DevStore教你如何玩转饥饿营销?
    iClap分享:如何优雅的在 APP 中实现测试?
    java内部类
    Tostring 的用法
    Java 集合详解
    Java集合浅析
    异常--解析
    is-a 、have-a、和 like-a的区别
  • 原文地址:https://www.cnblogs.com/z1500592/p/10338185.html
Copyright © 2020-2023  润新知