当前位置: 首页 > 知识库问答 >
问题:

Java 9中的SunPKCS11提供程序

卜季萌
2023-03-14

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

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

ConfigFile是包含配置参数的字符串。因此,如果应用程序需要使用多个连接的智能卡,它可以创建多个提供程序。为了访问每个提供程序,使用的名称是“sunpkcs11-”,后面跟我们在配置中指示的名称。

在Java8中,JDK中删除了sun.security.pkcs11.sunpkcs11类。所以,我不得不通过反射对前面的调用进行编程

Java9中PKCS#11提供程序的操作似乎非常不同:

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
  • 在Java9中,会自动生成一个SunPKCS11提供程序,该提供程序位于加密提供程序列表中。可以从列表中获取并进行配置。问题是您只能在列表中加载一个PKCS#11提供程序。Java9文档表明,我们可以使用“sunpkcs11-”和我们在配置中指示的名称来获得PKCS#11提供程序,但事实并非如此。如果我们查看提供商列表,唯一的提供商是“sunpkcs11”,所以我不能每个智能卡都有一个提供商。

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

共有1个答案

弘烨烁
2023-03-14

我注意到在javadoc中查看configure:

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

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

Provider prototype = Security.getProvider("SunPKCS11");
Provider provider1 = prototype.configure(...);
Provider provider2 = prototype.configure(...);
...
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对,就可以将配置参数作为字符串传入。(不过,我目前还不能测试它)。

但是,我在任何地方都找不到这一事实的公开文档,因此它可能会发生变化,而且它对不同的提供商的工作方式也不同,即使用风险自担!

 类似资料:
  • 问题内容: 在Java 8之前,SunPKCS11提供程序的加载方式如下: 是带有配置参数的字符串。因此,如果应用程序需要使用多个连接的智能卡,则可以创建多个提供程序。要访问每个提供程序,使用的名称是“ SunPKCS11-”,后跟我们在配置中指示的名称。 在Java 8中,该类已在JDK中删除。因此,我必须通过反射对上一个调用进行编程。 Java 9中的PKCS#11提供程序的操作似乎非常不同:

  • 我设法让在视窗下与火狐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存在冲突。之后,由于持续不断的循环请求,导致页面崩溃 每次看到“ /”,它都会重新重定向到同一页面,从而