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

VB.NET Discussion :

Signer un document XML


Sujet :

VB.NET

  1. #1
    Invité
    Invité(e)
    Par défaut Signer un document XML
    Bonjour,

    J'ai besoin de signer un document, j'ai trouvé ce tuto assez intéressant sur la signature d'un fichier xml, j'ai réussi à la placer au bon endroit, mais je rencontre désormais le problème que le fichier a été altéré.
    Le document que je dois signé est accessible via ce lien, la signature se trouve à l'adresse suivante:
    Invoice/ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent

    Voici mon code:

    Code VB : 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
    76
    77
    78
    79
    80
    81
    Dim f_adresse As String = System.AppDomain.CurrentDomain.BaseDirectory
           Dim f_temp As String = f_adresse & "TEMP\"
           Dim f_fichier As String = "20381235051-01-FF11-04.xml"
           Dim f_certificat As String = f_adresse & "aG9CcVpHVndCWTd3WlVOVw==.p12"
           Dim f_pwd As String = "xxxxxxxxxxxx"
     
           Dim xmlFile As String = f_temp & f_fichier
     
           Dim MonCertificat As X509Certificate2 = New X509Certificate2(f_certificat, f_pwd)
     
           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)
     
           Dim local_element As X509ChainElement = X509Chain.ChainElements(0)
           Dim x509Data As KeyInfoX509Data = New KeyInfoX509Data(local_element.Certificate)
           Dim subjectName As String = local_element.Certificate.Subject
     
           x509Data.AddSubjectName(subjectName)
           KeyInfo.AddClause(x509Data)
     
           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
     
            Dim nsMgr As XmlNamespaceManager
            nsMgr = New XmlNamespaceManager(xmlDoc.NameTable)
            nsMgr.AddNamespace("sac", "urn:sunat:names:specification:ubl:peru:schema:xsd:SunatAggregateComponents-1")
            nsMgr.AddNamespace("ccts", "urn:un:unece:uncefact:documentation:2")
            nsMgr.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance")
            nsMgr.AddNamespace("tns", "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2")
            nsMgr.AddNamespace("cac", "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2")
            nsMgr.AddNamespace("udt", "urn:un:unece:uncefact:data:specification:UnqualifiedDataTypesSchemaModule:2")
            nsMgr.AddNamespace("ext", "urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2")
            nsMgr.AddNamespace("qdt", "urn:oasis:names:specification:ubl:schema:xsd:QualifiedDatatypes-2")
            nsMgr.AddNamespace("cbc", "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2")
            nsMgr.AddNamespace("ds", "http://www.w3.org/2000/09/xmldsig#")
     
     
            xmlDoc.SelectSingleNode("/tns:Invoice/ext:UBLExtensions/ext:UBLExtension[2]/ext:ExtensionContent", nsMgr).AppendChild(xmlDoc.ImportNode(signature, True))
            xmlDoc.Save(xmlFile)
    Dernière modification par Invité ; 16/06/2014 à 10h09.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Personne pour aider?

Discussions similaires

  1. [XAdES4j] Signer un document XML
    Par clio671 dans le forum Format d'échange (XML, JSON...)
    Réponses: 0
    Dernier message: 01/08/2012, 17h25
  2. recherche dans un document xml via DOM
    Par ndoye_zaff dans le forum APIs
    Réponses: 5
    Dernier message: 11/06/2003, 14h44
  3. Réponses: 3
    Dernier message: 03/06/2003, 13h16
  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