Partage
  • Partager sur Facebook
  • Partager sur Twitter

Overides SignedXML

création d'une signature Xades en VBNET

    10 mai 2023 à 15:00:41

    Bonjour à tous,

    j'essaye de créer une signature Xades pour une solution en VBNET 3.5 (VS 2008 - oui sa date un peu ... ) J'ai essayé de piocher dans différents forums qui tous me disent overider la fonction SignedXml afin d'ajouter une référence dans ma signature.

    Toutefois, ma tentative de transformation du code C# donné dans un autre forum semble infructueuse et m'indique en message d'erreur que ma référence semble incorrecte.

    C'est pourquoi je fais appel à la communauté pour pouvoir m'aider à résoudre ce problème.

    Voici les codes en question :

    Imports System.Security.Cryptography.Xml
    Imports System.Security.Cryptography.Xml.Transform
    Imports System.Xml
    Imports System.IO
    Imports System.Security.Cryptography.X509Certificates
    Imports System.Text.RegularExpressions
    
    
    
    Public Class Form1
        Private store As X509Store = New X509Store(StoreName.My, StoreLocation.LocalMachine)
        Private currentId As Integer = Nothing
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
    
            store.Open(OpenFlags.ReadOnly)
    
    
    
    
            
    
    
    
            Dim certificates As X509CertificateCollection = X509Certificate2UI.SelectFromCollection(store.Certificates, "Certificate Select", "Select certificates from the following list to get extension information on that certificate", X509SelectionFlag.SingleSelection)
    
    
            Dim certificate As X509Certificate2 = Nothing
            If certificates.Count <> 0 Then
                certificate = CType(certificates(0), X509Certificate2)
            End If
    
    
            store.Close()
    
            Dim XmlDoco As XDocument = XDocument.Parse(System.IO.File.ReadAllText("C:\EXPEDITIONS\COMMUNE\PES\MANDATSB2.xml"))
            Dim Path As String = "C:\EXPEDITIONS\COMMUNE\PES\MANDATSB2.xml"
            Using sr As StreamReader = New StreamReader(Path, True)
                Dim xadesUrl As String = "http://uri.etsi.org/01903/v1.1.1#"
                Dim xmlDoc As New XmlDocument
                xmlDoc.PreserveWhitespace = True
                xmlDoc.Load(sr)
    
    
    
                Dim signedXml As New XadesXml(xmlDoc)
                signedXml.SigningKey = certificate.PrivateKey
                ' ----  Ajout d'un identifiant au bloc de signature
                signedXml.Signature.Id = "SIG"
    
                Dim keyInfo As KeyInfo = New KeyInfo()
                keyInfo.AddClause(New KeyInfoX509Data(certificate))
                signedXml.KeyInfo = keyInfo
    
                ' ---- Création du bloc d'informations pour XAdES
                Dim elem As XmlElement = xmlDoc.CreateElement("xad", "QualifyingProperties", xadesUrl)
    
                '---- Création d'un lien vers le bloc de signature associé
                elem.Attributes.Append(xmlDoc.CreateAttribute("Target"))
                elem.Attributes("Target").Value = "#SIG"
    
                ' --- Création de l'élément SignedProperties contenant les données XAdES à signer
                Dim signedProperties As XmlElement = xmlDoc.CreateElement("xad", "SignedProperties", xadesUrl)
                signedProperties.Attributes.Append(xmlDoc.CreateAttribute("Id"))
                signedProperties.Attributes("Id").Value = "SIG_SP"
                elem.AppendChild(signedProperties)
    
                Dim signedSignatureProperties As XmlElement = xmlDoc.CreateElement("xad", "SignedSignatureProperties", xadesUrl)
                signedProperties.AppendChild(signedSignatureProperties)
    
                ' --- Création d'un timestamp afin de certifier la date de signature
                Dim signingTime As XmlElement = xmlDoc.CreateElement("xad", "SigningTime", xadesUrl)
                signingTime.InnerText = DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ssZ")
                signedSignatureProperties.AppendChild(signingTime)
    
                ' --- Création de l'élément UnsignedProperties contenant les données XAdES non signées
                Dim unsignedProperties As XmlElement = xmlDoc.CreateElement("xad", "UnsignedProperties", xadesUrl)
                elem.AppendChild(unsignedProperties)
    
                Dim unsignedSignatureProperties As XmlElement = xmlDoc.CreateElement("xad", "UnsignedSignatureProperties", xadesUrl)
                unsignedProperties.AppendChild(unsignedSignatureProperties)
    
                Dim machineName As XmlElement = xmlDoc.CreateElement("MachineName")
                machineName.InnerText = Environment.MachineName
                unsignedSignatureProperties.AppendChild(machineName)
    
                ' --- Ajout du bloc XAdES à la signature
                Dim dataObject As DataObject = New DataObject(Nothing, Nothing, Nothing, elem)
                signedXml.AddObject(dataObject)
    
                ' --- Ajout d'une référence sur le document à signer
                Dim reference As Reference = New Reference()
                reference.Uri = ""
                reference.AddTransform(New XmlDsigEnvelopedSignatureTransform())
                signedXml.AddReference(reference)
    
                ' --- Ajout d'une référence sur les données XAdES à signer (SignedProperties)
                reference = New Reference()
                reference.Uri = "#SIG_SP"
                reference.AddTransform(New XmlDsigExcC14NTransform())
                signedXml.AddReference(reference)
    
                signedXml.ComputeSignature()
                Dim signature As XmlElement = signedXml.GetXml()
    
                xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(Signature, True))
                xmlDoc.Save("enveloped.xml")
            End Using
    
    
            '  Dim signedXml As New SignedXml(XmlDoco)
        End Sub
    
    
    
    
    End Class
    
    Imports System.Security.Cryptography.Xml
    Imports System.Xml
    Imports System.IO
    Imports System.Security.Cryptography.X509Certificates
    Imports System.Text.RegularExpressions
    
    Public Class XadesXml
        Inherits SignedXml
    
        Public Sub New(ByVal doc As XmlDocument)
            MyBase.New(doc)
        End Sub
    
        Public Overrides Function GetIdElement(ByVal document As XmlDocument, ByVal idValue As String) As XmlElement
            Dim elem As XmlElement = MyBase.GetIdElement(document, idValue)
    
            If elem Is Nothing Then
                Dim node1 As XmlNode
                For Each data As DataObject In MyBase.Signature.ObjectList
                    For Each node As XmlNode In data.Data
                        node1 = node.SelectSingleNode("//SignedProperties[@Id='" & idValue & "']")
    
                        If node1 IsNot Nothing Then
                            Return CType(node1, XmlElement)
                        End If
                    Next
                Next
            End If
    
            Return elem
        End Function
    
    
    End Class
    

    Je vous remercie par avance de l'aide que vous me porterez.


    • Partager sur Facebook
    • Partager sur Twitter
      10 mai 2023 à 19:07:33

      Quelle ligne dans le code plante ou ne compile pas + message d'erreur précis, SVP ?
      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        10 mai 2023 à 22:12:18

        Bonjour je crois que pour une signature xades avec le namespace xad il faut utiliser un manager de namespace
        • Partager sur Facebook
        • Partager sur Twitter
          11 mai 2023 à 12:45:15

          Je suis tombé sur ça si ça peut aider (c'est pour du NET2.0) https://github.com/soonthana/XAdES ça peut peut-être aider
          • Partager sur Facebook
          • Partager sur Twitter

          Overides SignedXML

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown