Domanda

Utilizzando javax.xml.crypto.dsig, come faccio unmarshal e validare un XMLSignature senza specificare la chiave pubblica? La chiave pubblica sembra essere nel xml firmato, ma non riesco a trovare un modo per farlo.

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

Per quanto posso dire che è necessario passare un KeySelector invece di una chiave per la DOMValidateContext. Tuttavia, non riesco a capire come implementare una KeySelector.

Ecco l'unico esempio che ho trovato su come implementare un KeySelector: http://download.oracle.com/javase /6/docs/technotes/guides/security/xmldsig/XMLDigitalSignature.html

Purtroppo non funziona. In tale implementazione fa seguito però non sempre perché non ci sono elementi KEYVALUE (sembra che invece di elementi KEYVALUE sono elementi org.jcp.xml.dsig.internal.dom.DOMX509Data che non hanno un modo per ge la chiave da loro).

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

Quindi, c'è un modo per fare questo? Voglio essere in grado di convalidare la firma di un file XML senza dover avere la chiave pubblica. Voglio solo per ottenere la chiave pubblica dal xml.

È stato utile?

Soluzione

Estendere la condizione if () avete controllo per vedere se xs è un esempio di KeyValue a controllare anche istanza di X509Data come segue:

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

Altri suggerimenti

semplicemente includere xmldsig.jar al vostro percorso di generazione e controllare la JDK di tuo per 1,5 si deve aggiungere al vostro percorso di generazione per 1.6 che hanno integrato in modo non c'è bisogno di aggiungere per riferimento http://java.sun.com/developer/technicalArticles/xml/dig_signature_api/

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top