在Java8之前,SunPKCS11提供程序是这样加载的:
Provider provider = new sun.security.pkcs11.SunPKCS11 (new ByteArrayInputStream (configFile.getBytes ()));
Security.addProvider (provider);configFile是一个具有配置参数的字符串。因此,如果应用程序需要与多个连接的智能卡一起工作,它可以创建多个提供者。为了访问每个提供者,使用的名称是“SunPKCS11 11-”,后面是我们在配置中指定的名称。
在Java8中,sun.security.pkcs11.SunPKCS11类在JDK中被删除。所以,我不得不通过反思来安排上一次的通话。
Java9中的PKCS#11提供程序的操作似乎非常不同:
SunPKCS11构造函数已更改为空构造函数。配置是由“配置”方法加载的,因此它必须位于磁盘上的文件中,并且我不能再通过流将其加载到字符串中。警告:出现了非法反射访问操作警告: PruebaTarjeta (文件:/C:/temp/pkcs11java9/classes/)对构造函数sun.security.pkcs11.SunPKCS 11()的非法反射访问:请考虑向PruebaTarjeta的维护人员报告这一情况: Use -非法- access =warn,以便对进一步的非法反射访问操作发出警告:所有非法访问操作都将在以后的发布版本中被拒绝。
这也会发生在别人身上吗?有解决办法吗?
发布于 2017-10-02 11:16:15
我注意到查看了configure的javadoc
将提供的配置参数应用于此提供程序实例,并返回已配置的提供程序。请注意,如果无法就地配置该提供程序,则将创建一个新的提供程序并返回。因此,调用方应始终使用返回的提供程序。
这表明这里正在使用原型模式,用于创建多个提供程序的新控件流如下所示:
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对,就应该能够将配置参数作为字符串传入。(不过,我目前无法测试这一点)。
但是,我在任何地方都找不到这一事实的公开文档,因此它可能会被更改,而且它对于不同的提供者也会有不同的工作方式,即的使用有自己的风险!。
发布于 2017-10-02 11:28:42
问题是您只能在列表中加载一个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和listIndex以及不同的属性。
https://stackoverflow.com/questions/46521791
复制相似问题