xades4j неверный сгенерированный файл (XAdES-BES конвертирован)
Мне нужно подписать файлы xml с XAdES-BES в оболочке. Проблема в том, что подпись кажется недействительной.
Осмотревшись, я нашел код, который использую в этом тестовом примере:
import org.apache.commons.io.FileUtils;
import org.junit.Assert;
import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import systems.software.red.cedi5.aidaSignature.AidaSignatureService;
import xades4j.algorithms.EnvelopedSignatureTransform;
import xades4j.production.DataObjectReference;
import xades4j.production.SignedDataObjects;
import xades4j.production.XadesBesSigningProfile;
import xades4j.production.XadesSigner;
import xades4j.properties.DataObjectDesc;
import xades4j.providers.KeyingDataProvider;
import xades4j.providers.impl.FileSystemKeyStoreKeyingDataProvider;
import xades4j.providers.impl.KeyStoreKeyingDataProvider;
import xades4j.utils.DOMHelper;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.File;
import java.io.InputStream;
import java.security.cert.X509Certificate;
import java.util.List;
public class TestSignature {
public class FirstCertificateSelector implements KeyStoreKeyingDataProvider.SigningCertSelector
{
@Override
public X509Certificate selectCertificate(
List<X509Certificate> availableCertificates)
{
return availableCertificates.get(0);
}
}
public class DirectPasswordProvider implements KeyStoreKeyingDataProvider.KeyStorePasswordProvider,
KeyStoreKeyingDataProvider.KeyEntryPasswordProvider
{
private char[] password;
public DirectPasswordProvider(String password)
{
this.password = password.toCharArray();
}
@Override
public char[] getPassword()
{
return password;
}
@Override
public char[] getPassword(String entryAlias, X509Certificate entryCert)
{
return password;
}
}
@Test
public void signBes(String resourceName, String outputPath, String keystorePath, String keystorePwd) throws Exception {
try (InputStream DocumentIs = TestSignature.class.getResourceAsStream(resourceName)) {
Document doc = DocumentBuilderFactory
.newInstance()
.newDocumentBuilder()
.parse(DocumentIs);
Element elem = doc.getDocumentElement();
DOMHelper.useIdAsXmlId(elem);
KeyingDataProvider kdp = new FileSystemKeyStoreKeyingDataProvider(
"pkcs12",
keystorePath,
new FirstCertificateSelector(),
new DirectPasswordProvider(keystorePwd),
new DirectPasswordProvider(keystorePwd),
true);
DataObjectDesc obj = new DataObjectReference("")//"#" + elem.getAttribute("Id"))
.withTransform(new EnvelopedSignatureTransform());
SignedDataObjects dataObjs = new SignedDataObjects().withSignedDataObject(obj);
XadesSigner signer = new XadesBesSigningProfile(kdp).newSigner();
signer.sign(dataObjs, elem);
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new File(outputPath));
transformer.transform(source, result);
}
}
@Test
public void testSign_8D4U0506_M000010_xml() throws Exception {
signBes("/sample.xml" , "/tmp/sample-signed.xml",
"/home/foo/signature.p12",
"mypwd");
}
}
/tmp/sample-signed.xml
кажется не действительным.
Я также пытался проверить подписанный файл здесь: http://tools.chilkat.io/xmlDsigVerify.cshtml , но результат:
Signature is Invalid
Number of Reference Digests = 2
Reference 1 digest is valid.
Reference 2 digest is invalid because the computed digest differs from the digest in the XML.
Мне нужно подписать файлы xml с помощью
XAdES-BES enveloped
но я не знаю, что делать дальше.