Используя javax.xml.crypto.dsig, как мне разобрать и проверить XMLSignature без указания открытого ключа?Открытый ключ, похоже, находится в подписанном xml, но я не могу найти способ его получить.
DOMValidateContext valContext = new DOMValidateContext(key,signatureNode);
XMLSignature signature = fac.unmarshalXMLSignature(valContext);
boolean coreValidity = signature.validate(valContext);
Насколько я могу судить, необходимо передать KeySelector вместо Key toDOMValidateContext.Однако я не могу понять, как реализовать KeySelector.
Вот единственный пример, который я нашел о том, как реализовать KeySelector: http://download.oracle.com/javase/6/docs/technotes/guides/security/xmldsig/XMLDigitalSignature.html
К сожалению, это не такРабота.В этой реализации он выполняет следующее, но всегда терпит неудачу, потому что нет элементов KeyValue (кажется, что вместо элементов KeyValue они являются элементами org.jcp.xml.dsig.internal.dom.DOMX509Data, которые не могут получитьключ от них).
List list = keyInfo.getContent();
for (int i = 0; i < list.size(); i++) {
XMLStructure xs = (XMLStructure) list.get(i);
if(xs instanceof KeyValue) {
PublicKey pk = null;
try {
pk = ((KeyValue) xs).getPublicKey();
} catch (KeyException ke) {
throw new KeySelectorException(ke);
}
// make sure algorithm is compatible with method
if (algEquals(sm.getAlgorithm(), pk.getAlgorithm())) {
return new SimpleKeySelectorResult(pk);
}
}
}
throw new KeySelectorException("No KeyValue element found!");
Итак, есть ли способ сделать это?Я хочу иметь возможность проверить подпись XML-файла без необходимости иметь открытый ключ.Я просто хочу получить открытый ключ из XML.