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 :

Signature de fichier xml


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 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 : 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 = "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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    signedXml.ComputeSignature()
    J'ai constaté que MonCertificat.PrivateKey n'avait pas de valeur, que dois-je faire?
    Merci
    Dernière modification par Invité ; 04/03/2014 à 17h52.

  2. #2
    Membre Expert Avatar de meziantou
    Homme Profil pro
    autre
    Inscrit en
    Avril 2010
    Messages
    1 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : autre
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 223
    Par défaut
    Si je ne me trompe pas un fichier .cer contient uniquement la clé publique. Tu ne peux donc pas signer avec puisqu'il faut pour cela la clé privé.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Je viens de constater une chose, une différence qu'il y a entre un certificat que l'on récupère dans le store et un certificat sous la forme d'un fichier externe: un certificat présent dans le store possède une clé publique ET une clé privée, alors que dans un fichier externe, la clé privée n'est pas présente, seule la clé publique est présente.
    Désormais, j'ai un fichier externe qui possède la clé privée associée à ce certificat, comment dois-je faire pour le lire?

  4. #4
    Membre Expert Avatar de meziantou
    Homme Profil pro
    autre
    Inscrit en
    Avril 2010
    Messages
    1 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : autre
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 223
    Par défaut
    Un certificat par définition ne contient que la partie publique.

    Un fichier peut contenir la clé privée, par exemple un fichier PFX peut contenir la clé publique et la clé privée.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Un certificat ne possède que la clé publique? mais alors, pourquoi est-ce que je ne rencontre aucun problème si je le récupère depuis le store?
    En faisant des recherches, j'ai trouvé que je pouvais générer un certificat et une paire de clé à l'aide d'open ssl, désormais, j'ai 3 fichiers: mon certificat au format CER (ne peut être qu'au format CER), un fichier CSR contenant le "certificate request" et un fichier KEY avec la clé privée qui n'est pas cryptée. Quand je dois signer, cette clé doit être cryptée?

  6. #6
    Membre Expert Avatar de meziantou
    Homme Profil pro
    autre
    Inscrit en
    Avril 2010
    Messages
    1 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : autre
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 223
    Par défaut
    Un certificat ne possède que la clé publique?
    Le certificat est théoriquement le document publique, d'où le fait qu'il ne contienne pas la clé privée.
    Juste pour bien insister, voila ce qui est dit par MSDN pour les fichiers PFX (Personal Information Exchange):
    To be used for release signing, a Software Publisher Certificate (SPC), and its private and public keys, must be stored in a Personal Information Exchange (.pfx) file. However, some certificate authorities (CAs) use different file formats to store this data. For example, some CAs store the certificate's private key in a Private Key (.pvk) file and store the certificate and public key in a .spc or .cer file.
    Tu remarqueras qu'il y a une distinction entre le certificat (la partie publique) et la clé privée. La clé privée est associée à un certificat mais n'est jamais incluse.
    Un fichier pfx (ou autre) permet de regrouper le certificat et sa clé privée dans un seul fichier (mais garde une distinction entre les 2).

    Windows permet de sauvegarder le certificat et la clé privée dans le store, d'où le fait que tu puisses la récupérer.


    mon certificat au format CER => Certificat ne contenant uniquement les informations publique.
    un fichier CSR contenant le "certificate request" => Fichier de demande de certificat, contient les informations publiques (surtout pas de clé privée)
    un fichier KEY avec la clé privée qui n'est pas cryptée => Non publique, permet de signer

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

Discussions similaires

  1. [XPATH 1.0] Signature d'un fichier XML et ajout préfixe
    Par Invité dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 13/06/2014, 10h52
  2. Signature electronique d'un fichier XML
    Par dormouse dans le forum Format d'échange (XML, JSON...)
    Réponses: 10
    Dernier message: 27/04/2013, 16h47
  3. Problème (Exception) lors de la vérification de signature sur fichier XML
    Par khwira dans le forum Format d'échange (XML, JSON...)
    Réponses: 0
    Dernier message: 14/07/2012, 23h56
  4. [System.Security.Cryptography.Xml] Signature de fichiers XML
    Par melleb dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 15/04/2008, 10h04
  5. Signature de fichiers xml
    Par melleb dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 15/04/2008, 09h58

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