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:
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) |