IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Format d'échange (XML, JSON...) Java Discussion :

Signatures XMLDsig toujours invalides


Sujet :

Format d'échange (XML, JSON...) Java

  1. #1
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut Signatures XMLDsig toujours invalides
    Bonjour tout le monde !

    J'ai une Applet (un ? Je sais jamais) qui récupère des fichiers XML dans un répertoire passé en paramètre et je donne la possibilité à l'utilisateur de les signer au format XMLDSig, comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    String text = "Signature du fichier : " + toSignFile.getName();
    ConsoleJFrame.printMessageToConsole(text);
    AppletAWS.print(text);
    fireText(text);
     
    if (this.cert == null) {
        this.fireErrors(AppletAWS.getI18n("pkcs7.noCertCrypto"));
        Exception execpt = new Exception("Certificat inaccessible.");
        this.fireErreur(new Erreur(execpt, AppletAWS.getI18n("pkcs7.noCertCrypto")));
    }
     
    if (this.privatekey == null) {
    this.fireErrors(AppletAWS.getI18n("pkcs7.accessDeniedPrivateKey"));
        Exception execpt = new Exception("Clef privée inaccessible.");
        this.fireErreur(new Erreur(execpt, AppletAWS.getI18n("pkcs7.accessDeniedPrivateKey")));
    }
     
    XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM");
     
    // Create a Reference to the enveloped document (in this case,
    // you are signing the whole document, so a URI of "" signifies
    // that, and also specify the SHA1 digest algorithm and
    // the ENVELOPED Transform.
    Reference ref = fac.newReference(
        "",
        fac.newDigestMethod(DigestMethod.SHA1, null),
        Collections.singletonList(fac.newTransform(Transform.ENVELOPED, (TransformParameterSpec) null)),
        null,
        null
    );
    // Create the SignedInfo.
    SignedInfo si = fac.newSignedInfo(
        fac.newCanonicalizationMethod(CanonicalizationMethod.INCLUSIVE, (C14NMethodParameterSpec) null),
        fac.newSignatureMethod(SignatureMethod.RSA_SHA1, null),
        Collections.singletonList(ref)
    );
     
    // Create the KeyInfo containing the X509Data.
    KeyInfoFactory kif = fac.getKeyInfoFactory();
    List x509Content = new ArrayList();
    x509Content.add(this.cert.getSubjectX500Principal().getName());
    x509Content.add(this.cert);
    X509Data xd = kif.newX509Data(x509Content);
    KeyInfo ki = kif.newKeyInfo(Collections.singletonList(xd));
     
    System.out.println("Traitement du XML...");
     
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    dbf.setNamespaceAware(true);
    DocumentBuilder db = dbf.newDocumentBuilder();
    org.w3c.dom.Document doc = db.parse(this.toSignFile);
     
    DOMBuilder builder = new DOMBuilder();
    Document docSigned = builder.build(doc);
     
    Format form = Format.getPrettyFormat();
    form.setIndent("\t");
    form.setLineSeparator("\n");          
     
    //            XMLOutputter outp = new XMLOutputter();
    //            FileOutputStream fOut = new FileOutputStream(this.toSignFile);
    //            outp.setFormat(form);
    //            outp.output(docSigned, fOut);
    //            fOut.close
     
    doc = db.parse(this.toSignFile);
     
    // Create a DOMSignContext and specify the RSA PrivateKey and
    // location of the resulting XMLSignature's parent element.
    DOMSignContext dsc		= new DOMSignContext(this.privatekey, doc.getDocumentElement());
    XMLSignature signature	= fac.newXMLSignature(si, ki); // Create the XMLSignature, but don't sign it yet.
    signature.sign(dsc); // Marshal, generate, and sign the enveloped signature.
     
    TransformerFactory tf = TransformerFactory.newInstance();
    tf.newTransformer().transform(new DOMSource(doc), new StreamResult(this.toSignFile));
    La signature s'effectue sans souci (quand je vais voir dans les fichiers XML, je retrouve bien l'élément signature) mais la validation de la signature me retourne false à chaque fois. Du coup, j'ai trouvé sur le net un moyen de voir pourquoi cette validation est à false :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    /**
     * Je récupère la signature depuis mon fichier XML, tout ça, tout ça... [...]
     */
    boolean coreValidity = signature.validate(valContext); // Validate the XMLSignature.
     
    // Check core validation status.
    if (!coreValidity) {
        System.err.println("\nSignature failed core validation");
        boolean sv = signature.getSignatureValue().validate(valContext);
        System.out.println("Signature validation status: " + sv);
     
        if (!sv) {
            // Check the validation status of each Reference.
            Iterator iter = signature.getSignedInfo().getReferences().iterator();
            for (int j = 0; iter.hasNext(); j++) {
                Reference refer = (Reference) iter.next();
                boolean refValid = refer.validate(valContext);
                retour += "\tRéférence : " + refer.getId() + " - " + refer.getType() + " - " + refer.getURI() + " ; Status : " + refValid + "\n";
            }
     
            this.checkList.add(false);
            rapport.setEtat(Constantes.SIGN_INVALID);
            sign.setStatut(Constantes.SIGN_INVALID);
        }
    }
    else {
        System.err.println("Signature succeed core validation");
        retour = AppletAWS.getI18n("pkcs7.verif.success");
        this.checkList.add(true);
        rapport.setEtat(Constantes.SIGN_VALID);
        sign.setStatut(Constantes.SIGN_VALID);
    }
    Et là, à chaque fois, ma variable sv me renvoie true. Est-ce que ça signifie que ma signature est en fait validée ? Je me demande vu que je fais le test sur la valeur de la signature (signature.getSignatureValue().validate(valContext))...

    Si ce n'est pas le cas, est-ce que quelqu'un pourrait me dire pourquoi ma signature n'est pas validée ? Ou un moyen d'en déterminer la cause ?

    Merci d'avance.

    DarkSeiryu

  2. #2
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    Re'.

    Du coup, j'ai fait une petite modif' du code pour quand la signature est décrétée invalide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    boolean coreValidity = signature.validate(valContext); // Validate the XMLSignature.
     
    // Check core validation status.
    if (!coreValidity) {
        AppletAWS.err("\nSignature XML invalide, on essaie d'en déterminer la cause :");
     
        // Validation de la valeur de la signature.
        retour += "- Validation de la valeur de la signature : " + signature.getSignatureValue().validate(valContext) + "\n";
     
        // Vérifie l'état de validation de chaque Reference.
        Iterator iter = signature.getSignedInfo().getReferences().iterator();
        AppletAWS.print("Validation des références une à une :\n");
        for (int j = 0; iter.hasNext(); j++) {
            Reference refer = (Reference) iter.next();
            boolean refValid = refer.validate(valContext);
            retour += "\t- Référence " + j + ") " + refer.getId() + " - " + refer.getType() + " - " + refer.getURI() + " ; STATUS : " + refValid + "\n";
        }
     
        AppletAWS.err(retour);
     
        this.checkList.add(false);
        rapport.setEtat(Constantes.SIGN_INVALID);
        sign.setStatut(Constantes.SIGN_INVALID);
    }
    else {
        AppletAWS.err("Signature succeed core validation");
        retour = AppletAWS.getI18n("pkcs7.verif.success");
        this.checkList.add(true);
        rapport.setEtat(Constantes.SIGN_VALID);
        sign.setStatut(Constantes.SIGN_VALID);
    }
    Et du coup, la console me retourne :
    Signature XML invalide, on essaie d'en déterminer la cause :
    - Validation de la valeur de la signature : true
    - Validation des références une à une :
    - Référence 0) null - null - ; STATUS : false
    Du coup, ma nouvelle question est comment résoudre ce problème de Reference ? Déjà, qu'est-ce qu'une Reference (j'vais regarder de mon côté ^^) ?

    Merchi bôcoup d'avanche !

    DarkSeiryu

  3. #3
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    Alors, j'ai trouvé pourquoi, mais j'comprends quand même pas trop... Ca semble venir de mon fichier XML qui était en ISO-8859-1. En le mettant en UTF-8 ça passe.
    Mais ce que je ne comprends pas, c'est que quand je mets un autre fichier, qui à la base était UTF-8 et dont la signature était valide, en ISO-8859-1, ben la signature est quand même valide...

    Si quelqu'un a une idée du pourquoi du comment, je suis tout ouïe.

Discussions similaires

  1. Signature électronique de documents (XMLdsig?)
    Par Bartuk dans le forum Sécurité
    Réponses: 4
    Dernier message: 02/05/2013, 23h59
  2. Signature numerique avec XMLDSIG
    Par makavelli2007 dans le forum Sécurité
    Réponses: 4
    Dernier message: 29/09/2010, 18h30
  3. [Toutes versions] Signature n'apparait pas toujours
    Par pantouane dans le forum Outlook
    Réponses: 0
    Dernier message: 18/09/2009, 14h36
  4. Invalid header signature avec HSSF
    Par olontsotra dans le forum Documents
    Réponses: 1
    Dernier message: 29/05/2007, 08h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo