Bezdepbonusu7Программирование: статьи и ответы

Вопрос

DLL-файл PKCS#11 PKCS11

Автор вопроса: jonОтветов: 2

Здесь мы пытаемся реализовать автономное приложение Java, которое может подключаться к веб-сайту https и аутентифицироваться с помощью смарт-карты PKI, и мы сталкиваемся со всевозможными проблемами.

Я должен упомянуть, что мы можем запустить такое приложение, если воспользуемся апплетом (тогда будут использоваться хранилище ключей и доверенное хранилище браузера), все работает отлично, мы вводим пин-код карты и получаем доступ к веб-странице.

У меня есть два вопроса. Во-первых, что касается моего кода, кто-то видит в нем что-то не так. Я включаю ошибку времени выполнения, которую мы имеем при ее запуске:

public class TestPKCS11 {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {

    // Set keyStore and trustStore
    System.setProperty("javax.net.ssl.trustStoreType", "PKCS11");
    System.setProperty("javax.net.ssl.trustStore", "NONE");
    System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
    System.setProperty("javax.net.ssl.trustStoreProvider", "SunPKCS11-mycard");
    String trustStore = System.getProperty("javax.net.ssl.trustStore");
    if (trustStore == null) {
        System.out.println("javax.net.ssl.trustStore is not defined");
    } else {
        System.out.println("javax.net.ssl.trustStore = " + trustStore);
    }

    System.setProperty("javax.net.ssl.keyStoreType", "PKCS11");
    System.setProperty("javax.net.ssl.keyStore", "NONE");
    System.setProperty("javax.net.ssl.keyStorePassword", "changeit");
    System.setProperty("javax.net.ssl.keyStoreProvider", "SunPKCS11-mycard");
    String keyStore = System.getProperty("javax.net.ssl.keyStore");
    if (keyStore == null) {
        System.out.println("javax.net.ssl.keyStore is not defined");
    } else {
        System.out.println("javax.net.ssl.keyStore = " + keyStore);
    }

    System.setProperty("javax.net.debug", "ssl"); // dynamic conf of PKCS#11

    String configName = "C:\\confDirectory\\pkcs11.cfg";

    sun.security.pkcs11.SunPKCS11 sunPKCS11 = new sun.security.pkcs11.SunPKCS11(configName);
    Provider p = sunPKCS11;
    Security.addProvider(p);


    SSLSocketFactory sslFact = (SSLSocketFactory) SSLSocketFactory.getDefault();

    try{
        SSLSocket sock = (SSLSocket)sslFact.createSocket("myserver", 8081);

        sock.startHandshake();

    } catch (SSLHandshakeException ex) {
        Logger.getLogger(TestPKCS11.class.getName()).log(Level.SEVERE, null, ex);
        System.out.println(ex.getMessage());
    }
    catch (IOException ex) {
        Logger.getLogger(TestPKCS11.class.getName()).log(Level.SEVERE, null, ex);
    }
}

Выполнить ОШИБКА:

Exception in thread "main" java.security.ProviderException: Initialization failed
    at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:340)
    at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:86)
    at TestPKCS11.main(TestPKCS11.java:95)
Caused by: java.io.IOException: The specified procedure could not be found.
    at sun.security.pkcs11.wrapper.PKCS11.connect(Native Method)
    at sun.security.pkcs11.wrapper.PKCS11.<init>(PKCS11.java:141)
    at sun.security.pkcs11.wrapper.PKCS11.getInstance(PKCS11.java:154)
    at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:281)
    ... 2 more

Мой второй вопрос касается dll для использования с pkcs11. В настоящее время я использую это, включенное в установку IBM Rational (jpkcs11.dll), но я действительно не уверен, что это хорошее решение. Я читал об OpenSC, но не могу найти файл OpenSC-pkcs11.dll. Я вижу только opensc.dll.

Я работаю на Windows7 с Java 1.6 27

Спасибо

javasmartcardpki

Ответы

Ответ 1 · рейтинг 2 · Martin Paljak

OpenSC PKCS#11 называется "opensc-pkcs11.dll" и помещается в system32. Но вам нужно убедиться, что ваша смарт-карта поддерживается OpenSC. Как правило: вам нужно использовать провайдера PKCS#11, который поставляется с вашей картой (обычно с закрытым исходным кодом) или поддерживает вашу карту (например, OpenSC).

Ответ 2 · hasa

Вместо того, чтобы помещать DLL в system32, вы можете динамически загружать ее из домашнего каталога пользователя. Но это зависит от вашего приложения, как вы собираетесь его установить.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы