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 :

Ajout de X509SubjectName pour signer


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Ajout de X509SubjectName pour signer
    Bonjour à tous, j'ai pu trouver comment faire pour signer un fichier XML, à l'aide d'un certificat X509 v3, seulement voilà, j'ai vu que la balise X509SubjectName n'est pas présente, que dois je faire afin de l'ajouter? Aussi, si je veux ajouter des attributs, comment dois-je m'y prendre?

    Merci
    Voici mon code:

    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
    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
     
    Dim xmlFile As String = "TestPerou2.xml"
     Dim subjectname As String
     Dim certificattrouve As Boolean = False
     
     Dim store As X509Store = New X509Store(StoreName.TrustedPeople, StoreLocation.LocalMachine)
     Dim MonCertificat As New X509Certificate2
     
     store.Open(OpenFlags.ReadOnly)
     For Each cert As X509Certificate2 In store.Certificates
         If InStr(cert.IssuerName.Name.ToLower, "victor bernardo basaez marquez") Then
             subjectname = cert.SubjectName.Name
             MonCertificat = cert
             MsgBox(MonCertificat.ToString())
             certificattrouve = True
             Exit For
         End If
     Next
     
     store.Close()
     If certificattrouve = False Then
         MsgBox("Certificat non trouvé")
         End
     End If
     
     '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()
     KeyInfo.AddClause(New KeyInfoX509Data(MonCertificat))
     signedXml.KeyInfo = 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)
     
     'On calcule la signature et on récupère le XML associé.  
     signedXml.ComputeSignature()
     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"
     Next node
     
     xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(signature, True))
     
     xmlDoc.Save(xmlFile)

  2. #2
    Membre éclairé Avatar de DeWaRs
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2006
    Messages
    291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 291
    Par défaut
    Hello,

    Comment ou qui as généré ton certificat ? Cela me parait peut probable que tu puisses éditer un certificat depuis du code, mais peut-être que je me trompe...
    Je pense qu'il faut que le X509SubjectName soit complété a la création du certificat, pas apres.

    Cordialement

    DeWaRs

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour, mon certificat a été généré grâce au logiciel selfCert que j'ajoutais par la suite dans le store. Quand j'en générais un, je mettais noir sur blanc la valeur du SubjectName mais impossible de le faire ressortir dans la balise X509SubjectName, mais cette valeur est récupérable à l'aide de la propriété IssuerName.Name de la variable contenant le certificat.
    Sinon, j'ai pu résoudre mon problème, si jamais quelqu'un d'autre a le même soucis que le mien, voici ce que j'ai mis:
    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
    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
    82
    83
    84
    85
    86
    87
     
     Dim xmlFile As String = "TEMP\" & param_nomfichier & ".xml"
            Dim certificattrouve As Boolean = False
     
            Dim store As X509Store = New X509Store(StoreName.TrustedPeople, StoreLocation.LocalMachine)
            'Dim MonCertificat As X509Certificate2 = New X509Certificate2(param_certificate, param_pwdcert)
            Dim MonCertificat As New X509Certificate2
     
            store.Open(OpenFlags.ReadOnly)
            For Each cert As X509Certificate2 In store.Certificates
     
                If InStr(cert.IssuerName.Name.ToLower, "victor bernardo basaez marquez") Then
                    'subjectname = cert.SubjectName.Name
                    MonCertificat = cert
                    'MsgBox(MonCertificat.ToString())
                    certificattrouve = True
                    Exit For
                End If
            Next
     
            store.Close()
            If certificattrouve = False Then
                MsgBox("Certificat non trouvé")
                End
            End If
     
            '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)

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

Discussions similaires

  1. [débutant]Certificat pour signer une applet
    Par miclan dans le forum Applets
    Réponses: 7
    Dernier message: 24/08/2006, 20h59
  2. Réponses: 6
    Dernier message: 06/12/2005, 15h52
  3. Ajouter une clé pour une session non ouverte
    Par prgasp77 dans le forum Windows
    Réponses: 4
    Dernier message: 29/10/2005, 00h26
  4. Réponses: 10
    Dernier message: 14/04/2005, 22h57

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