Java 9中的SunPKCS11提供程序

在Java 8之前,SunPKCS11提供程序是这样加载的:

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

configFile是一个带有配置参数的字符串。 因此,如果应用程序需要与多个连接的智能卡一起工作,它可以创建多个提供程序。 要访问每个提供商,使用的名称是“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文档表明,我们可以使用“SunPKCS11-”获得PKCS#11提供商,后面跟着我们在配置中指出的名称,但事实并非如此。 如果我们查看提供商列表中唯一一个是“SunPKCS11”,所以我不能为每个智能卡提供一个提供商。
  • 这也发生在别人身上吗? 任何解决方案


    我注意到看着javadoc的configure

    将提供的配置参数应用于此提供程序实例并返回配置的提供程序。 请注意,如果此提供程序无法就地配置, 则会创建并返回一个新的提供程序 。 因此,呼叫者应该总是使用返回的提供者。

    这表明在这里使用了原型模式,并且创建多个提供程序的新控制流程如下所示:

    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的参数。 因此,只要您使用--开始字符串,然后使用n分隔您的key=value对,就应该能够将配置参数作为字符串传递。 (我目前还不能测试这个)。

    然而,我无法在任何地方发现这一事实,所以它可能会发生变化,以及它对不同供应商的工作方式会有所不同,例如冒着风险!


    问题是您只能在列表中加载一个PKCS#11提供程序。

    您问题的解决方案似乎在文档链接本身中定义。

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

    格式attribute=value示例配置为:

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

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

    链接地址: http://www.djcxy.com/p/73823.html

    上一篇: SunPKCS11 provider in Java 9

    下一篇: Java encrypting with USB certificates (smart cards)