(vb) Ajout d'un préfixe dans la signature d'un fichier XML

Ajout d'un préfixe dans la signature d'un fichier XML (vb) - VB/VBA/VBS - Programmation

Marsh Posté le 02-07-2014 à 12:30:31    

Bonjour, je rencontre des difficultés pour signer un document XML à l'aide d'un certificat X509 v3.
J'ai réussi au final à générer et à placer ma signature au bon endroit, le soucis, c'est quand je dois lui ajouter le préfixe "ds" dans tout le nœud "Signature et dans ses sous-nœuds, ce qui casse du coup la validité de mon document, comment dois-je m'y prendre?
 
JE vous mets mon code:

Code :
  1. Dim f_adresse As String = System.AppDomain.CurrentDomain.BaseDirectory
  2.         Dim f_temp As String = f_adresse & "TEMP\"
  3.         Dim f_fichier As String = "20381235051-01-FF12-03.xml"
  4.         Dim f_certificat As String = f_adresse & "aG9CcVpHVndCWTd3WlVOVw==.p12"
  5.         Dim f_pwd As String = "xxxxxxxxxxxxx"
  6.         Dim xmlFile As String = f_temp & f_fichier
  7.         Dim MonCertificat As X509Certificate2 = New X509Certificate2(f_certificat, f_pwd)
  8.         Dim xmlDoc As XmlDocument = New XmlDocument()
  9.         xmlDoc.PreserveWhitespace = True
  10.         xmlDoc.Load(xmlFile)
  11.         'Maintenant nous allons créer un objet SignedXml portant sur le document XML que l'on veut signer.
  12.         Dim signedXml As SignedXml = New SignedXml(xmlDoc)
  13.         'On renseigne la clé à utiliser pour signer en indiquant la clé privée de notre certificat.
  14.         signedXml.SigningKey = MonCertificat.PrivateKey
  15.         'Puis on ajoute ensuite les informations du certificat afin de pouvoir vérifier la signature.
  16.         'Dans notre exemple, les informations du certificat seront sous la forme de balises X509Data
  17.         Dim KeyInfo As KeyInfo = New KeyInfo()
  18.         'On crée un objet Reference qui permet de préciser les informations à signer.
  19.         'Pour signer l'ensemble du document on utilise une chaîne vide comme référence.
  20.         Dim Reference As Reference = New Reference()
  21.         Reference.Uri = ""
  22.         'On va maintenant ajouter une transformation pour indiquer qu'il s'agit d'une signature enveloppée.
  23.         'Cette étape est très importante car cela permet de ne pas tenir compte des éléments Signature déjà
  24.         'présents pour le calcul de l'empreinte.
  25.         Reference.AddTransform(New XmlDsigEnvelopedSignatureTransform("true" ))
  26.         'Reference.AddTransform(New XmlDsigC14NTransform())
  27.         'Reference.AddTransform(New XmlDsigC14NWithCommentsTransform)
  28.         'On ajoute la référence à l'objet SignedXml.
  29.         signedXml.AddReference(Reference)
  30.         Dim X509Chain As X509Chain = New X509Chain()
  31.         X509Chain.Build(MonCertificat)
  32.         Dim local_element As X509ChainElement = X509Chain.ChainElements(0)
  33.         Dim x509Data As KeyInfoX509Data = New KeyInfoX509Data(local_element.Certificate)
  34.         Dim subjectName As String = local_element.Certificate.Subject
  35.         x509Data.AddSubjectName(subjectName)
  36.         KeyInfo.AddClause(x509Data)
  37.         signedXml.KeyInfo = KeyInfo
  38.         signedXml.ComputeSignature()
  39.         'On calcule la signature et on récupère le XML associé. 
  40.         Dim signature As XmlElement = signedXml.GetXml()
  41.         signature.Prefix = "ds"
  42.         signedXml.ComputeSignature()
  43.         signature.ChildNodes(0).Prefix = "ds" 'this line breaks my signature
  44.         signedXml.ComputeSignature()
  45.         'On ajoute à la fin du document XML la signature générée puis on sauvegarde le document ainsi modifié.
  46.         For Each node As XmlNode In signature.SelectNodes("descendant-or-self::*[namespace-uri()='http://www.w3.org/2000/09/xmldsig#']" )
  47.             If node.LocalName = "Signature" Then
  48.                 Dim newAttribute As XmlAttribute = xmlDoc.CreateAttribute("Id" )
  49.                 newAttribute.Value = "SignatureSP"
  50.                 node.Attributes.Append(newAttribute)
  51.             End If
  52.         Next node
  53.         Dim nsMgr As XmlNamespaceManager
  54.         nsMgr = New XmlNamespaceManager(xmlDoc.NameTable)
  55.         nsMgr.AddNamespace("sac", "urn:sunat:names:specification:ubl:peru:schema:xsd:SunatAggregateComponents-1" )
  56.         nsMgr.AddNamespace("ccts", "urn:un:unece:uncefact:documentation:2" )
  57.         nsMgr.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance" )
  58.         nsMgr.AddNamespace("tns", "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2" )
  59.         nsMgr.AddNamespace("cac", "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" )
  60.         nsMgr.AddNamespace("udt", "urn:un:unece:uncefact:data:specification:UnqualifiedDataTypesSchemaModule:2" )
  61.         nsMgr.AddNamespace("ext", "urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2" )
  62.         nsMgr.AddNamespace("qdt", "urn:oasis:names:specification:ubl:schema:xsd:QualifiedDatatypes-2" )
  63.         nsMgr.AddNamespace("cbc", "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" )
  64.         nsMgr.AddNamespace("ds", "http://www.w3.org/2000/09/xmldsig#" )
  65.         xmlDoc.SelectSingleNode("/tns:Invoice/ext:UBLExtensions/ext:UBLExtension[2]/ext:ExtensionContent", nsMgr).AppendChild(xmlDoc.ImportNode(signature, True))
  66.         xmlDoc.Save(xmlFile)
  67.         'verification signature
  68.         Dim nodeList As XmlNodeList = xmlDoc.GetElementsByTagName("ds:Signature" )
  69.         If nodeList.Count <= 0 Then
  70.             MsgBox("Verification failed: No Signature was found in the document." )
  71.             Exit Sub
  72.         End If
  73.         If nodeList.Count >= 2 Then
  74.             MsgBox("Verification failed: More that one signature was found for the document." )
  75.             Exit Sub
  76.         End If
  77.         signedXml.LoadXml(CType(nodeList(0), XmlElement))
  78.         MsgBox("Verification avec certificat et false : " & signedXml.CheckSignature(MonCertificat, False) & vbNewLine & _
  79.                "Verification avec certificat et true : " & signedXml.CheckSignature(MonCertificat, True) & vbNewLine & _
  80.                "Verification sans certificat : " & signedXml.CheckSignature())

Reply

Marsh Posté le 02-07-2014 à 12:30:31   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed