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

StackOverflow https://stackoverflow.com/questions/4675854

  •  10-10-2019
  •  | 
  •  

Вопрос

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

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

Насколько я могу судить, необходимо передать Keyselector, а не ключ к DomvalidateContext. Тем не менее, я не могу понять, как реализовать Keyselector.

Вот единственный пример, который я нашел о том, как реализовать Keyselector: http://download.oracle.com/javase/6/docs/technotes/guides/security/xmldsig/xmldigitalsignature.html

К сожалению, это не работает. В этой реализации он выполняет следующее, но всегда терпит неудачу, потому что нет элементов ключей (кажется, что вместо элементов Keyvalue они являются org.jcp.xml.dsig.internal.dom.domx509Data, которые не имеют пути для GE ключ от них).

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.

Это было полезно?

Решение

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

else if (xs instanceof X509Data) {
     for (Object data : ((X509Data) xs).getContent()) {
          if (data instanceof X509Certificate) {
              pk = ((X509Certificate) data).getPublicKey();
          }
     }
}

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top