簡體   English   中英

確定密鑰庫類型是 pkcs12 還是 jks(以編程方式)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM