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 :

Récupération Certificat d'un document XML


Sujet :

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

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 27
    Par défaut Récupération Certificat d'un document XML
    Bonjour,

    j'ai un document XML signé. La signature que j'utilise est une signature enveloppé. A l'interieur de mon document xml, j'ai donc mon certificat stocké dans la balise <X509Date><X509Certificate>.
    Comment puis-je faire pour récupérer mon certificat sous forme d'objet X509Certificate?

    J'utilise JDOM pour parser mon document xml, et je récupère donc mon certificat sous forme de string ou d'élément. Mais je ne vois pas comment faire pour avoir mon objet X509Certificate.

    merci pour vos réponse

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut,

    Le certificat doit surement être encodé en PEM ou DER en Base64. Tu peux nous donner un exemple de ce qui est affiché ?
    Sinon regarde du côté de CertificateFactory, et notamment la méthode generateCertificate : http://java.sun.com/javase/6/docs/ap...io.InputStream)

    Bon courage

  3. #3
    Expert confirmé
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 419
    Par défaut
    Ben déjà il faut savoir comment sont stockées les données du certificat à l'intérieur de ta balise. Je pencherais pour un encodage en Base64 mais ça pourrait être autre chose que je ne connais pas.

    Donc supposons qu'il soit encodé, ben tu le décodes.

    Ensuite un ByteArrayInputStream avec comme source de données le résultat du décodage sous forme de tableau de byte.
    Ensuite tu utilises la classe CertificateFactory.

    Ca pourrait donner un truc dans ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ByteArrayInputStream bais = new ByteArrayInputStream(LeTableauDeByte);
    CertificateFactory cf = CertificateFactory.getInstance("X.509");
    X509Certificate x509 = (X509Certificate)cf.generateCertificate(bais);
    bais.close();
    Et tu te retrouves donc avec une instance de l'interface X509Certificate contenant ton certificat.

  4. #4
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Par défaut
    si tu récupère bien ton certificat contenu dans une String

    je en pense pas que ce soit la meilleur solution mais tu peut toujours essayer d'écrire ton string dans un fichier (avec les bufferedWriter et tout ce qui va avec) tu enregistre le tout dans un .cer par exemple (ou autre extension de certificat que tu préfère ^^)

    ensuite tu instancie ton certificat au format X509 comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    InputStream inStream = new FileInputStream("chemin/ver/certificat");
    			CertificateFactory cf = CertificateFactory.getInstance("X.509");
    			X509Certificate cert = (X509Certificate)cf.generateCertificate(inStream);
    Je ferai quelque chose de ce genre même si il doit y avoir moyen de faire moins bidouille à mon avis (attendons que george7 et/ou Marco46 passe par là ^^)

    edit : grillé par les deux en même temps !!

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Marco46 Voir le message
    Ben déjà il faut savoir comment sont stockées les données du certificat à l'intérieur de ta balise. Je pencherais pour un encodage en Base64 mais ça pourrait être autre chose que je ne connais pas.

    Donc supposons qu'il soit encodé, ben tu le décodes.

    Ensuite un ByteArrayInputStream avec comme source de données le résultat du décodage sous forme de tableau de byte.
    Il doit eme pas y avoir besoin de le décoder car apparemment la méthode supporte un certificat encodé en Base64 si les balises de début et de fin sont présentes (du DER en base64 quoi ). On épargne ainsi une lib permettant de décoder la base64
    Mais sinon ouais c'est ce que tu as dit.

    Citation Envoyé par javadoc
    In the case of a certificate factory for X.509 certificates, the certificate provided in inStream must be DER-encoded and may be supplied in binary or printable (Base64) encoding. If the certificate is provided in Base64 encoding, it must be bounded at the beginning by -----BEGIN CERTIFICATE-----, and must be bounded at the end by -----END CERTIFICATE-----.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 27
    Par défaut
    Déjà merci a vous pour vos réponse.
    Effectivement j'avais vu la méthode generateCertificate de la classe CertificateFactory mais je tombais toujours sur une erreur.
    En fait je n'avais pas pensé à faire le décodage base64.

    J'ai donc cette fois-ci utilisais le décodage comme me la précisé Marco46.

    voici donc ce que j'ai fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    byte[] certDecode = Base64.decode(certStr.getBytes());
    ByteArrayInputStream certIs = new ByteArrayInputStream(certDecode);
    CertificateFactory cf = CertificateFactory.getInstance("X.509");
    X509Certificate certificate = (X509Certificate) cf.generateCertificate(certIs);
    certIs.close();
    Je pense que je ne dois pas être loin de la solution mais cela ne marche pas encore totalement. En fait si je met "cf.generateCertificate(certIs)" dans mon debugger je vois bien mon certificat. Mais si j'exécute ma ligne :
    X509Certificate certificate = (X509Certificate) cf.generateCertificate(certIs);
    j'ai l'erreur suivante :
    An exception occurred: java.security.cert.CertificateException
    Je ne comprend pas bien ce qu'il se passe. J'ai l'impression que c'est au moment du cast que l'erreur intervient.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 27
    Par défaut
    En fait je récupère un objet X509CertImpl et non un objet Certificate. Or je travaille avec un jdk/jre 1.5 et j'ai l'impression que cette classe est uniquement avec une jre 1.6 (dans le jar rt.jar)
    Je ne vois pas trop comment faire....

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 27
    Par défaut
    ah non rien a voir étant donné que l'objet X509CertImpl hérite de l'objet X509Certificat.

    En fait j'avais pas vu mais l'erreur exact que j'ai est celle la :

    Could not parse certificate: java.io.IOException: DerInputStream.getLength(): lengthTag=127, too big.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par dormouse Voir le message
    ah non rien a voir étant donné que l'objet X509CertImpl hérite de l'objet X509Certificat.

    En fait j'avais pas vu mais l'erreur exact que j'ai est celle la :
    Tu es sûr de ton certificat dans le XML ? on peut le voir ?

  10. #10
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Par défaut
    j'aurai bien dit une erreur de décodage de ton certificat ?

    faudrait voit a quoi il ressemble

    edit : encore grillé, c'est la journée !

  11. #11
    Expert confirmé
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 419
    Par défaut
    C'est normal pour le X509CertImpl. C'est l'implémentation de la classe abstraite (et pas interface me suis gourré) X509Certificate donné par la factory.

    Si tu ne comprends pas de quoi je parle, regarde du côté de ce tuto par exemple.

    Sinon, j'aimerais bien avoir le code source de ton XML, ça permettrait de déterminer le format d'origine.

    Tu ne devrais pas avoir besoin de décoder manuellement la base64 comme te l'as dit George7, la factory décode si nécessaire toute seule.

    Ton dernier message d'erreur doit signifier que les données qui sont interprétées comme un encodage DER ne sont pas au format DER.

    Donc ... Fais voir la tête de ta balise <X509Certificate>.

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 21
    Par défaut
    Pour la gestion des signature XML je renvoi encore une fois sur la doc de sun:

    http://java.sun.com/developer/techni...signature_api/

    Lorsqu'il existe une API pourquoi réinventer la roue

  13. #13
    Expert confirmé
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 419
    Par défaut
    xD

    Bah au moins il est sûr qu'on lui dit pas de conn.... vu qu'à chaque question qu'il pose il a 3 fois la même réponse exprimée différemment

    @ajmaster

    Merci je connaissais pas ça à l'air excellent comme lib.

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 27
    Par défaut
    voici ce que j'ai dans ma balise X509Certificate

    <ds:X509Certificate xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    MIICxzCCAnGgAwIBAgICANswDQYJKoZIhvcNAQEFBQAwWTELMAkGA1UEBhMCRlIxDjAMBgNVBAcT
    BVBhcmlzMQ0wCwYDVQQKEwRJbGV4MREwDwYDVQQLEwhTZXJ2aWNlczEYMBYGA1UEAxMPQ0EgSWxl
    eCBkZSB0ZXN0MB4XDTA2MTExNjEzNDU0NloXDTE2MTExMzEzNDU0NlowZjELMAkGA1UEBhMCRlIx
    DjAMBgNVBAcTBVBhcmlzMQ0wCwYDVQQKEwRJbGV4MREwDwYDVQQLEwhTZXJ2aWNlczERMA8GA1UE
    CxMIQXBwbGF0b28xEjAQBgNVBAMTCUFwcGxhdG9vMzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC
    gYEAzL9NjcvvpFy5/01YmwCB/mqlgic010b1rXs+V7YNFGBi71D4g1XI/6a/RwQlgmfyXhZrHTI2
    uUCq1ZvZDStZu/ohGXXFoo6Oi0eqYjBk4jEhjHIC4/+w6ORypCKsO+ZISo4MvGXuGKecZQ4Q6JqN
    j870PK6/4nsmpVEEZwd3HbMCAwEAAaOB0TCBzjAOBgNVHQ8BAf8EBAMCBeAwIAYDVR0OAQEABBYE
    FL7Cf0JDmFLRvFvD1V2+cfi0PC+1MIGBBgNVHSMEejB4gBRlBJOwGwKVAhILmXMCwJt9Tz0TbaFd
    pFswWTELMAkGA1UEBhMCRlIxDjAMBgNVBAcTBVBhcmlzMQ0wCwYDVQQKEwRJbGV4MREwDwYDVQQL
    EwhTZXJ2aWNlczEYMBYGA1UEAxMPQ0EgSWxleCBkZSB0ZXN0ggEAMBYGA1UdJQEBAAQMMAoGCCsG
    AQUFBwMEMA0GCSqGSIb3DQEBBQUAA0EAc3jAWJoM1d6fhBs6/jqIAKR62PNaseitPJ+JSGUUg4PK
    fl2slcvSc5TqHUSckJiR2lTm/COXgGqhrKI5MCOywA==
    </ds:X509Certificate>

  15. #15
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Par défaut
    sa ressemble bien a un fichier certificat sans les balise BEGIN CERTIFICATE et END CERTIFICATE

    il devrait etre du genre
    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
     
    -----BEGIN CERTIFICATE-----
    MIICxzCCAnGgAwIBAgICANswDQYJKoZIhvcNAQEFBQAwWTELMAkGA1UEBhMCRlIxDjAMBgNVBAcT
    BVBhcmlzMQ0wCwYDVQQKEwRJbGV4MREwDwYDVQQLEwhTZXJ2aWNlczEYMBYGA1UEAxMPQ0EgSWxl
    eCBkZSB0ZXN0MB4XDTA2MTExNjEzNDU0NloXDTE2MTExMzEzNDU0NlowZjELMAkGA1UEBhMCRlIx
    DjAMBgNVBAcTBVBhcmlzMQ0wCwYDVQQKEwRJbGV4MREwDwYDVQQLEwhTZXJ2aWNlczERMA8GA1UE
    CxMIQXBwbGF0b28xEjAQBgNVBAMTCUFwcGxhdG9vMzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC
    gYEAzL9NjcvvpFy5/01YmwCB/mqlgic010b1rXs+V7YNFGBi71D4g1XI/6a/RwQlgmfyXhZrHTI2
    uUCq1ZvZDStZu/ohGXXFoo6Oi0eqYjBk4jEhjHIC4/+w6ORypCKsO+ZISo4MvGXuGKecZQ4Q6JqN
    j870PK6/4nsmpVEEZwd3HbMCAwEAAaOB0TCBzjAOBgNVHQ8BAf8EBAMCBeAwIAYDVR0OAQEABBYE
    FL7Cf0JDmFLRvFvD1V2+cfi0PC+1MIGBBgNVHSMEejB4gBRlBJOwGwKVAhILmXMCwJt9Tz0TbaFd
    pFswWTELMAkGA1UEBhMCRlIxDjAMBgNVBAcTBVBhcmlzMQ0wCwYDVQQKEwRJbGV4MREwDwYDVQQL
    EwhTZXJ2aWNlczEYMBYGA1UEAxMPQ0EgSWxleCBkZSB0ZXN0ggEAMBYGA1UdJQEBAAQMMAoGCCsG
    AQUFBwMEMA0GCSqGSIb3DQEBBQUAA0EAc3jAWJoM1d6fhBs6/jqIAKR62PNaseitPJ+JSGUUg4PK
    fl2slcvSc5TqHUSckJiR2lTm/COXgGqhrKI5MCOywA==
    -----END CERTIFICATE-----
    pour l'encodage c'est du base64 ca ? enfin avec tout ces problème de format c'est quoi déjà la différence entre le DER encoded et le base64 ? (le DER est une suite ASN1 alors que le base 64 c'est du DER encodé ensuite sur 64 caractère ?)

  16. #16
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par deglingo592003 Voir le message
    sa ressemble bien a un fichier certificat sans les balise BEGIN CERTIFICATE et END CERTIFICATE

    il devrait etre du genre
    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
     
    -----BEGIN CERTIFICATE-----
    MIICxzCCAnGgAwIBAgICANswDQYJKoZIhvcNAQEFBQAwWTELMAkGA1UEBhMCRlIxDjAMBgNVBAcT
    BVBhcmlzMQ0wCwYDVQQKEwRJbGV4MREwDwYDVQQLEwhTZXJ2aWNlczEYMBYGA1UEAxMPQ0EgSWxl
    eCBkZSB0ZXN0MB4XDTA2MTExNjEzNDU0NloXDTE2MTExMzEzNDU0NlowZjELMAkGA1UEBhMCRlIx
    DjAMBgNVBAcTBVBhcmlzMQ0wCwYDVQQKEwRJbGV4MREwDwYDVQQLEwhTZXJ2aWNlczERMA8GA1UE
    CxMIQXBwbGF0b28xEjAQBgNVBAMTCUFwcGxhdG9vMzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC
    gYEAzL9NjcvvpFy5/01YmwCB/mqlgic010b1rXs+V7YNFGBi71D4g1XI/6a/RwQlgmfyXhZrHTI2
    uUCq1ZvZDStZu/ohGXXFoo6Oi0eqYjBk4jEhjHIC4/+w6ORypCKsO+ZISo4MvGXuGKecZQ4Q6JqN
    j870PK6/4nsmpVEEZwd3HbMCAwEAAaOB0TCBzjAOBgNVHQ8BAf8EBAMCBeAwIAYDVR0OAQEABBYE
    FL7Cf0JDmFLRvFvD1V2+cfi0PC+1MIGBBgNVHSMEejB4gBRlBJOwGwKVAhILmXMCwJt9Tz0TbaFd
    pFswWTELMAkGA1UEBhMCRlIxDjAMBgNVBAcTBVBhcmlzMQ0wCwYDVQQKEwRJbGV4MREwDwYDVQQL
    EwhTZXJ2aWNlczEYMBYGA1UEAxMPQ0EgSWxleCBkZSB0ZXN0ggEAMBYGA1UdJQEBAAQMMAoGCCsG
    AQUFBwMEMA0GCSqGSIb3DQEBBQUAA0EAc3jAWJoM1d6fhBs6/jqIAKR62PNaseitPJ+JSGUUg4PK
    fl2slcvSc5TqHUSckJiR2lTm/COXgGqhrKI5MCOywA==
    -----END CERTIFICATE-----
    pour l'encodage c'est du base64 ca ? enfin avec tout ces problème de format c'est quoi déjà la différence entre le DER encoded et le base64 ? (le DER est une suite ASN1 alors que le base 64 c'est du DER encodé ensuite sur 64 caractère ?)
    Oui c'est de la base 64 et ça à l'air beau à première vue (commence par "MII" déjà c'est bon signe...)
    La base 64 c'est une façon d'encoder une suite d'octets sur 64 caractères on va dire (et un joker "="). D'après la documentation il faut les balises de début et de fin comme a dit deglingo592003, ceci dit pas besoinde changer ton xml, tu peux les ajouter dans ton code si tu sais qu'elle ne sont pas là.
    Ensuite je ne sais pas si le certificat est vraiment valide. Je n'ai pas trop le temps de regarder tout de suite, mais peut-être Marco ou deglingo pourront te répondre. Sinon regarde la lib donnée par ajmaster, ça t'évitera surement du boulot

  17. #17
    Expert confirmé
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 419
    Par défaut
    Le certificat est valide. Il suffit de copier coller la partie encodée en b64 dans notepad++ (tout le monde devrait avoir cette appli !) puis de la décoder et ensuite d'enregistrer le résultat obtenu dans un fichier que l'on termine par .cer

    Il ne reste plus qu'à double cliquer dessus (s'il on est sous Windows) et il est ouvert correctement dans la fenêtre habituelle.

    Sinon pour la lib de ajmaster je constate que la balise que tu nous montres pointe sur le même espace de nom (attribut xlmns) que ceux donnés dans les exemples du site de Sun. Donc essaye plutôt d'utiliser l'API de Sun !

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 27
    Par défaut
    c'est bon j'ai compris d'où venait mon erreur.

    Le fait d'avoir mis
    cf.generateCertificate(bais)
    dans mon debugger faisait que lorsque ça s'exécutait par la suite j'avais une erreur.

    Je l'ai enlevé de mon debugger et tout marche bien

  19. #19
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Marco46 Voir le message
    Le certificat est valide. Il suffit de copier coller la partie encodée en b64 dans notepad++ (tout le monde devrait avoir cette appli !)
    Je corrige... il suffit de copier coller la partie encodée en b64 dans (g)vim (tout le monde devrait avoir cette appli !)

    Pour l'API, il est surement mieux de ne pas le faire à la main mais d'utiliser (surtout que ça semble intégré dans le JRE donc autant en profiter ). ça fera surement des vérifications comme il faut que tu oublierais peut-être de faire à la main, notamment sur la structure du fichier, des données présentes, etc, etc...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JDOM] Récupération des feuilles dans un document XML
    Par imenblue dans le forum Format d'échange (XML, JSON...)
    Réponses: 10
    Dernier message: 01/05/2011, 00h48
  2. Récupération de document XML partiel
    Par Lorenzaccio dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 21/03/2011, 22h04
  3. Document xml incorrect, récupération du keyref fautif
    Par coco62 dans le forum XML/XSL et SOAP
    Réponses: 0
    Dernier message: 29/10/2010, 14h34
  4. Stocker du texte mis en forme dans un document XML
    Par ovh dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 13/02/2003, 10h23
  5. pb formatage document XML généré par un dom tree
    Par lionel69 dans le forum APIs
    Réponses: 11
    Dernier message: 17/10/2002, 09h53

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