Java
Нужно из Java работать с ruToken.
Возможно ли такое?
Если возможно, то хотелось бы увидеть примерчик подписания потока (набора байт) через ruToken?
Вы не авторизованы. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, нужно авторизоваться или зарегистрироваться
Нужно из Java работать с ruToken.
Возможно ли такое?
Если возможно, то хотелось бы увидеть примерчик подписания потока (набора байт) через ruToken?
Да, работа с Рутокен из Java возможна через интерфейс PKCS#11, например. В Java имеется реализация такого класса.
Вот одна из реализаций апплета для подписи сообщений: http://www.developer.com/java/other/art … t-Card.htm
Да, работа с Рутокен из 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
Методом научного тыка подобрал параметры инициализации, получился примерно такой код
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 сертификат видит.
Уточните пожалуйста, каким способом сертификат был записан на Рутокен?
Подниму старую тему. Ситуация абсолютно такая же.
Тестовый код
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. Это возможно?
Вы используете две разные библиотеки
здесь:
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.
Тогда у Вас должно всё завестись.
Страницы 1
Чтобы отправить ответ, нужно авторизоваться или зарегистрироваться