| ||||
| ||||
Добрый день. При работе с КриптоПро 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) Подскажите пожалуйста можно ли с этим, что то сделать? | ||||
Ответы: | ||||
| ||||
Такая ошибка появляется, если ключ искажен. Возможно, это связано с тем, что ключ перемаскируется. Один процесс меняет ключ при чтении, второй в это время пытается читать и контрольная сумма не сходится. | ||||
| ||||
Спасибо за ответ. Правильно ли мы понимаем, что, обращения к хранилищу должны синхронизироваться в приложении, которое, пользуеться API JCP, т.к. в самой реализации Крипто Про JCP синхронизация не осуществляеться? | ||||
| ||||
В JCP синхронизация осуществляется, поэтому несколько вопросов: - какая операционка? - какие настройки в контрольной панели /Дополнительно /Путь UnixMutex? - одновременный доступе к хранилищу ключей из нескольких процессов это доступ из разных процессов или потоков? - Какие это процессы (JCP, CSP или Вы сами копируете ключи)? - Какие носители? | ||||
| ||||
ОС: Gentoo Base System version 1.12.6 uname: Linux 2.6.18-gentoo-r4 Настройки по умолчанию, т.е. хранилище ключей находиться в /var/CPROcsp/keys доступ к хранилищу для чтения PrivateKey осуществляеться из различных потоков. используеться только JCP. Носителем в данном случе выступает HDImageStore Примечание: в случае доступа только из одного процесса, когда все его потоки принудительно синхронизируются при доступе к keystore, проблема не возникает | ||||
| ||||
Работает. Запустите у себя, пожалуйста 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(); } } | ||||
| ||||
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 | ||||
| ||||
А ключ после чтения ломается совсем или после сбоя нормально читается? Проверьте, пожалуйст, что файлы блокировок создаются в каталоге /var/CPROcsp/tmp. | ||||
| ||||
после данного теста сломался совсем, а при возникновении проблемы с которой я обратился в начале он ломался переодически. Хотелось бы подробнее узнать о папке /var/CPROcsp/tmp и о файлах блокировок, т.к. я к сожелению не вижу данной папки :-\ | ||||
| ||||
В папке /var/CPROcsp/tmp (или какая у Вас в настройках в контрольной панели /Дополнительно /Путь UnixMutex) лежат файлы с блокировками. Удалите их и проверьте что после чтения они появятся. А какая Java? | ||||
| ||||
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) | ||||
| ||||
По умолчанию путь "${java.io.tmpdir}/${user.name}". На Unix-ах часто настраивают на /var/CPROcsp/tmp, но если у Вас нет контрольной панели, скорее всего путь исходный. Файл блокировки будет иметь имя .5a189306-c591-40ef-97f7-1693c008c9bf_<имя ключа> | ||||
| ||||
Файлы блокировки обнаружил. Кроме них создаються еще 2 файла: CertifiedRandom_class_RandomSeed и mutexfordefrep. Попробовал тест после удаления файлов блокировки, результат не изменился. т.е. несколько удачных чтений ключа, после чего начинают появлсять ошибки :( | ||||
| ||||
Дополнительно обратил внимание, что в логе 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 */ Однако файл в директории присутствует. | ||||
| ||||
Здравствуйте, Евгений. Пришлите мне на iva@cryptopro.ru Ваш адрес, пожалуйста. | ||||