2013-12-10 5 views
0

Как проверить библиотеку использования Xades4j для подписанного XML-документа счетчика. И получают следующее сообщение об ошибке при проверке с Xades4j:Как проверить встречный документ XML?

xades4j.verification.CounterSignatureSigValueRefException: Проверки завершилась неудача для свойства «контрасигнатуры»: подпись счетчика не ссылается на элемент SignatureValue из скрепленной подписи в xades4j.verification.CounterSignatureVerifier.verify (CounterSignatureVerifier.java:75) на xades4j.verification.CounterSignatureVerifier.verify (CounterSignatureVerifier.java:37) на xades4j.verification.GenericDOMDataVerifier.verify (Родовой DOMDataVerifier.java:65) на xades4j.verification.GenericDOMDataVerifier.verify (GenericDOMDataVerifier.java:30) на xades4j.verification.QualifyingPropertiesVerifierImpl.verifyProperties (QualifyingPropertiesVerifierImpl.java:59) на xades4j.verification.XadesVerifierImpl.verify (XadesVerifierImpl.java:187) на com.fit.einvoice.ingcountersigner.service.xades.XadesVerifyOperation.verifySignature (XadesVerifyOperation.java:92) на com.fit.einvoice.ingcountersigner.service.xades.XadesVerifyOperation.verifySignature (XadesVerifyOperation.java:87) по адресу com.fit.einvoice.ingcountersigner.service.xades.XadesVerifyOperatio n.verifySignature (XadesVerifyOperation.java:64)

Моя функция проверки:

static void checkSigned(File file) { 
    InputStream inputStream = null; 
    try { 
     inputStream = new FileInputStream(file); 
     XadesVerifyOperation verifyOperation = new XadesVerifyOperation(); 
     ArrayList<XadesVerificationResults> results = verifyOperation.verifySignature(inputStream); 
      System.out.println("results size: " + results.size()); 
      for (XadesVerificationResults result : results) { 
       System.out.println(result.SigningCertificate.getIssuerDN()); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       inputStream.close(); 
      } catch (IOException ex) { 
      } 
     } 
} 

EDIT:

Мой счетчик подписал функцию:

public void CounterSign() throws TransformerFactoryConfigurationError, Exception { 
     Document doc = SignatureServicesBase.getDocument(_inputStream); 
     Element sigElem = (Element) doc.getElementsByTagNameNS(Constants.SignatureSpecNS, Constants._TAG_SIGNATURE).item(0); 

     System.out.println(sigElem.getNodeName()); 

     org.apache.xml.security.Init.init(); 
     XMLSignature xmlSig = new XMLSignature(sigElem, doc.getBaseURI()); 

     //Create counter signer 
     XadesBesSigningProfile signingProfile = new XadesBesSigningProfile(new Pkcs11KeyingDataProvider(_certInfo)); 
     signingProfile.withAlgorithmsProvider(Sha1AlgProvider.class); 
     signingProfile.withBasicSignatureOptionsProvider(new MyBasicSignatureOptionsProvider(true, true, false)); 
     final XadesSigner counterSigner = signingProfile.newSigner(); 

     //Extend with counter signature 
     XadesFormatExtenderProfile extenderProfile = new XadesFormatExtenderProfile(); 
     XadesSignatureFormatExtender extender = extenderProfile.getFormatExtender(); 
     List unsignedProps = Arrays.asList(new CounterSignatureProperty(counterSigner)); 
     extender.enrichSignature(xmlSig, new UnsignedProperties(unsignedProps)); 

     SignatureServicesBase.outputDocument(doc, _outStream); 

     if (!_isStream) { 
      _inputStream.close(); 
      _outStream.close(); 
     } 
    } 

ответ

1

Я не уверен, Я полностью понял ваш вопрос. Если вы спрашиваете, как проверить свойство встречной подписи, оно уже выполняется как часть проверки «основной» подписи. Обратите внимание:

  • То же самое XadesVerifier используется как для основной, так и для встречной подписи.
  • Если проверка завершена успешно, к результату добавляется свойство типа CounterSignatureProperty.
  • Вы можете получить доступ к свойству through the verification result главной подписи

    XAdESVerificationResult res = ...; 
    CounterSignatureProperty p = res.getPropertiesFilter().getOfType(CounterSignatureProperty.class); 
    

EDIT:

В сообщении говорится, все: счетчик подписи, вероятно, недействительным. По определению сигнатура счетчика должна содержать ссылку на элемент с подстрочным номером SignatureValue.

Вы можете найти элемент CounterSignature на оригинальном XML-документе и опубликовать его здесь?

+0

Спасибо за ответ. Скрепленный XML-файл: https://www.dropbox.com/s/xwsmstp809y33de/countersigned.xml первый подписанный оригинальный файл: https: //www.dropbox.com/s/xiy99o06d3m8lqy/signed.xml –

+0

Вы изменили код lib на то, как ссылки на объекты данных добавляются в подпись? Существует преобразование «xml-c14n11 # WithComments» в ссылку счетчика-подписи к элементу SignatureValue основной подписи. По умолчанию это не следует добавлять. В любом случае, я считаю, что причиной исключения является то, что в настоящее время проверка встречной сигнатуры предполагает, что разыменование SignatureValue ref возвращает результат на узле XML. С канонизацией это не так. Мне нужно проверить, что это точно тот же узел, что означает, что не допускать преобразования. – lgoncalves

Смежные вопросы