方案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(); } } |
|