首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java9中的SunPKCS11提供程序

Java9中的SunPKCS11提供程序
EN

Stack Overflow用户
提问于 2017-10-02 08:14:42
回答 2查看 13K关注 0票数 26

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

代码语言:javascript
复制
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,以便对进一步的非法反射访问操作发出警告:所有非法访问操作都将在以后的发布版本中被拒绝。

  • 在Java9中,SunPKCS11提供程序是自动生成的,并且在加密提供程序列表中。它可以从列表中获得并配置。问题是您只能在列表中加载一个PKCS#11提供程序。Java 9文档表示我们可以使用“SunPKCS11 11-”和配置中指定的名称来获得PKCS#11提供程序,但这不是真的。如果我们看看供应商的列表,唯一的一个是"SunPKCS11“,所以我不能让每个智能卡有一个提供者。

这也会发生在别人身上吗?有解决办法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-02 11:16:15

我注意到查看了configure的javadoc

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

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

代码语言:javascript
复制
Provider prototype = Security.getProvider("SunPKCS11");
Provider provider1 = prototype.configure(...);
Provider provider2 = prototype.configure(...);
...

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

代码语言:javascript
复制
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对,就应该能够将配置参数作为字符串传入。(不过,我目前无法测试这一点)。

但是,我在任何地方都找不到这一事实的公开文档,因此它可能会被更改,而且它对于不同的提供者也会有不同的工作方式,即的使用有自己的风险!

票数 24
EN

Stack Overflow用户

发布于 2017-10-02 11:28:42

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

您的问题解决方案似乎是在医生把自己联系起来了。中定义的

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

遵循attribute=value格式的示例配置如下:

代码语言:javascript
复制
name = FooAccelerator
library = /opt/foo/lib/libpkcs11.so
slot = 1

您还可以使用同一链接中的PKCS#11提供程序配置文件中的属性来配置多个提供程序,这些提供程序具有不同的时隙Id和listIndex以及不同的属性。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46521791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档