JKS文件是一個java中的密鑰管理庫,里面可以放各種密鑰文件,JKS文件的生成這里暫且不說,這里主要是關注如何從JKS文件中將已有的密鑰讀取出來。
下面是兩個java讀取JKS文件中密鑰的方法
當然在看懂下面兩個方法之前要對JKS文件的結構有所了解:
JKS文件就好像一個倉庫,里面可以放很多的東西,這里只存放一類東西就是密鑰,倉庫當然會有一把鎖,防范別人隨便亂拿,這個就是JKS文件的密 碼。里面存放的密鑰也各有不同,每個密鑰都有一個名字(在下面叫別名),一類就密鑰對,一類叫公鑰,一類叫私鑰,密鑰對就是包含公鑰和私鑰的。這里的公鑰 只要你能進入倉庫你就可以隨便查看拿走,私鑰則是有密碼的,只允許有權限的人查看拿走。所以在下面讀取密鑰時也就有點細微的不同之處,對於讀取公鑰只需要 知道JKS文件(倉庫)的密碼就可以了,但是在讀取私鑰時則必須有私鑰的密碼也就是你必須要有權限,在下面你會發現,在讀取私鑰時多了一個參數,對應的就 是私鑰的密碼。
package com.java.security; 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.*; /** * * 從jks文件中導出私鑰和證書 * */ public class ExportKey { private File keystoreFile; private String keyStoreType; private char[] password; private String alias; private File exportedPrivateKeyFile; private File exportedPublicKeyFile; public static KeyPair getKeyPair(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 exportPrivate() throws Exception { KeyStore keystore = KeyStore.getInstance(keyStoreType); KeyPair keyPair = getKeyPair(keystore, alias, password); BASE64Encoder encoder = new BASE64Encoder(); keystore.load(new FileInputStream(keystoreFile), password); PrivateKey privateKey = keyPair.getPrivate(); String encoded = encoder.encode(privateKey.getEncoded()); FileWriter fw = new FileWriter(exportedPrivateKeyFile); fw.write("-----BEGIN PRIVATE KEY-----\n"); fw.write(encoded); fw.write("\n"); fw.write("-----END PRIVATE KEY-----"); fw.close(); } public void exportCertificate() throws Exception { KeyStore keystore = KeyStore.getInstance(keyStoreType); BASE64Encoder encoder = new BASE64Encoder(); keystore.load(new FileInputStream(keystoreFile), password); Certificate cert = keystore.getCertificate(alias); String encoded = encoder.encode(cert.getEncoded()); FileWriter fw = new FileWriter(exportedPublicKeyFile); fw.write("-----BEGIN CERTIFICATE-----\n"); fw.write(encoded); fw.write("\n"); fw.write("-----END CERTIFICATE-----"); fw.close(); } public static void main(String args[]) throws Exception { ExportKey export = new ExportKey(); export.keystoreFile = new File("/home/rain/test.jks"); export.keyStoreType = "JKS"; export.password = "123456".toCharArray(); export.alias = "test"; export.exportedPrivateKeyFile = new File("/home/rain/key/exported-pkcs8.key"); export.exportedPublicKeyFile = new File("/home/rain/key/exported-public.key"); export.exportPrivate(); export.exportCertificate(); } }