Signature de fichier xml
Répondre à la discussion
Affichage des résultats 1 à 8 sur 8

Signature de fichier xml



  1. #1
    invite1451d22a

    Signature de fichier xml


    ------

    Bonjour, je dois signer un fichier XML à l'aide d'un certificat avec l'extension CER et uniquement avec cette extension.
    Jusqu'à maintenant, je me servais du store pour mes signatures, histoire de voir comment cela pouvait fonctionnait et mon code marche très bien, mais quand je veux me servir d'un fichier externe, mon programme plante et j'ai comme erreur "la clé de signature n'est pas chargée".

    Je génère des certificats de manière auto-signée, à l'aide de l'invite de commende de visual studio et j'entre la commande :

    makecert -n "CN=..., O=..., OU=..., C=PE" moncertificat.cer

    Dans mon code qui génère la signature du fichier XML, j'utilise une fonction ayant comme paramètre :

    - param_nomfichier de type string, contient le nom du fichier à signer sans l'extension

    - param_nomfichier de type string, contient le nom du fichier qui va être utilisé pour signer, contient l'extension

    - param_pwdcert de type string, contient le mot de passe du certificat utilisé.

    Ma fonction est codée ainsi:

    Code:
    Dim xmlFile As String = "TEMP\" & param_nomfichier & ".xml"
    Dim certificattrouve As Boolean = False
     
    Dim MonCertificat As X509Certificate2 = New X509Certificate2(param_certificate, param_pwdcert)
     
     
    'signature
    'Tout d'abord, il faut commencer par charger notre fichier XML.
    Dim xmlDoc As XmlDocument = New XmlDocument()
    xmlDoc.PreserveWhitespace = True
    xmlDoc.Load(xmlFile)
     
    'Maintenant nous allons créer un objet SignedXml portant sur le document XML que l'on veut signer.
    Dim signedXml As SignedXml = New SignedXml(xmlDoc)
     
    'On renseigne la clé à utiliser pour signer en indiquant la clé privée de notre certificat.
    signedXml.SigningKey = MonCertificat.PrivateKey
     
    'Puis on ajoute ensuite les informations du certificat afin de pouvoir vérifier la signature.
    'Dans notre exemple, les informations du certificat seront sous la forme de balises X509Data
    Dim KeyInfo As KeyInfo = New KeyInfo()
     
    'On crée un objet Reference qui permet de préciser les informations à signer.
    'Pour signer l'ensemble du document on utilise une chaîne vide comme référence.
    Dim Reference As Reference = New Reference()
    Reference.Uri = ""
     
    'On va maintenant ajouter une transformation pour indiquer qu'il s'agit d'une signature enveloppée.
    'Cette étape est très importante car cela permet de ne pas tenir compte des éléments Signature déjà
    'présents pour le calcul de l'empreinte.
    Reference.AddTransform(New XmlDsigEnvelopedSignatureTransform())
     
    'On ajoute la référence à l'objet SignedXml.
    signedXml.AddReference(Reference)
     
    Dim X509Chain As X509Chain = New X509Chain()
    X509Chain.Build(MonCertificat)
    For Each element As X509ChainElement In X509Chain.ChainElements
        Dim x509Data As KeyInfoX509Data = New KeyInfoX509Data(element.Certificate)
        Dim issuer As String = element.Certificate.Issuer
        'Dim subjectName As String = element.Certificate.IssuerName.ToString()
        Dim subjectName As String = element.Certificate.IssuerName.Name
     
        x509Data.AddSubjectName(subjectName)
        KeyInfo.AddClause(x509Data)
    Next
     
    signedXml.KeyInfo = KeyInfo
    signedXml.ComputeSignature()
     
    'On calcule la signature et on récupère le XML associé. 
    Dim signature As XmlElement = signedXml.GetXml()
     
    'On ajoute à la fin du document XML la signature générée puis on sauvegarde le document ainsi modifié.
    For Each node As XmlNode In signature.SelectNodes("descendant-or-self::*[namespace-uri()='http://www.w3.org/2000/09/xmldsig#']")
        node.Prefix = "ds"
        If node.LocalName = "Signature" Then
            Dim newAttribute As XmlAttribute = xmlDoc.CreateAttribute("Id")
            newAttribute.Value = "SignatureSP"
            node.Attributes.Append(newAttribute)
            'node.InsertAfter(node, node.LastChild)
        End If
        ' MsgBox(node.LocalName)
    Next node
     
    xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(signature, True))
    xmlDoc.Save(xmlFile)
    et elle plante en arrivant sur cette ligne:

    Code:
    signedXml.ComputeSignature()
    J'ai constaté que MonCertificat.PrivateKey n'avait pas de valeur, que dois-je faire?
    Merci

    -----

  2. #2
    invite1451d22a

    Re : Signature de fichier xml

    j'ai trouvé un moyen de générer une paire de clé et un certificat, à l'aide d'open ssl, je voudrais récupérer la clé privée qui se trouve dans un fichier avec l'extension KEY, je fais comment?
    Merci

  3. #3
    invite473b01b1

    Re : Signature de fichier xml

    Salut,

    En fait c'est ta ligne de commande "makecert" qui n'est pas complète pour générer un certificat contenant les infos de clés privées...

    Voir ici: makecert pour la liste des options.

  4. #4
    invite1451d22a

    Re : Signature de fichier xml

    Merci mais j'avais trouvé entre temps une autre solution, c'est de me servir d'openSSL

  5. A voir en vidéo sur Futura
  6. #5
    invite473b01b1

    Re : Signature de fichier xml

    Tu veux dire pour générer tes certifs ou juste pour générer la clé ?
    Car si tu génères un certificat complet avec makecert tu n'as plus besoin d'OpenSSL pour générer la clé...

    Tu dis avoir trouvé une solution, donc tu sais maintenant comment charger ta clé privée ?

  7. #6
    invite1451d22a

    Re : Signature de fichier xml

    le projet auquel je travaille est assez particulier, le contexte veut que je génère un fichier XML que je devrais signer, ensuite, je dois envoyer le XML via un web service mais avant de le faire, je dois avant tout mettre le certificat CER (et seulement au format CER) sur un compte personnel.
    Pendant plusieurs jours, je me servais d'openSSL afin de générer un certificat CER un fichier KEY contenant la clé privée mais j'avais comme soucis que je n'arrivais pas à lire cette clé privée. J'ai trouvé une astuce qui m'a bien aidé, c'est de me servir du certificat CER et de la clé KEY afin de les regrouper dans un certificat PFX, contenant tout les éléments dont j'aurais besoin, et donc, dans mon code, en ouvrant mon fichier PFX, j'aurais tout ce qui me faut pour signer mon XML et aussi, un certificat CER à mettre en ligne sur mon compte personnel, ce qui m'enlève ce soucis.
    Désormais, j'ai un autre soucis mais je ne pense pas que j'aurais ma réponse aussi facilement que ça, je n'arrive pas à mettre en ligne mon certificat CER et le message d'erreur n'est pas le même selon le navigateur que j'utilise, soit, mon accès est refusé, soit, je ne suis pas habilité à le faire, j'ai de la doc qui présente le tout mais c'est en espagnol

  8. #7
    invite473b01b1

    Re : Signature de fichier xml

    Ok je saisis mieux...

    Pour la publication du certificat difficile à dire, je peux te conseiller de lire cette page (en français !), mais il peut y avoir mille raisons pour qu'il soit rejeté...
    Ca peut aller de la validité du certificat à un problème de droit coté client...

  9. #8
    invite1451d22a

    Re : Signature de fichier xml

    j'ai un correspondant qui est en relation avec la société qui a mit en place le web service et on essaye de voir ensemble pourquoi j'ai ce soucis, sur mon compte personnel où je dois mettre en ligne mon certificat, je dois faire une demande de "solicitud" (je ne sais pas exactement ce que c'est, le traducteur parle de "dossier") et c'est encore en attente de validation (depuis 2 semaines).
    Je ne sais pas si mon soucis vient de là uniquement, ya aussi le fait qu'il y a 2 web services utilisables, l'un pour l'envoi en production et l'autre, pour l'envoi par processus d’homologation et je ne comprends pas la différence, je me suis servi seulement de celui qui envoi en production.

Discussions similaires

  1. Un logiciel qui permet de convertir un fichier en hexadécimal vers un fichier en decimal???
    Par invite3cd28103 dans le forum Logiciel - Software - Open Source
    Réponses: 4
    Dernier message: 08/06/2012, 14h07
  2. comment convertir un fichier binaire (8bits -numérique) en un fichier .wav ?
    Par invite3cd28103 dans le forum Programmation et langages, Algorithmique
    Réponses: 2
    Dernier message: 28/05/2012, 00h40
  3. ouvrir un fichier excel depuis un autre fichier avec VBA
    Par invite31937040 dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 24/04/2012, 13h44
  4. convertir un fichier solidworks vers un fichier .c openGL sous visual studio ?
    Par invitec871b1d7 dans le forum Programmation et langages, Algorithmique
    Réponses: 3
    Dernier message: 27/02/2012, 16h21
  5. comment faire pour transformer un fichier mac en fichier pc(windows)
    Par invite9d798579 dans le forum Logiciel - Software - Open Source
    Réponses: 5
    Dernier message: 27/01/2011, 16h27