Java 9中的SunPKCS11提供程序

时间:2017-10-02 08:14:42

标签: java java-9 pkcs#11 sunpkcs11

在Java 8之前,SunPKCS11提供程序的加载方式如下:

Provider provider = new sun.security.pkcs11.SunPKCS11 (new ByteArrayInputStream (configFile.getBytes ()));
Security.addProvider (provider);

configFile是带有配置参数的String。因此,如果应用程序需要使用多个连接的智能卡,它可以创建多个提供程序。要访问每个提供商,使用的名称是" SunPKCS11 - "然后是我们在配置中指明的名称。

在Java 8中,JDK中删除了sun.security.pkcs11.SunPKCS11类。所以,我不得不通过反思来编写前一个调用。

Java 9中PKCS#11提供程序的操作似乎非常不同:

  • SunPKCS11构造函数已更改为空构造函数。配置由" configure"加载。方法,所以它必须在磁盘上的文件中,我不能再通过流加载到字符串。

  • 如果我们尝试使用反射,则会出现以下警告:

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by PruebaTarjeta (file:/C:/temp/pkcs11java9/classes/) to constructor
sun.security.pkcs11.SunPKCS11()
WARNING: Please consider reporting this to the maintainers of PruebaTarjeta
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
  • 在Java 9中,SunPKCS11提供程序是自动生成的,位于加密提供程序列表中。它可以从列表中获取并进行配置。问题是您只能在列表中加载一个PKCS#11提供程序。 Java 9 documentation表示我们可以通过" SunPKCS11 - "获得PKCS#11提供商。接下来是我们在配置中指出的名称,但它不是真的。如果我们查看提供商列表,唯一的一个是" SunPKCS11"所以我不能为每张智能卡提供一个提供商。

这也发生在其他人身上吗?任何解决方案?

2 个答案:

答案 0 :(得分:15)

我注意到了configure的javadoc:

  

将提供的配置参数应用于此提供程序实例,并返回已配置的提供程序。请注意,如果无法就地配置此提供商,则将创建并返回新的提供商。因此,呼叫者应始终使用返回的提供者。

这向我表明此处正在使用prototype pattern,并且用于创建多个提供者的新控制流将类似于:

Provider prototype = Security.getProvider("SunPKCS11");
Provider provider1 = prototype.configure(...);
Provider provider2 = prototype.configure(...);
...

至于直接使用参数而不是文件名,我做了一些挖掘源代码并在sun.security.pkcs11.Config中找到了这个:

Config(String fn) throws IOException {
    this.filename = fn;
    if (filename.startsWith("--")) {
        // inline config
        String config = filename.substring(2).replace("\\n", "\n");
        reader = new StringReader(config);

请注意filename.startsWith("--")行,此文件名直接来自configure的参数。因此, 能够将配置参数作为字符串传递,只要您使用--启动字符串,然后使用{{1}分隔key=value对。 }。 (我目前无法对此进行测试)。

但是,我无法在任何地方找到公开记录的这一事实,因此它可能会发生变化,以及它对不同的提供商有不同的工作方式,即 自担风险使用!

答案 1 :(得分:0)

  

问题是您只能加载一个PKCS#11提供程序   清单。

您问题的解决方案似乎在doc linked itself.

中定义

要为每个PKCS#11实现使用多个插槽,或者要使用多个PKCS#11实现,只需使用相应的配置文件为每个插槽重复安装。此将为每个PKCS#11 实现的每个插槽生成一个Sun PKCS#11提供程序实例。

格式为 attribute=value 的示例配置为:

name = FooAccelerator
library = /opt/foo/lib/libpkcs11.so
slot = 1

您可以在同一链接中进一步使用PKCS#11提供程序配置文件中的属性来配置具有不同插槽ID和listIndex以及不同属性的多个提供程序。