Как проверить библиотеку использования 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();
}
}
Спасибо за ответ. Скрепленный XML-файл: https://www.dropbox.com/s/xwsmstp809y33de/countersigned.xml первый подписанный оригинальный файл: https: //www.dropbox.com/s/xiy99o06d3m8lqy/signed.xml –
Вы изменили код lib на то, как ссылки на объекты данных добавляются в подпись? Существует преобразование «xml-c14n11 # WithComments» в ссылку счетчика-подписи к элементу SignatureValue основной подписи. По умолчанию это не следует добавлять. В любом случае, я считаю, что причиной исключения является то, что в настоящее время проверка встречной сигнатуры предполагает, что разыменование SignatureValue ref возвращает результат на узле XML. С канонизацией это не так. Мне нужно проверить, что это точно тот же узел, что означает, что не допускать преобразования. – lgoncalves