Java Keytool с провайдером opensc pkcs # 11 работает только с включенной опцией отладки - PullRequest
10 голосов
/ 23 ноября 2011

У меня установлена ​​последняя версия opensc 0.12.2, работающая на Ubuntu 11.10 с OpenJDK (Java-версия "1.6.0_22")

Я могу читать свою смарт-карту (PKI Feitian ePass) с

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, который обычно не используется, потому что это внутренний пакет.Активация параметров отладки может активировать этот внутренний пакет?

Ответы [ 3 ]

9 голосов
/ 27 мая 2013

Сегодня у меня возникла та же проблема, и я копался в java-источниках, пока не нашел источник проблемы.Я знаю, что этот вопрос довольно старый и уже имеет принятый ответ, но этот ответ не является реальным.

Обычно поставщик SunPKCS11 перечисляет все доступные слоты, а затем получает слот, указанный в вашей конфигурации.и выдайте ошибку (поскольку вы не указали ни одного слота и не указали его значение по умолчанию).

При отладке после перечисления всех доступных слотов в нем отображаются все слоты с вставленной смарт-картой.Распечатав всю эту информацию о списке слотов, инициализирует своей переменной slotid, перезаписывая то, что вы написали (или забыли написать) в вашей конфигурации.Новое значение является правильным, поскольку оно считывается из значений по умолчанию opensc.

Это соответствующий код из SunPKCS11.java из проекта openjdk:

    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, чтобы провайдер всегда искал правильное.

3 голосов
/ 08 января 2014

Добавление флага отладки в командную строку работало для меня:

keytool -providerClass sun.security.pkcs11.SunPKCS11 \
  -providerArg /home/hans/Desktop/smartcards/opensc-java.cfg \
  -providerName SunPKCS11-OpenSC -keystore NONE -storetype PKCS11 \
  -list \
  -J-Djava.security.debug=sunpkcs11

Или вручную указав слот в файле cfg:

name = OpenSC
description = SunPKCS11 w/ OpenSC Smart card Framework
library = /usr/lib/x86_64-linux-gnu/opensc-pkcs11.so
slot = 2
2 голосов
/ 08 декабря 2011

Я могу подтвердить это с помощью java JDK 1.6.0_20

Даже простая Java-программа работает только с установленным -Djava.security.debug = sunpkcs11.

String configName = "/etc/pkcs11_java.cfg";
Provider p = new sun.security.pkcs11.SunPKCS11(configName);
keyStore = KeyStore.getInstance("PKCS11", p);

с /etc/pkcs11_java.cfg

name=OpenSC
description = SunPKCS11 via OpenSC
library=/usr/local/lib/opensc-pkcs11.so
...