DLL-файл PKCS#11 PKCS11

Здесь мы пытаемся реализовать автономное приложение 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

Спасибо


person jon    schedule 16.01.2012    source источник


Ответы (2)


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

person Martin Paljak    schedule 17.01.2012
comment
хорошо, я не нахожу это system32. Возможно, мера безопасности от клиента, который не позволяет новой dll в этой папке, должна быть проверена. - person jon; 17.01.2012

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

person hasa    schedule 14.07.2012