Проверка javax.xml.crypto.dsig с использованием открытого ключа в XML - PullRequest
5 голосов
/ 13 января 2011

Используя 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.

Ответы [ 2 ]

6 голосов
/ 10 марта 2011

Расширьте условие if (), которое вы проверяете, чтобы увидеть, является ли xs экземпляром KeyValue, чтобы также проверить экземпляр X509Data следующим образом:

else if (xs instanceof X509Data) {
     for (Object data : ((X509Data) xs).getContent()) {
          if (data instanceof X509Certificate) {
              pk = ((X509Certificate) data).getPublicKey();
          }
     }
}
1 голос
/ 07 декабря 2011

просто включите xmldsig.jar в свой путь сборки и проверьте свой JDK на 1.5, который вы должны добавить к своему пути сборки для 1.6 они встроены в него, поэтому не нужно добавлять для справки http://java.sun.com/developer/technicalArticles/xml/dig_signature_api/

...