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

带有opensc pkcs#11提供程序的java keytool仅在启用调试选项的情况下工作

景宏盛
2023-03-14
问题内容

我在使用OpenJDK的ubuntu 11.10上运行了最新的opensc 0.12.2(java版本“ 1.6.0_22”)

我可以通过阅读我的智能卡(Feitian ePass PKI)

pkcs15-tool --dump

现在,我尝试将我的智能卡与keytool一起使用:

keytool 
   -providerClass sun.security.pkcs11.SunPKCS11 \
   -providerArg /etc/opensc/opensc-java.cfg \
   -keystore NONE -storetype PKCS11 -list

导致错误:

keytool error: java.security.KeyStoreException: PKCS11 not found
java.security.KeyStoreException: PKCS11 not found
    at java.security.KeyStore.getInstance(KeyStore.java:603)
    at sun.security.tools.KeyTool.doCommands(KeyTool.java:621)
    at sun.security.tools.KeyTool.run(KeyTool.java:194)
    at sun.security.tools.KeyTool.main(KeyTool.java:188)
Caused by: java.security.NoSuchAlgorithmException: PKCS11 KeyStore not available
    at sun.security.jca.GetInstance.getInstance(GetInstance.java:159)
    at java.security.Security.getImpl(Security.java:696)
    at java.security.KeyStore.getInstance(KeyStore.java:600)
    ... 3 more

当我运行启用了调试选项的相同命令时,如下所示:

keytool 
   -providerClass sun.security.pkcs11.SunPKCS11 \
   -providerArg /etc/opensc/opensc-java.cfg \
   -keystore NONE -storetype PKCS11 -list \
   -J-Djava.security.debug=sunpkcs11

它突然起作用:

... debug infos ...
Enter keystore password:  
sunpkcs11: login succeeded

Keystore type: PKCS11
Keystore provider: SunPKCS11-OpenSC

Your keystore contains 2 entries
...
Certificate fingerprint (MD5): ...
...
Certificate fingerprint (MD5): ...

静态配置时的相同行为:

$ grep opensc /usr/lib/jvm/java-6-openjdk/jre/lib/security/java.security
security.provider.7=sun.security.pkcs11.SunPKCS11 /etc/opensc/opensc-java.cfg

和我的配置

$ cat /etc/opensc/opensc-java.cfg
name = OpenSC
description = SunPKCS11 w/ OpenSC Smart card Framework
library = /usr/lib/opensc-pkcs11.so

我的猜测是,它与openjdk或内部软件包有关sun.security,由于它是内部软件包,通常可能不使用它。激活调试选项可能会激活此内部软件包吗?


问题答案:

今天,我遇到了同样的问题,并且挖掘了java的源代码,直到找到了问题的根源。我知道这个问题已经很老了,已经有了一个可以接受的答案,但是那不是一个真正的答案。

基本上,SunPKCS11提供程序会列出所有可用的插槽,然后获取您在配置中指定的插槽,并给出错误信息(因为您未指定任何插槽,并且未指定其默认值)。

在调试时,列出所有可用插槽后,它会列出所有插入了智能卡的插槽。在输出了关于插槽列表的所有这些信息之后, 它会初始化
其slotid变量,从而覆盖您在配置中写入(或忘记写入)的内容。新值是正确的值,因为它是从opensc默认值中读取的。

这是来自openjdk项目的SunPKCS11.java的相关代码:

    long slotID = config.getSlotID();
    // ....
        if ((slotID < 0) || showInfo) {
            long[] slots = p11.C_GetSlotList(false);
            if (showInfo) {
                System.out.println("All slots: " + toString(slots));
                slots = p11.C_GetSlotList(true);
                System.out.println("Slots with tokens: " + toString(slots));
            }
            if (slotID < 0) {
                if ((slotListIndex < 0) || (slotListIndex >= slots.length)) {
                    throw new ProviderException("slotListIndex is " + slotListIndex
                        + " but token only has " + slots.length + " slots");
                }
                slotID = slots[slotListIndex];
            }
        }
        this.slotID = slotID;

因此,一种解决方法是始终在您的配置中包含负值,例如slot = -1,以便提供程序始终寻找正确的值。



 类似资料:
  • 问题内容: 通常,要将调试器附加到正在运行的jvm,您需要使用以下参数启动jvm: 现在,如果我要调试不是在调试模式下启动的进程,该怎么办? 当生产系统(即在没有调试args的情况下启动)显示“随机”(我用宽松的术语)错误时,就会出现这种情况。因此,我无法使用适当的参数重新启动jvm,因为没人知道如何再次再现该错误。在这种情况下是否不可能附加到JVM? 只是为了澄清,除非将它们以调试方式启动,否则

  • 通过参考Pact Repo中给出的示例,我为MessageProvider编写了示例Pact测试。下面是使用者测试,它正在为预期来自提供者的消息生成PACT json文件。 公共类Inbound_Receiving_OpenMessageTest{private byte[]receivingopenloaddetailsmessage; }

  • 从昨天开始,当我在没有调试器的情况下启动应用程序时,它就会挂起。当我调试应用程序时,一切正常。我不知道我是不是应该把代码贴出来我觉得太多了。我正在使用Google Maps API。

  • 我是Quarkus新手,正在使用Eclipse和Quarkus插件。 无论我是手动使用启动还是使用Eclipse夸克启动配置,应用程序似乎总是在运行测试。 我看到了类似的东西 有一段时间什么都没发生,直到我看到Quarkus标志、我的日志消息等。 也许我还没有仔细阅读文档,但我发现没有配置来关闭它并直接在开发模式下启动应用程序。 有人能帮我吗?

  • 问题内容: 如何在Java程序中打开和关闭调试?如何在不重新编译Java程序的情况下打开和关闭调试? 问题答案: 无需使用IDE进行调试 1)您可以使用Assertions编写Java程序。您随时可以启用/禁用它们。 2)您可以使用配置了log4j.properties的日志。在Java程序中,您可以随时指定信息和调试日志,只要您想显示调试或信息日志等信息,就可以在log4j.properties

  • 问题内容: 我有一个MySQL数据库,其中表A与表B具有一对多关系,我想选择表B中表A中没有子项的所有行。 和 两者似乎都很慢。是否有更快的查询来实现相同的目的? 如果这是相关的,在我的数据库中,表A大约有500,000行,表B大约有3到4百万行。 编辑: 对于我的数据库中的实际表,解释给我: 为了 和 为了 在我的情况下,frontend_form471是表A,SchoolData是表B Edi