如何正确重新加载PKCS11 KeyStore

时间:2015-02-19 13:15:09

标签: java keystore pkcs#11

我想在PKCS11密钥库中测试我的密钥。但是当外部进程在商店中添加或删除密钥时,似乎我的密钥库不会更新。

我第二次打印别名时不包含插入其间的新别名。

如何正确重新加载密钥库?

public class KeyStoreTest {

 public static void main(String[] args) throws KeyStoreException,
            NoSuchAlgorithmException, CertificateException, IOException, LoginException{

        // initialize keystore
        InputStream is = CheckUploadScript.class.getResourceAsStream("pkcs11-hsm.config");
        AuthProvider provider = new sun.security.pkcs11.SunPKCS11(is);
        KeyStore ks = KeyStore.getInstance("PKCS11", provider);
        ks.load(null, "0000".toCharArray());

        // print all aliases
        Enumeration<String> aliases = ks.aliases();
        for (String key : Collections.list(aliases))
            System.out.println("alias: " + key);

        // upload or delete keys with external tool here


        // print all aliases again (does not change)
        ks.load(null, "0000".toCharArray());
        aliases = ks.aliases();
        for (String key : Collections.list(aliases))
            System.out.println("alias: " + key);
    }
}

修改

我按照PKCS11参考中的说明操作: http://docs.oracle.com/javase/7/docs/technotes/guides/security/p11guide.html

char[] pin = ...; 
KeyStore ks = KeyStore.getInstance("PKCS11");
ks.load(null, pin);

根据我的理解,当使用PKCS11密钥库时,安全提供程序会处理密钥的存储和加载。因此,在加载密钥库时,我不必指定InputStream。

2 个答案:

答案 0 :(得分:0)

尝试明确加载

KeyStore keyStore = KeyStore.getInstance("PKCS11", provider); keyStore.load(trustStore, trustStorePassword); trustStore.close();

答案 1 :(得分:0)

对于PKCS11信任库,KeyStore.getInstance的InputStream参数必须(可能应该)为null。它没有被使用,所以没有文件可以关闭。