validation javax.xml.crypto.dsig utilisant la clé publique dans le fichier XML

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

  •  10-10-2019
  •  | 
  •  

Question

Utilisation javax.xml.crypto.dsig, comment puis-je unmarshal et valider un sans préciser la XML Signature clé publique? La clé publique semble être dans le fichier XML signé, mais je ne peux pas trouver un moyen de l'obtenir.

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

Pour autant que je peux dire qu'il est nécessaire de passer un KeySelector au lieu d'une clé du DOMValidateContext. Cependant, je ne peux pas comprendre comment implémenter un KeySelector.

Voici le seul exemple que j'ai trouvé sur la façon de mettre en œuvre un KeySelector:      http://download.oracle.com/javase /6/docs/technotes/guides/security/xmldsig/XMLDigitalSignature.html

Malheureusement, il ne fonctionne pas. Dans cette mise en œuvre, il fait ce qui suit, mais échoue toujours parce qu'il n'y a pas d'éléments KeyValue (il apparaît que, au lieu d'éléments KeyValue ce sont des éléments org.jcp.xml.dsig.internal.dom.DOMX509Data qui ne disposent pas d'un moyen de la ge clé d'eux).

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

Alors, est-il un moyen de le faire? Je veux être en mesure de valider la signature d'un fichier xml sans avoir à la clé publique. Je veux juste obtenir la clé publique du xml.

Était-ce utile?

La solution

Étendre la condition if () que vous avez vérifier si xs est une instance de KeyValue également vérifier instance de X509Data comme suit:

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

Autres conseils

il suffit d'inclure xmldsig.jar à votre chemin de construction et vérifiez la JDK de la vôtre pour 1.5, vous devez ajouter à votre chemin de construction pour 1,6 qu'ils ont intégré en elle donc pas besoin d'ajouter de référence http://java.sun.com/developer/technicalArticles/xml/dig_signature_api/

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top