Keystore是一个密码保护的文件,存放私钥和证书。可以通过JDK自带的keytool工具生成。
但是keytool工具,并没有提供方便的方法,从keystore文件中到处私钥和证书。
所以可以通过JDK提供的java.security.KeyStore 类来编码完成相关工作。
参见:
http://www.anandsekar.com/2006/01/19/exporting-the-private-key-from-a-jks-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.BASE64Encoder; 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(args[0]); export.keyStoreType=args[1]; export.password=args[2].toCharArray(); export.alias=args[3]; export.exportedFile=new File(args[4]); export.export(); } }