java.security.NoSuchAlgorithmException:PKCS11 KeyStore不可用,尝试在Java 11中使用SUNPKCS11启用FIPS模式

时间:2018-11-20 16:55:51

标签: java fips java-11 nss sunpkcs11

我试图在Java 11中使用SUNPKCS11和NSS启用FIPS模式。我遇到了此异常 java.security.NoSuchAlgorithmException:PKCS11 KeyStore不可用。

当我尝试在 Java 8 中启用FIPS时,效果很好,但是在 Java 11 中执行相同操作会抛出异常。

SUNPKCS11的初始化从Java 8更改为Java 11。

在Java 8中:

  Provider provider = Security.getProvider("SunPKCS11");      
  provider.configure(nssConfigFile);

Java 11:

  Provider provider = new sun.security.pkcs11.SunPKCS11(nssConfigFile);
  Security.addProvider(nssProvider);

使用配置文件初始化SUNPKCS11之后,我正尝试从密钥库中获取提供程序,如下所示。
还有一件事是,当我初始化SUNPKCS11时,将 Provider.id.info 设置为 未配置且无法使用的PKCS11提供程序,这是否与某件事有关?

KeyStore.getInstance("SUNPKCS11");

然后在这里我的密钥库中没有PKCS11。

我的配置文件内容如下:

  name=nss-client   
  nssLibraryDirectory=X:\XXX\NSS\lib\   
  nssSecmodDirectory=X:\XXX\NSS\db\   
  nssModule=fips

我是否需要更改配置文件内容,还是Java 11中的错误?

请帮我提出宝贵的建议。

1 个答案:

答案 0 :(得分:1)

好的-关于原始问题的评论之一包含了解决方案。所以,我在这里重新记录它。

看来provider.configure(..)方法返回的是 new Provider,而不是对原始provider进行突变。考虑到这一点,您可以改为执行以下操作:

Provider oldProvider = Security.getProvider("SunPKCS11");
Provider newProvider = oldProvider.configure("yubihsm.conf");
Security.addProvider(newProvider);

// Hooray!  This works now!
KeyStore ks = KeyStore.getInstance("pkcs11");