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

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

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("―CBEGIN PRIVATE KEY―C\n");  

   fw.write(encoded);  

   fw.write("\n");  

   fw.write("―CEND PRIVATE KEY―C");  

   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();  

   }  

   }  

03-15 21:05