Java

Нужно из Java работать с ruToken.
Возможно ли такое?
Если возможно, то хотелось бы увидеть примерчик подписания потока (набора байт) через ruToken?

Re: Java

Да, работа с Рутокен из Java возможна через интерфейс PKCS#11, например. В Java имеется реализация такого класса.
Вот одна из реализаций апплета для подписи сообщений: http://www.developer.com/java/other/art … t-Card.htm

Re: Java

Vladimir Ivanov пишет:

Да, работа с Рутокен из Java возможна через интерфейс PKCS#11, например. В Java имеется реализация такого класса.
Вот одна из реализаций апплета для подписи сообщений: http://www.developer.com/java/other/art … t-Card.htm

Драйвер ruTiken с сайта скачал и установил.
Но ни файла конфигурации C:\smartcards\config\pkcs11.cfg, ни файла драйвера о котором говориться в приведенном примере (c:\windows\system32\pkcs201n.dll) у меня нет.
Соответственно вопрос, какие параметры нужно указывать для получения провайдера, который может обращаться к ruToken.
P.S. ОС: Win7 x32

Re: Java

Методом научного тыка подобрал параметры инициализации, получился примерно такой код

        String pkcs11config = "name = ruToken\n"
                + "library = c:\\windows\\system32\\rtPKCS11.dll";
        ByteArrayInputStream configStream = new ByteArrayInputStream(pkcs11config.getBytes());
        Provider pkcs11Provider = new sun.security.pkcs11.SunPKCS11(configStream);
        Security.addProvider(pkcs11Provider);

        char[] pin = {...};
        KeyStore rtKeyStore = KeyStore.getInstance("PKCS11");
        rtKeyStore.load(null, pin);

        Enumeration aliasesEnum = rtKeyStore.aliases();
        while (aliasesEnum.hasMoreElements()) {
            String alias = (String) aliasesEnum.nextElement();
            System.out.println("Alias: " + alias);
        }

Проблема в том что rtKeyStore пуст, нет там aliases, и по заданному имени [rtKeyStore.getCertificate("KristaProof")] ничего не находит, хотя утилита rtCert сертификат видит.

Re: Java

Уточните пожалуйста, каким способом сертификат был записан на Рутокен?

Re: Java

Подниму старую тему. Ситуация абсолютно такая же.
Тестовый код

public class TestToken {
    public static void main(String[] args) throws Exception {

    String pkcs11Config = "name=ruToken\nlibrary=/usr/lib/librtpkcs11ecp.so";
    ByteArrayInputStream configStream = new ByteArrayInputStream(pkcs11Config.getBytes());
    Provider pkcs11Provider = new SunPKCS11(configStream);
    Security.addProvider(pkcs11Provider);

    System.out.println("TestToken.main " + pkcs11Provider.getName());

    String pass = "...";
    KeyStore keyStore = KeyStore.getInstance("PKCS11");
    keyStore.load(null, pass.toCharArray());

    System.out.println("TestToken.main " + keyStore.getType() + " " + keyStore.getProvider() + "\nKey store size:" + keyStore.size());

    Enumeration aliasesEnum = keyStore.aliases();
    while (aliasesEnum.hasMoreElements()) {
        String alias = (String) aliasesEnum.nextElement();
        System.out.println("alias: " + alias);

        Certificate cert = keyStore.getCertificate(alias);
        System.out.println("cert: " + cert);

        PrivateKey privateKey = (PrivateKey) keyStore.getKey(alias, null);
        System.out.println("privateKey: " + privateKey);

        String doc = "doc123";
        Signature signature = Signature.getInstance("SHA1withRSA");
        signature.initSign(privateKey);
        signature.update(doc.getBytes());
        byte[] bytes = signature.sign();
    }
    }
}

Получаю:

TestToken.main SunPKCS11-ruToken
TestToken.main PKCS11 SunPKCS11-ruToken version 1.8
Key store size:0

Пара ключей создавалась так:

pkcs15-init --erase-card -p rutoken_ecp

pkcs15-init --create-pkcs15 --so-pin ((SO_PIN)) --so-puk ""

pkcs15-init --store-pin --label "User PIN" --auth-id 02 --pin ((PIN)) --puk "" --so-pin ((SO_PIN)) --finalize

pkcs11-tool --module /usr/lib64/opensc-pkcs11.so --keypairgen --key-type rsa:2048 --login -p ((PIN)) --label "user" --id ((ID))

pkcs11-tool корректно выдает список объектов:

user ~# pkcs11-tool --module /usr/lib64/opensc-pkcs11.so -Ol
Using slot 1 with a present token (0x1)
Logging in to "Rutoken ECP (User PIN)".
Please enter User PIN: 
Private Key Object; RSA 
  label:      Certificate
  ID:         ...
  Usage:      decrypt, sign, unwrap
Public Key Object; RSA 2048 bits
  label:      label
  ID:         ...
  Usage:      encrypt, verify, wrap
Certificate Object, type = X.509 cert
  label:      Certificate
  ID:         ...

Что я делаю не так? Почему Java не видит ничего на токене?
Конечный результат - хотелось бы провести провести шифрование/расшифровку с помощью токена на Java, через PKCS#11.  Это возможно?

Re: Java

Вы используете две разные библиотеки
здесь:
String pkcs11Config = "name=ruToken\nlibrary=/usr/lib/librtpkcs11ecp.so";
и здесь:
pkcs15-init --erase-card -p rutoken_ecp
pkcs15-init --create-pkcs15 --so-pin ((SO_PIN)) --so-puk ""
pkcs15-init --store-pin --label "User PIN" --auth-id 02 --pin ((PIN)) --puk "" --so-pin ((SO_PIN)) --finalize
pkcs11-tool --module /usr/lib64/opensc-pkcs11.so --keypairgen --key-type rsa:2048 --login -p ((PIN)) --label "user" --id ((ID))

Они несовместимы по форматам, поэтому вы ничего и не видите на токене.

Рекомендую Вам не делать ничего через pkcs15-init, это тоже самое что и форматирование, а форматировать токен можно через панельку в windows.
А утилите pkcs11-tool скармливайте librtpkcs11ecp.so.
Тогда у Вас должно всё завестись.