javax.xml.crypto.dsig Validierung des öffentlichen Schlüssels in der Verwendung von XML

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

  •  10-10-2019
  •  | 
  •  

Frage

Mit javax.xml.crypto.dsig, wie kann ich Abstellungs und eine XML Signature validieren, ohne den öffentlichen Schlüssel zu spezifizieren? Der öffentliche Schlüssel wird in der signierten XML sein, aber ich kann nicht einen Weg finden, um es zu bekommen.

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

Soweit ich sagen kann, es ist notwendig, eine keySelector anstelle einen Schlüssel zum DOMValidateContext passieren. Allerdings kann ich nicht herausfinden, wie man eine keySelector implementieren.

Dies ist das einzige Beispiel, das ich gefunden habe, wie eine keySelector zu implementieren: http://download.oracle.com/javase /6/docs/technotes/guides/security/xmldsig/XMLDigitalSignature.html

Leider funktioniert es nicht. In dieser Ausführung hat es die folgenden, aber nicht immer, weil es keine KeyValue Elemente sind (es scheint, dass anstelle von KeyValue Elemente sind sie org.jcp.xml.dsig.internal.dom.DOMX509Data Elemente, die die nicht einen Weg ge haben Schlüssel von ihnen).

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!");

So ist es eine Möglichkeit, dies zu tun? Ich möchte in der Lage, die Signatur einer XML-Datei zu validieren, ohne den öffentlichen Schlüssel müssen. Ich will nur den öffentlichen Schlüssel aus der XML erhalten.

War es hilfreich?

Lösung

Erweitere if () Bedingung, die Sie, wenn xs zu sehen, haben die Überprüfung ist eine Instanz von KeyValue auch Instanz X509Data zu überprüfen, wie folgt:

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

Andere Tipps

sind nur xmldsig.jar auf Ihre Build-Pfad und überprüfen Sie das JDK von Ihnen für 1,5 Sie Ihren Build-Pfad hinzuzufügen haben 1,6 haben sie darin so dass keine Notwendigkeit für Verweis hinzuzufügen inbuilt http://java.sun.com/developer/technicalArticles/xml/dig_signature_api/

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top