Méthode SignatureProvider.SignXmlDsig (Office)

Méthode utilisée pour signer le modèle XMLDSIG.

Syntaxe

expression. SignXmlDsig(QueryContinue, psigsetup, psiginfo, XmlDsigStream)

Expression Expression qui renvoie un objet SignatureProvider .

Parameters

Nom Requis/Facultatif Type de données Description
QueryContinue Requis IQueryContinue Permet de demander à l'application hôte l'autorisation de poursuivre l'opération de vérification
psigsetup Requis SignatureSetup Spécifie les informations de configuration relatives à une ligne de signature.
psiginfo Requis SignatureInfo Spécifie les informations collectées lors de la séance de signature.
XmlDsigStream Requis IStream Représente un flux de données contenant du code XML, qui représente un objet XMLDSIG .

Remarques

XMLDSIG est un format de signature basé sur des normes (https://www.w3.org/TR/xmldsig-core/), vérifiable par des tiers. Il s’agit du format par défaut des signatures dans Microsoft Office.

Exemple

L'exemple suivant, écrit en C#, montre comment implémenter la méthode SignXmlDsig dans un projet de fournisseur de signatures personnalisé.

 public void SignXmlDsig(object queryContinue, SignatureSetup sigsetup, SignatureInfo siginfo, object xmldsigStream) 
 { 
 using (COMStream comstream = new COMStream(xmldsigStream)) 
 { 
 XmlDocument xmldsig = new XmlDocument(); 
 xmldsig.PreserveWhitespace = true; 
 xmldsig.Load(comstream); 
 
 XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmldsig.NameTable); 
 nsmgr.AddNamespace("ds", "https://www.w3.org/2000/09/xmldsig#"); 
 
 XmlElement signature = xmldsig.DocumentElement; 
 SignedXml signedXml = new SignedXml(); 
 signedXml.LoadXml(signature); 
 
 // Cert 
 X509Certificate2 cert = TestSignatureProvider.GetSigningCertificate(siginfo); 
 KeyInfo keyInfo = new KeyInfo(); 
 if (cert.PrivateKey is RSA) 
 keyInfo.AddClause(new RSAKeyValue((RSA) cert.PrivateKey)); 
 else if (cert.PrivateKey is DSA) 
 keyInfo.AddClause(new DSAKeyValue((DSA) cert.PrivateKey)); 
 keyInfo.AddClause(new KeyInfoX509Data(cert)); 
 signedXml.SigningKey = cert.PrivateKey; 
 signedXml.KeyInfo = keyInfo; 
 
 // Compute signature 
 signedXml.ComputeSignature(); 
 
 // Copy data from signed signature 
 // REVIEW: Cleaner way to do this? 
 string[] xpathsToCopy = new string[] 
 { 
 "./ds:SignedInfo", 
 "./ds:SignatureValue", 
 "./ds:KeyInfo", 
 }; 
 XmlElement signedSignature = signedXml.GetXml(); 
 foreach (string xpathToCopy in xpathsToCopy) 
 { 
 signature.ReplaceChild( 
 xmldsig.ImportNode(signedSignature.SelectSingleNode(xpathToCopy, nsmgr), true), 
 signature.SelectSingleNode(xpathToCopy, nsmgr)); 
 } 
 
 // Save signature back to stream 
 comstream.SetLength(0); 
 comstream.Position = 0; 
 xmldsig.Save(new XmlTextWriter(comstream, new UTF8Encoding(false))); 
 } 
 }

Remarque

Les fournisseurs de signatures sont implémentés exclusivement dans les compléments COM personnalisés créés dans un code managé et non managé et ne peuvent pas l'être dans Microsoft Visual Basic pour Applications (VBA).

Voir aussi

Assistance et commentaires

Avez-vous des questions ou des commentaires sur Office VBA ou sur cette documentation ? Consultez la rubrique concernant l’assistance pour Office VBA et l’envoi de commentaires afin d’obtenir des instructions pour recevoir une assistance et envoyer vos commentaires.