javax.xml.crypto.dsig проверка с использованием открытого ключа в xml

Как с помощью javax.xml.crypto.dsig демаршалировать и проверить XMLSignature без указания открытого ключа? Открытый ключ находится в подписанном xml, но я не могу придумать, как его получить.

DOMValidateContext valContext = new DOMValidateContext(key,signatureNode);
XMLSignature signature = fac.unmarshalXMLSignature(valContext);
boolean coreValidity = signature.validate(valContext);

Насколько я могу судить, необходимо передать KeySelector вместо Key в DOMValidateContext. Однако я не могу понять, как реализовать KeySelector.

Вот единственный найденный мной пример реализации KeySelector: как мне демаршалировать и проверить XMLSignature без указания открытого ключа? Открытый ключ находится в подписанном xml, но я не могу придумать, как его получить.

DOMValidateContext valContext = new DOMValidateContext(key,signatureNode);
XMLSignature signature = fac.unmarshalXMLSignature(valContext);
boolean coreValidity = signature.validate(valContext);

Насколько я могу судить, необходимо передать KeySelector вместо Key в DOMValidateContext. Однако я не могу понять, как реализовать KeySelector.

Вот единственный найденный мной пример реализации KeySelector: как мне демаршалировать и проверить XMLSignature без указания открытого ключа? Открытый ключ находится в подписанном xml, но я не могу придумать, как его получить.

DOMValidateContext valContext = new DOMValidateContext(key,signatureNode);
XMLSignature signature = fac.unmarshalXMLSignature(valContext);
boolean coreValidity = signature.validate(valContext);

Насколько я могу судить, необходимо передать KeySelector вместо Key в DOMValidateContext. Однако я не могу понять, как реализовать 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.

5
задан Perception 5 August 2011 в 15:43
поделиться