Java 如何正确重新加载PKCS11密钥库

Java 如何正确重新加载PKCS11密钥库,java,keystore,pkcs#11,Java,Keystore,Pkcs#11,我想在PKCS11密钥库中测试我的密钥。但是,当外部进程在存储区中添加或删除密钥时,我的密钥库似乎没有更新 第二次打印别名时,不包括插入其间的新别名 如何正确地重新加载密钥库 public class KeyStoreTest { public static void main(String[] args) throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOExcep

我想在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密钥库时,安全提供程序负责密钥的存储和加载。因此,在加载密钥库时,我不必指定InputStream。

尝试显式加载它

keystorekeystore=KeyStore.getInstance(“PKCS11”,提供者);
加载(信任库、信任库密码);

trustStore.close()

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

很抱歉,如果密钥存储库是用
ks.load(null,“0000.tocharray())新初始化的,那么另一个进程如何修改密钥存储库并且从未存储到磁盘?在我看来,密钥库只存在于堆中。我使用一个HSM模拟器,它将密钥存储在磁盘的某个地方。HSM模拟器提供命令行工具来操作密钥库。我还可以使用上述实现存储新密钥
ks.setEntry
,这些密钥可以通过命令行工具立即使用。只有当我加载java中的密钥库并使用命令行工具上载新密钥时,java中的密钥库才不会获取新密钥。
char[] pin = ...; 
KeyStore ks = KeyStore.getInstance("PKCS11");
ks.load(null, pin);