簡體   English   中英

如何使用Java KeyStore在Windows存儲中加載私鑰

[英]how to load private key in windows store using Java KeyStore

我正在研究這個Java項目,在這里我需要使用提供程序SunMSCAPI從Windows KeyStore加載私鑰,但是我根本不提供任何密碼,我不知道是否需要這樣做。 這是我在做什么的示例測試用例:

public static void main(String[] args) throws Throwable {
    Provider provider = Security.getProvider("SunMSCAPI");
    KeyStore wins=KeyStore.getInstance("Windows-MY", provider);
    wins.load(null, null);
    Enumeration<String> aliases = wins.aliases();
    while (aliases.hasMoreElements()) {
        String alias = (String) aliases.nextElement();
        System.out.println(alias);
        Certificate[] chain = wins.getCertificateChain(alias);
        X509Certificate[] x509 = CERManager.toX509(chain);
        for (int i = 0; i < x509.length; i++) {
            System.out.println(x509[i].getSubjectX500Principal());
        }
        Key key = wins.getKey(alias, "1234".toCharArray());
        System.out.println(key);

    }

}

當我運行此文件時,我得到了一些以前使用Adobe Reader從pfx文件導入的證書,但是我無法獲取與該證書相對應的私鑰,相反,我只會得到null。

關於這個問題有什么幫助嗎? 提前致謝

我想我找到了解決我問題的解決方案。 我嘗試使用這段代碼在Java中導入pfx

private static void importPFX(File pfxFile, char pass[]) throws Exception {
    SunMSCAPI providerMSCAPI = new SunMSCAPI();
    Security.addProvider(providerMSCAPI);
    KeyStore wins=KeyStore.getInstance("Windows-MY", providerMSCAPI);
    wins.load(null, null);
    BouncyCastleProvider bcp = new BouncyCastleProvider();
    Security.addProvider(bcp);
    KeyStore pfx = KeyStore.getInstance("PKCS12","BC");
    pfx.load(new FileInputStream(pfxFile), pass);

    Enumeration<String> aliases = pfx.aliases();
    while (aliases.hasMoreElements()) {
        String alias = (String) aliases.nextElement();
        Certificate[] chain = pfx.getCertificateChain(alias);
        X509Certificate x509[]=new X509Certificate[chain.length];
        for (int i = 0; i < chain.length; i++) {
            x509[i]=(X509Certificate) chain[i];
        }
        X500Name x500name = new JcaX509CertificateHolder(x509[0]).getSubject();
        RDN cn = x500name.getRDNs(BCStyle.CN)[0];

        String commonName = IETFUtils.valueToString(cn.getFirst().getValue());
        PrivateKey pkey = (PrivateKey) pfx.getKey(alias, pass);
        System.out.println(pkey);
        wins.setKeyEntry(commonName, pkey, "1234".toCharArray(), new X509Certificate[]{x509[0]});
        wins.store(null, null);
    }
}

然后,我使用問題中的第一個代碼列出Windows密鑰庫的密鑰和證書,然后我獲得了私鑰。

一個重要的細節,在導入證書和私鑰時,您應該只傳遞用戶證書,而不要傳遞整個鏈。 至少是它對我有用的唯一方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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