從jks文件中導出私鑰和證書(轉)


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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM