当前位置: 首页 > 面试题库 >

Java 9中的SunPKCS11提供程序

裴华荣
2023-03-14
问题内容

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

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

configFile是带有配置参数的字符串。因此,如果应用程序需要使用多个连接的智能卡,则可以创建多个提供程序。要访问每个提供程序,使用的名称是“
SunPKCS11-”,后跟我们在配置中指示的名称。

在Java 8中,sun.security.pkcs11.SunPKCS11该类已在JDK中删除。因此,我必须通过反射对上一个调用进行编程

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文档表明,我们可以得到的PKCS#11提供商,“SunPKCS11-”之后,我们在配置中指示的名字,但事实并非如此。如果我们查看提供商列表,则只有一个是“ 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。因此,只要您使用以开头的字符串,然后使用来分隔成对,就
应该 能够将配置参数作为字符串传递。(不过,我目前无法对此进行测试)。--``key=value``\n

但是,我在任何地方都找不到公开记录的事实,因此它可能会发生变化,并且对不同的提供者也有不同的作用,即 使用风险自负!



 类似资料:
  • 在Java8之前,SunPKCS11提供程序是这样加载的: 是包含配置参数的字符串。因此,如果应用程序需要使用多个连接的智能卡,它可以创建多个提供程序。为了访问每个提供程序,使用的名称是“sunpkcs11-”,后面跟我们在配置中指示的名称。 在Java8中,JDK中删除了类。所以,我不得不通过反射对前面的调用进行编程。 Java9中PKCS#11提供程序的操作似乎非常不同: 在Java9中,会自

  • 我设法让在视窗下与火狐ESR 52.0配合使用,但我无法让它在苹果电脑中加载。我已经尝试了几种不同的配置,并通过直接加载它,但都不起作用,有人能给我一些指针吗? pkcs11。cfg配置如下: 然后在Java中,我尝试这样加载它: 然而,这立即给了我以下错误: 你可能会问我为什么要从奇怪的文件夹中加载,那是因为我在MacOS中使用了将更改为,以便让库依赖项工作(因为我试图在Eclipse中运行它,

  • 我当前的提供商有: 0-提供程序名称:SUN 1-提供程序名称:SUNRSAGN 2-提供程序名称:SunEC ... 9-提供商名称:SunPKCS11 CartaoCidadao 第九个提供者是我尝试使用的提供者,它使用pkcs11库。 使用info方法我可以看到它正在使用库: SunPKCS11 CartaoCidadao使用library/usr/local/lib/libpteidpkc

  • 下面是我的app.js文件 下面是我的状态文件 我有一个模板,我想从那里导航到下一个状态 但是只要我点击这个锚标签,它就会把我导航回主页。(不去我打算去的州)。主要问题是URL(我猜)任何帮助都会很感激。

  • 我已经在文件中添加了所有相关build.gradle依赖项。尽管如此,当我尝试运行调用SOAP服务时,还是会出现以下错误。共享依赖项部分和错误详细信息。使用Java11。网上已经有很多答案,但似乎都不起作用。任何帮助/建议将是值得赞赏的。 低于错误跟踪

  • 问题内容: 我将其他html文件作为模板包含在index.html中。为此,我正在使用ng-view指令。但是我遇到一个错误: 我使用的代码是: 这是控制器: 配置: 这是HTML: 我在哪里想念? 问题答案: 做完了 在大多数情况下,这将是angular-route的冲突,而angularjs存在冲突。之后,由于持续不断的循环请求,导致页面崩溃 每次看到“ /”,它都会重新重定向到同一页面,从而