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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline molten  
#1 Оставлено : 11 июня 2021 г. 16:21:58(UTC)
molten

Статус: Новичок

Группы: Участники
Зарегистрирован: 17.10.2016(UTC)
Сообщений: 2

Имеется модуль подписания XML документа в формате XMLDsig. Модуль написан c помощью языка Java в связки с КриптоПро JCP. При подписании используется ключевая пара хранящаяся в JaCarta PKI (OCF Store).
Суть алгоритма состоит в следующем:
1) Преобразуем входной XML , удаляя из него все переносы строк и табуляции, т.к в дальнейшем при отправки содержимое передаётся в качестве параметра Post Запроса.
String fileCont = new String(Files.readAllBytes(inFile.toPath()));
fileCont=fileCont.replaceAll("\n", "").replaceAll("\r", "").replaceAll("\t", "");
fileContent = fileCont.getBytes();

2) Вычисляю подпись от полученной строки
if (!ru.CryptoPro.JCPxml.XmlInit.isInitialized()) {
ru.CryptoPro.JCPxml.XmlInit.init();
}

// инициализация объекта чтения XML-документа
final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
final DocumentBuilder documentBuilder = dbf.newDocumentBuilder();
final Document doc = documentBuilder.parse(new ByteArrayInputStream(fileContent));

ElementProxy.setDefaultPrefix(Constants.SignatureSpecNS, "");

XMLSignature sig = new XMLSignature(doc, "", signMethod, canonicalizationMethod);
Element anElement = doc.getDocumentElement();
anElement.appendChild(sig.getElement());
Transforms transforms = new Transforms(doc);
transforms.addTransform(Transforms.TRANSFORM_ENVELOPED_SIGNATURE);
transforms.addTransform(Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS);
sig.addDocument("", transforms, digestMethod);
KeyStore keyStore = KeyStore.getInstance("OCFStore","JCP");
keyStore.load(null, null);
if(keyStore==null){
System.out.println("KeyStore is null");
}
PrivateKey privateKey = (PrivateKey) keyStore.getKey("alias", new char[]{});
X509Certificate x509Cert = (X509Certificate) keyStore.getCertificate("alias");
sig.addKeyInfo(x509Cert);
sig.sign(privateKey);


3) Подпись встраиваю без использования DOM, т.к при его использовании менялся порядок атрибутов и было подозрение, что в этом и была ошибка. Перевожу <Signature> в строку и встраиваю её перед первым знаком ‘<’ справа.

Element d = sig.getElement();
TransformerFactory tf = TransformerFactory.newInstance();
Transformer trans = tf.newTransformer();
StreamResult strRes = new StreamResult(new StringWriter());
trans.transform(new DOMSource(d), strRes);
String strSignBlock = strRes.getWriter().toString().replaceAll("\n", "").replaceAll("\r", "").replaceAll("\t", "").replace("<?xml version=\"1.0\" encoding=\"UTF-8\"?>","");


int n=0;
int lenth = fileCont.toCharArray().length-1;
for (int i = lenth ; i>0;i--){
n++;
if (fileCont.charAt(i)=='<'){
break;
}
}
String beforeFinal = fileCont.substring(0,lenth-n+1);
String finalBlock = fileCont.substring(lenth-n+1);

String signDoc = beforeFinal+strSignBlock+finalBlock;
FileWriter fw = new FileWriter(f);
fw.append(signDoc);
fw.close();

На приёмной стороне проверяется средствами КриптоПро DSS (сделал вывод исходя их скриншотов). Ошибку которую получаем: 'msg' => 'Ошибка при проверке ЭЦП -> invalid -> invalidSignatureValue -> проверка подписи средствами xmlsec завершилась с ошибкой',
Помогите разобраться в чем может быть дело.Brick wall Brick wall Brick wall Brick wall
Offline Санчир Момолдаев  
#2 Оставлено : 11 июня 2021 г. 21:01:14(UTC)
Санчир Момолдаев

Статус: Сотрудник

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

Сказал(а) «Спасибо»: 88 раз
Поблагодарили: 226 раз в 213 постах
Добрый день!
приложите xml
Техническую поддержку оказываем тут
Наша база знаний
Offline molten  
#3 Оставлено : 21 июня 2021 г. 8:48:14(UTC)
molten

Статус: Новичок

Группы: Участники
Зарегистрирован: 17.10.2016(UTC)
Сообщений: 2

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