Статус: Участник
Группы: Участники
Зарегистрирован: 06.03.2017(UTC) Сообщений: 15
Сказал(а) «Спасибо»: 3 раз Поблагодарили: 2 раз в 1 постах
|
Всем привет! Есть xml-ка её надо подписать. Подпись должна находится в определенном месте Document/SinatureEnvlp/SignTags/Signature. SignTags не существует, мы его создаем и помещаем туда XMLSignature.getElement(). При чем в SignTags может хранится ещё всякая информация, её подписывать нам не надо. Как мне корректно подписать весь док за исключением Document/SinatureEnvlp/SignTags, с учетом, что SignTags я создаю на ходу? Что я делаю не так? При чем, если у нас уже создан SignTags, то всё ок, верификацию проходит, но если тега нет, то: июл 27, 2017 5:41:55 PM org.apache.xml.security.signature.XMLSignature checkSignatureValue WARNING: Signature verification failed. июл 27, 2017 5:41:55 PM XMLTwoSignDoc ver INFO: The XML signature is invalid (bad) Код:
static {
if (!XmlInit.isInitialized()) {
XmlInit.init();
}
}
public static void main(String[] args) {
try {
String testDoc = "XmlTwoDSig.xml";
String res = "result.xml";
String Id1 = "FirstSignature";
String signMethod = "http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411";
String digestMethod = "http://www.w3.org/2001/04/xmldsig-more#gostr3411";
JCPXMLDSigInit.init();
sign(Id1, signMethod, digestMethod, testDoc, res);
ver(res);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void sign(String Id1, String signMethod, String digestMethod, String testDoc, String signTwo) throws Exception {
KeyStore keyStore;
keyStore = KeyStore.getInstance(JCSP.REG_STORE_NAME, JCSP.PROVIDER_NAME);
keyStore.load(null, null);
X509Certificate cert = (X509Certificate) keyStore.getCertificate("TEST");
PrivateKey privateKey = (PrivateKey) keyStore.getKey("TEST", "password".toCharArray());
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setIgnoringElementContentWhitespace(true);
dbf.setCoalescing(true);
dbf.setNamespaceAware(true);
DocumentBuilder documentBuilder = dbf.newDocumentBuilder();
final Document doc;
doc = documentBuilder.parse(new FileInputStream(testDoc));
XMLSignature sig = new XMLSignature(doc, "", signMethod);
sig.setId(Id1);
Element aElement = (Element) XPathAPI.selectSingleNode(doc, "/*[name()='Document']/*[name()='SinatureEnvlp']");
Element splmtryData = doc.createElement("SignTags");
Element anElement = (Element) aElement.appendChild(splmtryData);
anElement.appendChild(sig.getElement());
Transforms transforms = new Transforms(doc);
transforms.addTransform(Transforms.TRANSFORM_ENVELOPED_SIGNATURE);
transforms.addTransform(Transforms.TRANSFORM_C14N_WITH_COMMENTS);
String[][] filters = {{XPath2FilterContainer.SUBTRACT, "/*[name()='Document']/*[name()='SinatureEnvlp']/*[name()='SignTags']"}};
transforms.addTransform(Transforms.TRANSFORM_XPATH2FILTER,
XPath2FilterContainer.newInstances(doc, filters));
sig.addDocument("", transforms, digestMethod);
sig.addKeyInfo(cert);
sig.sign(privateKey);
FileOutputStream os = new FileOutputStream(signTwo);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer trans = tf.newTransformer();
trans.transform(new DOMSource(doc), new StreamResult(os));
os.close();
}
public static void ver(String signTwo) throws Exception {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setIgnoringElementContentWhitespace(true);
dbf.setCoalescing(true);
dbf.setNamespaceAware(true);
DocumentBuilder documentBuilder = dbf.newDocumentBuilder();
final Document doc;
doc = documentBuilder.parse(new FileInputStream(signTwo));
Element nscontext = doc.createElementNS(null, "namespaceContext");
nscontext.setAttributeNS("http://www.w3.org/2000/xmlns/",
"xmlns:" + "ds".trim(), Constants.SignatureSpecNS);
Element sigElement = (Element) XPathAPI.selectSingleNode(doc, "//ds:Signature[@Id='FirstSignature']", nscontext);
XMLSignature signature = new XMLSignature(sigElement, "");
KeyInfo ki = signature.getKeyInfo();
X509Certificate certKey = ki.getX509Certificate();
if (certKey != null) {
Logger.getLogger("LOG").info("The XML signature is " +
(signature.checkSignatureValue(certKey)
? "valid (good)" : "invalid (bad)"));
} else {
PublicKey pk = ki.getPublicKey();
if (pk != null) {
Logger.getLogger("LOG")
.info("The XML signature is " +
(signature.checkSignatureValue(pk)
? "valid (good)" : "invalid (bad)"));
} else
throw new Exception("There are no information about public key. Verification couldn't be implemented");
}
}
|