[英]Determine if keystore type is pkcs12 or jks (programmatically)
有沒有一種簡單的方法來確定java中的密鑰庫類型? 密鑰庫文件沒有擴展名,但我知道它可能是 jks 或 pkcs12。
目前我正在使用這樣的東西:
public static boolean isJks(File f) throws Exception{
KeyStore ks = null;
FileInputStream fis = null;
try {
fis = new FileInputStream(f);
ks = KeyStore.getInstance("jks");
ks.load(fis, null);
return true;
} catch (IOException e) {
if(fis != null){
fis.close();
}
fis = new FileInputStream(f);
ks = KeyStore.getInstance("pkcs12");
ks.load(fis, null);
return false;
} finally {
if(fis != null){
fis.close();
}
}
}
有沒有更簡單的方法來做到這一點? 如果不是,那么這是要走的路還是應該改進?
您可以按照此答案中的說明進行操作。 基本上,對於 JKS 密鑰庫,您可以檢查文件開頭幾個字節的幻數。 預期的魔法值為0xFEEDFEED
。 對於 PKCS12,這不是一件容易的事情,但是您可以檢查文件是否為 ASN1 結構,盡管可能存在基於 ASN1 的其他文件格式,因此您加載密鑰庫的方法實際上可能是更好的方法。
對於將來遇到這個問題的人來說,這可能值得一提。 如果您只需要知道 KeyStore 類型才能加載它,那么在JDK-8062552 之后更容易。 您可以簡單地將類型指定為 JKS,這將允許您加載 JKS 和 PKCS12 密鑰庫。 請參閱下面的示例:
private KeyStore loadKeyStore(String file, String password) {
KeyStore keyStore;
try (FileInputStream inputStream = new FileInputStream(file)) {
keyStore = KeyStore.getInstance("JKS");
keyStore.load(inputStream, password.toCharArray());
} catch (IOException | CertificateException | NoSuchAlgorithmException | KeyStoreException e) {
throw new RuntimeException(e);
}
return keyStore;
}
但是,如果您像這樣加載 KeyStore, keystore.getType()
將始終返回JKS
。 因此,即使現在您可以讀取 KeyStore,您仍然不知道它的類型是什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.