Безопасность Java - поставщик MSCAPI: как использовать без всплывающего окна пароля? - PullRequest
6 голосов
/ 30 января 2009

Мне удалось использовать поставщика Sun MSCAPI в моем приложении. Проблема, с которой я сталкиваюсь сейчас, заключается в том, что всегда появляется окно с запросом пароля, хотя я и указал его в коде. Это проблема, потому что мне нужны функции криптографии в веб-сервисе.

Вот код, который у меня сейчас есть:

String alias = "Alias to my PK";
char[] pass = "MyPassword".toCharArray();

KeyStore ks = KeyStore.getInstance("Windows-MY");
ks.load(null, pass);
Provider p =  ks.getProvider();

Signature sig = Signature.getInstance("SHA1withRSA",p);
PrivateKey key = (PrivateKey) ks.getKey(alias, pass)

sig.initSign(key);
sig.update("Testing".getBytes());
sig.sign();

Это прекрасно работает, но я получаю всплывающее окно с запросом пароля при запуске последней строки. Как мне это предотвратить?

Ответы [ 3 ]

4 голосов
/ 30 января 2009

Поставщик MSCAPI не поддерживает предоставление пароля для CAPI:

Режим совместимости поддерживается для приложений, которые предполагают, что должен быть введен пароль. Это разрешает (но игнорирует) ненулевой пароль. Режим включен по умолчанию. (1)

Чтобы установить пароль через CAPI, вы должны вызвать CryptSetKeyParam с недокументированным KP_KEYEXCHANGE_PIN или KP_SIGNATURE_PIN и надеяться, что ваш базовый поставщик аппаратных токенов его поддерживает. (Они не полностью недокументированы - в документации для Windows CE и Windows Mobile их упоминают (2) , и они включены в файлы заголовков).

1 голос
/ 30 января 2009

Я предполагаю, что всплывающее окно появляется в Windows.

Импортируйте ваш ключ снова с помощью мастера импорта сертификатов, но убедитесь, что вы не отметили следующую опцию на экране «Пароль».

[_] Включить надежную защиту закрытого ключа. Если вы включите эту опцию, вам будет предложено каждый раз, когда закрытый ключ используется приложением.

0 голосов
/ 30 апреля 2014

Я решил эту проблему, настроив провайдера следующим образом:

signeData = gen.generate(content, ks.getProvider());

Где

ks - это KeyStore и

gen является CMSSignedDataGenerator

...