03.05.2007 13:31:55Incorrect fp при работе с КриптоПро JCP Ответов: 14
Евгений
Добрый день.

При работе с КриптоПро JCP 1.0.23(повторяеться и на 1.0.25)(лицензионая версия :О) ) столкнулся с следующей проблемой:

При одновременном доступе к хранилищу ключей из нескольких процессов возникает следующая ошибка:
java.security.UnrecoverableKeyException: Incorrect fp
at ru.CryptoPro.JCP.Key.k.<init>(Unknown Source)
at ru.CryptoPro.JCP.Key.k.a(Unknown Source)
at ru.CryptoPro.JCP.Key.k.a(Unknown Source)
at ru.CryptoPro.JCP.KeyStore.k.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at ru.CryptoPro.JCP.KeyStore.i.e(Unknown Source)
at ru.CryptoPro.JCP.KeyStore.i.a(Unknown Source)
at ru.CryptoPro.JCP.KeyStore.ContainerStore.engineGetKey(Unknown Source)
at ru.CryptoPro.JCP.KeyStore.JCPKeyStore.engineGetKey(Unknown Source)
at java.security.KeyStore.getKey(KeyStore.java:731)

Подскажите пожалуйста можно ли с этим, что то сделать?
 
Ответы:
03.05.2007 18:16:22Иван
Такая ошибка появляется, если ключ искажен.
Возможно, это связано с тем, что ключ перемаскируется.
Один процесс меняет ключ при чтении, второй в это время пытается читать и контрольная сумма не сходится.
04.05.2007 10:03:33Евгений
Спасибо за ответ.

Правильно ли мы понимаем, что, обращения к хранилищу должны синхронизироваться в приложении, которое, пользуеться API JCP, т.к. в самой реализации Крипто Про JCP синхронизация не осуществляеться?
07.05.2007 15:11:03Иван
В JCP синхронизация осуществляется, поэтому несколько вопросов:
- какая операционка?
- какие настройки в контрольной панели /Дополнительно /Путь UnixMutex?
- одновременный доступе к хранилищу ключей из нескольких процессов это доступ из разных процессов или потоков?
- Какие это процессы (JCP, CSP или Вы сами копируете ключи)?
- Какие носители?
07.05.2007 15:31:37Евгений
ОС: Gentoo Base System version 1.12.6
uname: Linux 2.6.18-gentoo-r4

Настройки по умолчанию, т.е. хранилище ключей находиться в /var/CPROcsp/keys

доступ к хранилищу для чтения PrivateKey осуществляеться из различных потоков.

используеться только JCP.

Носителем в данном случе выступает HDImageStore

Примечание: в случае доступа только из одного процесса, когда все его потоки принудительно синхронизируются при доступе к keystore, проблема не возникает
07.05.2007 16:46:14Иван
Работает. Запустите у себя, пожалуйста
public static final int THREADS_AMOUNT = 10;
public static final int LOOPS_AMOUNT = 10;
public static final String KEY_ALIAS = "cat";
public static final String KEY_PASSWORD = "11111111";
public static final String STORE_TYPE = "HDImageStore";
/**
* read key from many threads.
*/
public static void testRead() throws Exception {
int i;
Thread[] array = new Thread[THREADS_AMOUNT];
for (i = 0; i < THREADS_AMOUNT; i++)
array[i] = runTestingThread();
for (i = 0; i < THREADS_AMOUNT; i++) {
array[i].join();
}
}
/**
* create thread for testing.
*/
public static Thread runTestingThread() {
Runnable thread = new Runnable() {
public void run() {
for (int i = 0; i < LOOPS_AMOUNT; i++) {
readKey();
try {
Thread.sleep(10 + (int) (Math.random() * 100));
} catch (InterruptedException ex) {
}
}
}
};
Thread t = new Thread(thread);
t.setDaemon(true);
t.start();
return t;
}
/**
* read key from Store.
*/
public static void readKey(){
try{
KeyStore ks = KeyStore.getInstance(STORE_TYPE);
ks.load(null, null);
Key privateKey = ks.getKey(KEY_ALIAS, KEY_PASSWORD.toCharArray());
System.out.println("OK:"+Thread.currentThread().getName());
}catch(Exception e){
System.out.println("ERROR:"+e.toString());
e.printStackTrace();
}
}
08.05.2007 13:58:54Евгений
16:52:23,857 [Thread-36] DEBUG CryptoTest:58 - OK:Thread-36
16:52:29,454 [Thread-36] DEBUG CryptoTest:58 - OK:Thread-36
16:52:30,946 [Thread-39] DEBUG CryptoTest:58 - OK:Thread-39
16:52:38,547 [Thread-35] DEBUG CryptoTest:60 - ERROR:java.security.UnrecoverableKeyException: Incorrect fp
java.security.UnrecoverableKeyException: Incorrect fp
at ru.CryptoPro.JCP.Key.k.<init>(Unknown Source)
at ru.CryptoPro.JCP.Key.k.a(Unknown Source)
at ru.CryptoPro.JCP.Key.k.a(Unknown Source)
at ru.CryptoPro.JCP.KeyStore.k.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at ru.CryptoPro.JCP.KeyStore.i.e(Unknown Source)
at ru.CryptoPro.JCP.KeyStore.i.a(Unknown Source)
at ru.CryptoPro.JCP.KeyStore.ContainerStore.engineGetKey(Unknown Source)
at ru.CryptoPro.JCP.KeyStore.JCPKeyStore.engineGetKey(Unknown Source)
at java.security.KeyStore.getKey(KeyStore.java:731)
at com.cryptopro.CryptoTest.readKey(CryptoTest.java:57)
at com.cryptopro.CryptoTest$1.run(CryptoTest.java:36)
at java.lang.Thread.run(Thread.java:595)
16:52:39,063 [Thread-38] DEBUG CryptoTest:60 - ERROR:java.security.UnrecoverableKeyException: Incorrect fp
java.security.UnrecoverableKeyException: Incorrect fp
at ru.CryptoPro.JCP.Key.k.<init>(Unknown Source)
at ru.CryptoPro.JCP.Key.k.a(Unknown Source)
at ru.CryptoPro.JCP.Key.k.a(Unknown Source)
at ru.CryptoPro.JCP.KeyStore.k.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at ru.CryptoPro.JCP.KeyStore.i.e(Unknown Source)
at ru.CryptoPro.JCP.KeyStore.i.a(Unknown Source)
at ru.CryptoPro.JCP.KeyStore.ContainerStore.engineGetKey(Unknown Source)
at ru.CryptoPro.JCP.KeyStore.JCPKeyStore.engineGetKey(Unknown Source)
at java.security.KeyStore.getKey(KeyStore.java:731)
at com.cryptopro.CryptoTest.readKey(CryptoTest.java:57)
at com.cryptopro.CryptoTest$1.run(CryptoTest.java:36)
at java.lang.Thread.run(Thread.java:595)
16:52:39,413 [Thread-37] DEBUG CryptoTest:60 - ERROR:java.security.UnrecoverableKeyException: Incorrect fp
java.security.UnrecoverableKeyException: Incorrect fp
at ru.CryptoPro.JCP.Key.k.<init>(Unknown Source)
at ru.CryptoPro.JCP.Key.k.a(Unknown Source)
at ru.CryptoPro.JCP.Key.k.a(Unknown Source)
at ru.CryptoPro.JCP.KeyStore.k.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at ru.CryptoPro.JCP.KeyStore.i.e(Unknown Source)
at ru.CryptoPro.JCP.KeyStore.i.a(Unknown Source)
at ru.CryptoPro.JCP.KeyStore.ContainerStore.engineGetKey(Unknown Source)
at ru.CryptoPro.JCP.KeyStore.JCPKeyStore.engineGetKey(Unknown Source)
at java.security.KeyStore.getKey(KeyStore.java:731)
at com.cryptopro.CryptoTest.readKey(CryptoTest.java:57)
at com.cryptopro.CryptoTest$1.run(CryptoTest.java:36)
at java.lang.Thread.run(Thread.java:595)
16:52:39,572 [Thread-30] DEBUG CryptoTest:58 - OK:Thread-30
08.05.2007 16:08:32Иван
А ключ после чтения ломается совсем или после сбоя нормально читается?
Проверьте, пожалуйст, что файлы блокировок создаются в каталоге /var/CPROcsp/tmp.
08.05.2007 16:18:18Евгений
после данного теста сломался совсем, а при возникновении проблемы с которой я обратился в начале он ломался переодически.

Хотелось бы подробнее узнать о папке /var/CPROcsp/tmp и о файлах блокировок, т.к. я к сожелению не вижу данной папки :-\
08.05.2007 16:40:02Иван
В папке /var/CPROcsp/tmp (или какая у Вас в настройках в контрольной панели /Дополнительно /Путь UnixMutex) лежат файлы с блокировками. Удалите их и проверьте что после чтения они появятся.
А какая Java?
08.05.2007 16:59:22Евгений
1.к сожелению контрольную панель запустить не удасться т.к. на этой машине нет иксов :( Прошу подсказать каким еще образом можно увидеть/изменить эти настройки?
2.Вручную создал папку /var/CPROcsp/tmp (права для записи и чтения для ней есть)
3. Повторил запуск теста.

Хочеться отметить, что на этот раз болшее количество
потоков смогло успешно выполнить чтение ключа сразу после запуска.

Однако файлы в папочке tmp так и не появились :(

В логе появилась еще одна ошибка которой небыло до этого:

19:44:22,514 [Thread-40] DEBUG CryptoTest:58 - OK:Thread-40
19:44:23,376 [Thread-31] DEBUG CryptoTest:60 - ERROR:java.security.UnrecoverableKeyException: ASN.1 decode error @ offset 0:
Unexpected end-of-buffer encountered.
java.security.UnrecoverableKeyException: ASN.1 decode error @ offset 0:
Unexpected end-of-buffer encountered.
at ru.CryptoPro.JCP.KeyStore.c.e(Unknown Source)
at ru.CryptoPro.JCP.KeyStore.i.a(Unknown Source)
at ru.CryptoPro.JCP.Key.k.a(Unknown Source)
at ru.CryptoPro.JCP.Key.k.a(Unknown Source)
at ru.CryptoPro.JCP.KeyStore.k.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at ru.CryptoPro.JCP.KeyStore.i.e(Unknown Source)
at ru.CryptoPro.JCP.KeyStore.i.a(Unknown Source)
at ru.CryptoPro.JCP.KeyStore.ContainerStore.engineGetKey(Unknown Source)
at ru.CryptoPro.JCP.KeyStore.JCPKeyStore.engineGetKey(Unknown Source)
at java.security.KeyStore.getKey(KeyStore.java:731)
at com.cryptopro.CryptoTest.readKey(CryptoTest.java:57)
at com.cryptopro.CryptoTest$1.run(CryptoTest.java:36)
at java.lang.Thread.run(Thread.java:595)
Caused by: com.objsys.asn1j.runtime.Asn1EndOfBufferException: ASN.1 decode error @ offset 0:
Unexpected end-of-buffer encountered.
at com.objsys.asn1j.runtime.Asn1DecodeBuffer.read(Asn1DecodeBuffer.java:64)
at com.objsys.asn1j.runtime.Asn1BerDecodeBuffer.decodeTag(Asn1BerDecodeBuffer.java:5)
at com.objsys.asn1j.runtime.Asn1BerDecodeBuffer.decodeTagAndLength(Asn1BerDecodeBuffer.java:99)
at com.objsys.asn1j.runtime.Asn1BerDecodeBuffer.matchTag(Asn1BerDecodeBuffer.java:140)
at com.objsys.asn1j.runtime.Asn1Type.matchTag(Asn1Type.java:23)
at com.objsys.asn1j.runtime.Asn1Type.matchTag(Asn1Type.java:65)
at ru.CryptoPro.JCP.ASN.Gost_CryptoPro_PrivateKey.GostPrivateMasks.decode(GostPrivateMasks.java:63)
at com.objsys.asn1j.runtime.Asn1Type.decode(Asn1Type.java:15)
at ru.CryptoPro.JCP.KeyStore.a.b(Unknown Source)
at ru.CryptoPro.JCP.KeyStore.i.a(Unknown Source)
... 13 more


версия явы: Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_10-b03)
08.05.2007 17:42:53Иван
По умолчанию путь "${java.io.tmpdir}/${user.name}". На Unix-ах часто настраивают на /var/CPROcsp/tmp, но если у Вас нет контрольной панели, скорее всего путь исходный.
Файл блокировки будет иметь имя .5a189306-c591-40ef-97f7-1693c008c9bf_<имя ключа>
10.05.2007 14:24:33Евгений
Файлы блокировки обнаружил. Кроме них создаються еще 2 файла:
CertifiedRandom_class_RandomSeed и mutexfordefrep.

Попробовал тест после удаления файлов блокировки, результат не изменился. т.е. несколько удачных чтений ключа, после чего начинают появлсять ошибки :(
10.05.2007 15:55:33Евгений
Дополнительно обратил внимание, что в логе catalin-ы наблюдается следующая ошибка связанная с локом файлов:

java.util.prefs.FileSystemPreferences checkLockFile0ErrorCode
WARNING: Could not lock User prefs. Unix error code 2.

В ядре линукса она интерпретируется как:
errno.h:
#define ENOENT 2 /* No such file or directory */

Однако файл в директории присутствует.
28.05.2007 17:43:01Иван
Здравствуйте, Евгений.
Пришлите мне на iva@cryptopro.ru Ваш адрес, пожалуйста.