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 提供程序的操作似乎非常不同:
构造函数已更改为空构造函数。配置由“configure”方法加载,因此它必须位于磁盘上的文件中,并且我无法再通过流将其加载到字符串中。
SunPKCS11
如果我们尝试使用反射,则会出现以下警告:
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”,所以我不能为每个智能卡有一个提供商。
这种情况也会发生在其他人身上吗?任何解决方案?