2011-01-13 9 views
5

Mit javax.xml.crypto.dsig, wie kann ich eine XMLSignature entpacken und validieren, ohne den öffentlichen Schlüssel anzugeben? Der öffentliche Schlüssel scheint in der signierten XML-Datei enthalten zu sein, aber ich kann keinen Weg finden, sie zu erhalten.javax.xml.crypto.dsig Validierung mit dem öffentlichen Schlüssel in der XML

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. Ich kann jedoch nicht herausfinden, wie man einen KeySelector implementiert.

Hier 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 Implementierung wird Folgendes ausgeführt, aber es schlägt immer fehl, weil es keine KeyValue-Elemente gibt (es scheint, dass sie anstelle von KeyValue-Elementen org.jcp.xml.dsig.internal.dom.DOMX509Data-Elemente sind, die keine Möglichkeit haben, das Element zu bearbeiten 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!"); 

Also, gibt es eine Möglichkeit, dies zu tun? Ich möchte in der Lage sein, die Signatur einer XML-Datei zu validieren, ohne den öffentlichen Schlüssel zu haben. Ich möchte nur den öffentlichen Schlüssel von der XML bekommen.

Antwort

5

Erweitere if() Bedingung, die Sie überprüft, um zu sehen, ob xs eine Instanz von KeyValue ist auch Instanz von 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(); 
      } 
    } 
} 
+0

Hinweis hinzufügen, dass die 'X509Certificate' Klasse hier sein muß' java.security.cert .X509Certificate' und nicht 'javax.security.cert.X509Certificate'. –

Verwandte Themen