Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline yazikov  
#1 Оставлено : 20 марта 2013 г. 9:28:18(UTC)
yazikov

Статус: Участник

Группы: Участники
Зарегистрирован: 18.03.2013(UTC)
Сообщений: 13
Российская Федерация

Сказал(а) «Спасибо»: 1 раз
Здравствуйте!

Происходит критическая ошибка JVM при работе с библиотеками КриптоПро JCP. Ошибка возникает в любом месте при работе функции, которые используют библиотеки.

Функции реализованы на основе стандартных функций из примеров по подписыванию XML и поиска сертификата из ключевого носителя. Сейчас стоят все последние версии библиотек и JRE.

Не подскажите в чем может быть проблема? Грешу на сборщик мусора.

Вот текст функций:

public boolean findCertOperator() {

// определяем место чтения сертификата
KeyStore ks = null;
try {
ks = KeyStore.getInstance("OCFStore", "JCP");
} catch (KeyStoreException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
return false;
} catch (NoSuchProviderException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
return false;
}

// читаем хранилище
try {
try {
ks.load(null, "1234567890".toCharArray());
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
} catch (CertificateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}

Enumeration<String> aliases = null;
try {
aliases = ks.aliases();
} catch (KeyStoreException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
} catch (Exception e) {
return false;
}

if (!aliases.hasMoreElements()) {
return false;
}

String alias = aliases.nextElement();

if (!alias.equals(operator[0])) {
return false;
}

this.operatorAlias = alias;
this.nameOperator = operator[1];
// читаем сертификат
try {
this.certOperator = ks.getCertificate(alias);
} catch (KeyStoreException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
} catch (Exception e) {
return false;
}

if (this.certOperator == null) {
return false;
}

try {
this.privateKeyOperator = (PrivateKey) ks.getKey(alias, "1234567890".toCharArray());
} catch (UnrecoverableKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
} catch (KeyStoreException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
} catch (Exception e) {
return false;
}


if (this.privateKeyOperator == null) {
return false;
}

ks = null;

return true;
}

private void signDocTwo(String Id1, String Id2, String signMethod, String digestMethod, String testDoc, String signDoc)
throws NoSuchAlgorithmException, IOException, CertificateException, InvalidKeyException, SignatureException,
ParserConfigurationException, SAXException, TransformerException, XMLSecurityException, KeyStoreException, NoSuchProviderException,
UnrecoverableKeyException {

// генерирование X509-сертификата из закодированного представления первого сертификата
final X509Certificate cert1 = (X509Certificate) this.certOperator;

// генерирование X509-сертификата из закодированного представления второго сертификата
final X509Certificate cert2 = (X509Certificate) this.certClient;

/* Загружаем подписываемый XML-документ из файла */

// инициализация объекта чтения XML-документа
final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

// установка флага, определяющего игнорирование пробелов в содержимом элементов при обработке XML-документа
dbf.setIgnoringElementContentWhitespace(true);

// установка флага, определяющего преобразование узлов CDATA в текстовые узлы при обработке XML-документа
dbf.setCoalescing(true);

// установка флага, определяющего поддержку пространств имен при обработке XML-документа
dbf.setNamespaceAware(true);

// загрузка содержимого подписываемого документа на основе установленных флагами правил
final DocumentBuilder documentBuilder = dbf.newDocumentBuilder();
final Document doc = documentBuilder.parse(testDoc);

/* Добавление первого узла подписи <ds:Signature> в загруженный XML-документ */

// инициализация объекта формирования ЭЦП в соответствии с алгоритмом ГОСТ Р 34.10-2001
final XMLSignature sig = new XMLSignature(doc, "", signMethod);

// определение идентификатора первого узла подписи
sig.setId(Id1);

// получение корневого узла XML-документа
final Element anElement = doc.getDocumentElement();

// добавление в корневой узел XML-документа первого узла подписи
anElement.appendChild(sig.getElement());

/* Определение правил работы с XML-документом и добавление в первый узел подписи этих правил */

// создание узла преобразований <ds:Transforms> обрабатываемого XML-документа
final Transforms transforms = new Transforms(doc);

// добавление в узел преобразований правил работы с документом
transforms.addTransform(Transforms.TRANSFORM_ENVELOPED_SIGNATURE);
transforms.addTransform(Transforms.TRANSFORM_C14N_WITH_COMMENTS);

final String[][] filters = { { XPath2FilterContainer.SUBTRACT, "//ds:Signature" } };
transforms.addTransform(Transforms.TRANSFORM_XPATH2FILTER, XPath2FilterContainer.newInstances(doc, filters));

// добавление в первый узел подписи ссылок (узла <ds:Reference>), определяющих правила работы с
// XML-документом (обрабатывается текущий документ с заданными в узле <ds:Transforms> правилами
// и заданным алгоритмом хеширования)
sig.addDocument("", transforms, digestMethod);

/*
* Создание первой подписи всего содержимого XML-документа на основе закрытого ключа первой ключевой пары,
* заданных правил и алгоритмов
*/

// создание внутри первого узла подписи узла <ds:KeyInfo> информации об открытом ключе первой ключевой
// пары на основе сертификата
sig.addKeyInfo(cert1);

// создание первой подписи XML-документа
sig.sign(this.privateKeyOperator);

/* Добавление второго узла подписи <ds:Signature> в загруженный XML-документ */

// инициализация объекта формирования ЭЦП в соответствии с алгоритмом ГОСТ Р 34.10-2001
final XMLSignature sigSecond = new XMLSignature(doc, "", signMethod);

// определение идентификатора второго узла подписи
sigSecond.setId(Id2);

// добавление в корневой узел XML-документа второго узла подписи
anElement.appendChild(sigSecond.getElement());

/* Определение правил работы с XML-документом и добавление в первый узел подписи этих правил */

// создание узла преобразований <ds:Transforms> обрабатываемого XML-документа
final Transforms transforms2 = new Transforms(doc);

// добавление в узел преобразований правил работы с документом
transforms2.addTransform(Transforms.TRANSFORM_ENVELOPED_SIGNATURE);
transforms2.addTransform(Transforms.TRANSFORM_C14N_WITH_COMMENTS);
transforms2.addTransform(Transforms.TRANSFORM_XPATH2FILTER, XPath2FilterContainer.newInstances(doc, filters));

// добавление во второй узел подписи ссылок (узла <ds:Reference>), определяющих правила работы с
// XML-документом (обрабатывается текущий документ с заданными в узле <ds:Transforms> правилами
// и заданным алгоритмом хеширования)
sigSecond.addDocument("", transforms, digestMethod);

/*
* Создание второй подписи всего содержимого XML-документа на основе закрытого ключа второй ключевой пары,
* заданных правил и алгоритмов
*/

// создание внутри первого узла подписи узла <ds:KeyInfo> информации об открытом ключе второй ключевой
// пары на основе сертификата
sigSecond.addKeyInfo(cert2);

// создание второй подписи XML-документа
sigSecond.sign(this.privateKeyClient);

/* Сохранение подписанного XML-документа в файл */

// определение потока, в который осуществляется запись подписанного XML-документа
final FileOutputStream os = new FileOutputStream(signDoc);

// инициализация объекта копирования содержимого XML-документа в поток
final TransformerFactory tf = TransformerFactory.newInstance();

// создание объекта копирования содержимого XML-документа в поток
final Transformer trans = tf.newTransformer();

// копирование содержимого XML-документа в поток
trans.transform(new DOMSource(doc), new StreamResult(os));
os.close();
}

Вот лог ошибки JVM:
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0000000068d3b09c, pid=2792, tid=1372
#
# JRE version: 7.0_17-b02
# Java VM: Java HotSpot(TM) 64-Bit Server VM (23.7-b01 interpreted mode windows-amd64 compressed oops)
# Problematic frame:
# V [jvm.dll+0xfb09c]
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# If you would like to submit a bug report, please visit:
# http://bugreport.sun.com/bugreport/crash.jsp
#

--------------- T H R E A D ---------------

Current thread (0x0000000005277800): JavaThread "Finalizer" daemon [_thread_in_vm, id=1372, stack(0x00000000054c0000,0x00000000055c0000)]

siginfo: ExceptionCode=0xc0000005, reading address 0x0000000000000000

Registers:
RAX=0x0000000000000000, RBX=0x0000000005277800, RCX=0x0000000000000780, RDX=0x0000000000000000
RSP=0x00000000055be9f0, RBP=0x00000000055bec50, RSI=0x00000000052779d8, RDI=0x0000000000000000
R8 =0x0000000005277800, R9 =0x0000000008c0b660, R10=0x0000000000000000, R11=0x00000000055bea20
R12=0x0000000000000000, R13=0x00000000fbb01e80, R14=0x00000000055bec78, R15=0x0000000005277800
RIP=0x0000000068d3b09c, EFLAGS=0x0000000000010202

Top of Stack: (sp=0x00000000055be9f0)
0x00000000055be9f0: 0000000069157a88 00000000065bd1a0
0x00000000055bea00: 0000000005277800 000000000000000c
0x00000000055bea10: 0000000005277800 0000000000000000
0x00000000055bea20: 0000000000000000 000000000610a564
0x00000000055bea30: 0000000000000000 000000000610a4d6
0x00000000055bea40: 00000000fbb01e80 00000000055bec50
0x00000000055bea50: 0000000005277800 0000000000000000
0x00000000055bea60: 0000000000000000 000000000610a40f
0x00000000055bea70: 00000000052779d8 0000000000000000
0x00000000055bea80: 000000000645c8d0 0000000000000052
0x00000000055bea90: 000000000655ce90 00000000faed5c10
0x00000000055beaa0: 0000000000000000 fffffffffffffffe
0x00000000055beab0: 00000000fbb01e80 0000000006109b7d
0x00000000055beac0: 0000000006ad8bf0 00000000052779d8
0x00000000055bead0: 00000000055bec70 0000000068ddf49b
0x00000000055beae0: 000024a8f384ecec 0000000006ad5068

Instructions: (pc=0x0000000068d3b09c)
0x0000000068d3b07c: 89 5c 24 20 48 c7 44 24 28 00 00 00 00 74 0a 48
0x0000000068d3b08c: 8d 4c 24 20 e8 7b 60 10 00 80 3d 7c 0c 5b 00 00
0x0000000068d3b09c: 48 8b 17 74 15 8b 52 08 8b 0d 6e f4 55 00 48 d3
0x0000000068d3b0ac: e2 48 03 15 5c f4 55 00 eb 04 48 8b 52 08 48 8b


Register to memory mapping:

RAX=0x0000000000000000 is an unknown value
RBX=0x0000000005277800 is a thread
RCX=0x0000000000000780 is an unknown value
RDX=0x0000000000000000 is an unknown value
RSP=0x00000000055be9f0 is pointing into the stack for thread: 0x0000000005277800
RBP=0x00000000055bec50 is pointing into the stack for thread: 0x0000000005277800
RSI=0x00000000052779d8 is an unknown value
RDI=0x0000000000000000 is an unknown value
R8 =0x0000000005277800 is a thread
R9 =0x0000000008c0b660 is an unknown value
R10=0x0000000000000000 is an unknown value
R11=0x00000000055bea20 is pointing into the stack for thread: 0x0000000005277800
R12=0x0000000000000000 is an unknown value
R13=0x00000000fbb01e80 is an oop
{method}
- klass: {other class}
R14=0x00000000055bec78 is pointing into the stack for thread: 0x0000000005277800
R15=0x0000000005277800 is a thread


Stack: [0x00000000054c0000,0x00000000055c0000], sp=0x00000000055be9f0, free space=1018k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
V [jvm.dll+0xfb09c]
j ru.aladdin.etoken.cryptopro.jcp.eTokenM4Service.GetTokenID()J+15
j ru.aladdin.etoken.cryptopro.jcp.eTokenM4Service.finalize()V+6
v ~StubRoutines::call_stub
V [jvm.dll+0x1ae734]

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j ru.aladdin.etoken.cryptopro.jcp.APDUStub.createToken(Lopencard/core/service/CardService;)J+0
j ru.aladdin.etoken.cryptopro.jcp.eTokenM4Service.GetTokenID()J+15
j ru.aladdin.etoken.cryptopro.jcp.eTokenM4Service.finalize()V+6
v ~StubRoutines::call_stub
j java.lang.ref.Finalizer.invokeFinalizeMethod(Ljava/lang/Object;)V+0
j java.lang.ref.Finalizer.runFinalizer()V+45
j java.lang.ref.Finalizer.access$100(Ljava/lang/ref/Finalizer;)V+1
j java.lang.ref.Finalizer$FinalizerThread.run()V+11
v ~StubRoutines::call_stub

RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.