JKS文件是一個java中的密鑰管理庫,里面可以放各種密鑰文件,JKS文件的生成這里暫且不說,這里主要是關注如何從JKS文件中將已有的密鑰讀取出來。
下面是兩個java讀取JKS文件中密鑰的方法
當然在看懂下面兩個方法之前要對JKS文件的結構有所了解:
JKS文件就好像一個倉庫,里面可以放很多的東西,這里只存放一類東西就是密鑰,倉庫當然會有一把鎖,防范別人隨便亂拿,這個就是JKS文件的密碼。里面存放的密鑰也各有不同,每個密鑰都有一個名字(在下面叫別名),一類就密鑰對,一類叫公鑰,一類叫私鑰,密鑰對就是包含公鑰和私鑰的。這里的公鑰只要你能進入倉庫你就可以隨便查看拿走,私鑰則是有密碼的,只允許有權限的人查看拿走。所以在下面讀取密鑰時也就有點細微的不同之處,對于讀取公鑰只需要知道JKS文件(倉庫)的密碼就可以了,但是在讀取私鑰時則必須有私鑰的密碼也就是你必須要有權限,在下面你會發現,在讀取私鑰時多了一個參數,對應的就是私鑰的密碼。



import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
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.CertificateException;

import javax.security.cert.Certificate;


public class JKSTesting
{
public static PublicKey getPublicKey(String keyStoreFile,

String storeFilePass, String keyAlias)
{

// 讀取密鑰是所要用到的工具類
KeyStore ks;

// 公鑰類所對應的類
PublicKey pubkey = null;

try
{

// 得到實例對象
ks = KeyStore.getInstance("JKS");
FileInputStream fin;

try
{

// 讀取JKS文件
fin = new FileInputStream(keyStoreFile);

try
{
// 讀取公鑰
ks.load(fin, storeFilePass.toCharArray());
java.security.cert.Certificate cert = ks
.getCertificate(keyAlias);
pubkey = cert.getPublicKey();

} catch (NoSuchAlgorithmException e)
{
e.printStackTrace();

} catch (CertificateException e)
{
e.printStackTrace();

} catch (IOException e)
{
e.printStackTrace();
}

} catch (FileNotFoundException e)
{
e.printStackTrace();
}

} catch (KeyStoreException e)
{
e.printStackTrace();
}
return pubkey;
}


/** *//**
* 得到私鑰
*
* @param keyStoreFile
* 私鑰文件
* @param storeFilePass
* 私鑰文件的密碼
* @param keyAlias
* 別名
* @param keyAliasPass
* 密碼
* @return
*/
public static PrivateKey getPrivateKey(String keyStoreFile,

String storeFilePass, String keyAlias, String keyAliasPass)
{
KeyStore ks;
PrivateKey prikey = null;

try
{
ks = KeyStore.getInstance("JKS");
FileInputStream fin;

try
{
fin = new FileInputStream(keyStoreFile);

try
{

try
{
ks.load(fin, storeFilePass.toCharArray());
// 先打開文件
prikey = (PrivateKey) ks.getKey(keyAlias, keyAliasPass
.toCharArray());
// 通過別名和密碼得到私鑰

} catch (UnrecoverableKeyException e)
{
e.printStackTrace();

} catch (CertificateException e)
{
e.printStackTrace();

} catch (IOException e)
{
e.printStackTrace();
}

} catch (NoSuchAlgorithmException e)
{
e.printStackTrace();
}

} catch (FileNotFoundException e)
{
e.printStackTrace();
}

} catch (KeyStoreException e)
{
e.printStackTrace();
}
return prikey;
}


public static void main(String[] args)
{
PublicKey publicKey;
PrivateKey privateKey;
publicKey=getPublicKey("C:\\aaa.jks","AAAAAAAA", "ibmwebspheremq");
privateKey=getPrivateKey("C:\\aaa.jks","AAAAAAAA", "ibmwebspheremq","AAAAAAAA");
System.out.println(publicKey.toString());
System.out.println(privateKey.toString());
}
}