Проверка ЭЦП
(1 чел.) (1) гость
  • Страница:
  • 1
  • 2

ТЕМА: Проверка ЭЦП

Проверка ЭЦП 4 года, 3 мес. назад #1588

  • wss
  • Новый участник
  • Постов: 5
  • Репутация: 0
1) Почему проверка в первом варианте выдает true а во втором false?

Provider kalkanProvider = new KalkanProvider();
Security.addProvider(kalkanProvider);

//Вариант 1
 String xml=readFileAsString("sign.xml");
Document doc = parseDocument(xml);
Element nscontext = XMLUtils.createDSctx(doc, "ds", "http://www.w3.org/2000/09/xmldsig#");
NodeList list = XPathAPI.selectNodeList(doc, "//ds:Signature", nscontext);
Element sigElement = (Element) list.item(list.getLength() - 1);
XMLSignature signature = new XMLSignature(sigElement, "");
org.apache.xml.security.keys.KeyInfo ki = signature.getKeyInfo();
X509Certificate certKey = null;
certKey = ki.getX509Certificate();
System.out.println(signature.checkSignatureValue(certKey));

//Вариант 2
//строки берутся из этого же файла "sign.xml"
String cert="...";  //Беру эту строку из <ds:X509Certificate>
String data="...";  //Беру эту строку из <ds:DigestValue>
String sign="...";  //Беру эту строку из <ds:SignatureValue>
Certificate certificate = CertificateFactory.getInstance("X509").generateCertificate(new ByteArrayInputStream(Base64.decode(cert)));
PublicKey publicKey=certificate.getPublicKey();
Signature signature2 = Signature.getInstance(publicKey.getAlgorithm(), kalkanProvider.getName());		
signature2.initVerify(publicKey);
signature2.update(Base64.decode(data));
System.out.println(signature2.verify(Base64.decode(sign)));


2) Перечитал весь форум, но нигде не упоминается как проверить ЭЦП(везде только формируют подпись). В том числе и в старом sdk был пример только с подписью, а проверки не было. Можно ли увидеть простенький пример для проверки ЭЦП аля эталон?

3) Как включить debug в kalkan? Т.е. видеть хоть какие-то сообщения что там внутри происходит и из-за чего выдается false.

Re: Проверка ЭЦП 4 года, 3 мес. назад #1589

  • ololo
  • Живу я здесь
  • Постов: 464
  • Репутация: 57
1) первый вариант правильный, второй нет
вам нужно ознакомиться с алгоритмом подписывания xml. DigestValue это хеш канонизированного исходного xml. в SignatureValue хранится подпись канонизированного и захешированного содержимого тега SignedInfo.
2) проверить подпись чего именно?
3) у криптопровайдера логирования нет, это лишний мусор. но для xml-security можно включить, добавив к параметрам запуска приложения следующие опции
-Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog -Dorg.apache.commons.logging.simplelog.defaultlog=debug
gg wp
Спасибо сказали: wss

Re: Проверка ЭЦП 4 года, 3 мес. назад #1590

  • wss
  • Новый участник
  • Постов: 5
  • Репутация: 0
Огромное спасибо. Теперь понятно почему второй вариант был не рабочий.
По первому варианту не пойму как использовать открытый открытый ключ если он не включен в сам xml.

//В test.cer открытый ключ
InputStream inStream = new FileInputStream("test.cer");
CertificateFactory cf = CertificateFactory.getInstance("X.509");
X509Certificate certKey = (X509Certificate)cf.generateCertificate(inStream);

String xml=readFileAsString("test.xml");
Document doc = parseDocument(xml);
Element nscontext = XMLUtils.createDSctx(doc, "ds", "http://www.w3.org/2000/09/xmldsig#");
NodeList list = XPathAPI.selectNodeList(doc, "//ds:Signature", nscontext);        
Element sigElement = (Element) list.item(list.getLength()-1);
XMLSignature signature = new XMLSignature(sigElement, "");
System.out.println(signature.checkSignatureValue(certKey));


Получаю ошибку:
Exception in thread "main" org.apache.xml.security.signature.XMLSignatureException: The requested algorithm http://www.w3.org/2000/09/xmldsig#rsa-sha1 does not exist. Original Message was: null

:pinch: ВНИМАНИЕ: СПОЙЛЕР!

Re: Проверка ЭЦП 4 года, 3 мес. назад #1591

  • ololo
  • Живу я здесь
  • Постов: 464
  • Репутация: 57
а чем был подписан xml?
потому как алгоритм должен был получиться не таким
www.w3.org/2000/09/xmldsig#rsa-sha1,
а вот таким
www.w3.org/2001/04/xmldsig-more#rsa-sha1
и правильнее будет писать
CertificateFactory.getInstance("X.509", "KALKAN");
или
CertificateFactory.getInstance("X.509", KalkanProvider.getName());
gg wp
Спасибо сказали: wss

Re: Проверка ЭЦП 4 года, 3 мес. назад #1592

  • wss
  • Новый участник
  • Постов: 5
  • Репутация: 0
было подписано вот таким:
signatureDigestAlgorithm= www.w3.org/2000/09/xmldsig#sha1
signatureAlgorithm= www.w3.org/2000/09/xmldsig#rsa-sha1

В soapUI нет в списке:
www.w3.org/2001/04/xmldsig-more#rsa-sha1
для 2001/04 есть только
www.w3.org/2001/04/xmldsig-more#rsa-sha256
www.w3.org/2001/04/xmldsig-more#rsa-sha384
www.w3.org/2001/04/xmldsig-more#rsa-sha512

какие DigestAlgorithm и signatureAlgorithm нужно использовать для sha1?


Если формирую xml в soapUI с www.w3.org/2001/04/xmldsig-more#rsa-sha256,

Provider kalkanProvider = new KalkanProvider();
Security.addProvider(kalkanProvider);

//В test.cer открытый ключ
InputStream inStream = new FileInputStream("test.cer");
CertificateFactory cf = CertificateFactory.getInstance("X.509",kalkanProvider.getName());
X509Certificate certKey = (X509Certificate)cf.generateCertificate(inStream);

String xml=readFileAsString("test.xml");
Document doc = parseDocument(xml);
Element nscontext = XMLUtils.createDSctx(doc, "ds", "http://www.w3.org/2000/09/xmldsig#");
NodeList list = XPathAPI.selectNodeList(doc, "//ds:Signature", nscontext);        
Element sigElement = (Element) list.item(list.getLength()-1);
XMLSignature signature = new XMLSignature(sigElement, "");
System.out.println(signature.checkSignatureValue(certKey));


то при проверке получаю ошибку:
The requested algorithm www.w3.org/2001/04/xmldsig-more#rsa-sha256 does not exist. Original Message was: null

Если в коде использую doc, "ds", " www.w3.org/2001/04/xmldsig#"); то получаю ошибку "Cannot create an ElementProxy from a null argument"
Изменено: 4 года, 3 мес. назад от wss.

Re: Проверка ЭЦП 4 года, 3 мес. назад #1595

  • ololo
  • Живу я здесь
  • Постов: 464
  • Репутация: 57
по идее да, должно быть так
signatureDigestAlgorithm= www.w3.org/2000/09/xmldsig#sha1
signatureAlgorithm= www.w3.org/2000/09/xmldsig#rsa-sha1

но в силу кое-каких обстоятельств ранее кто-то использовал неправильные URI для подписания
то есть
www.w3.org/2001/04/xmldsig-more#sha1
www.w3.org/2001/04/xmldsig-more#rsa-sha1

поэтому все подписанные xml имеем с такими URI

вообще уже надо начинать использовать rsa-sha2. но он в выданном sdk еще не поддерживается. думаю скоро выложат обновленные библиотеки
gg wp
Спасибо сказали: wss
  • Страница:
  • 1
  • 2
FaLang translation system by Faboba