2015-11-23 2 views
9

Je tente de signer un fichier Microsoft Office Word à l'aide de C# au format XML direct.Signature directe d'un document Office Word à l'aide de XML

Il y a quelques questions et ambigüités se pose ici comme:

  • Comment dois-je remplir les valeurs digest, quelle valeur dois-je digérer exactement pour chaque référence, et quelle valeur dois-je digérer pour chaque transformation?
  • Quelle valeur dois-je signer pour créer le SignatureValue?
  • Et quel certificat dois-je inclure dans les données x509 et comment? (Nous n'avons pas vraiment de certificat donc un guide pour en créer un est apprécié.)

La dernière question est que je fais cela correctement? Peut-être qu'il y a quelque chose qui ne va pas ici et j'ai raté un paquet qui, autrement, interagirait lui-même avec le document openxml et le signerait. Mais souvenez-vous que j'essaie de signer une donnée avec un token externe qui a une interface pkcs11 disponible (mais pas de CSP), j'ai donc utilisé la bibliothèque PKCS11 Interop pour la migrer vers C#, mais je suis toujours un peu confus ici.

  • Existe-t-il un package que je peux utiliser pour signer des documents Word?
  • Ou existe-t-il un paquet qui facilite l'interaction openXML?
  • Ou dois-je le faire manuellement?

Juste pour heads up toute bibliothèque qui fait l'interaction OpenXML devrait également me permettre de signer les documents à l'aide des commandes PKCS11 (ie qui me donne le bytestream à signer et à digérer, mais ne les autres se parties, pkcs11 est vraiment ne devrait pas être considérée comme une importance ici (vous pouvez le remplacer par mon algorithme personnalisé))

BTW un constructeur de signature XML ressemble à ceci:

<?xml version="1.0" encoding="UTF-8"?> 
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#" Id="idPackageSignature"> 
    <SignedInfo> 
    <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> 
    <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/> 
    <Reference Type="http://www.w3.org/2000/09/xmldsig#Object" URI="#idPackageObject"> 
     <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/> 
     <DigestValue/> 
    </Reference> 
    <Reference Type="http://www.w3.org/2000/09/xmldsig#Object" URI="#idOfficeObject"> 
     <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/> 
     <DigestValue/> 
    </Reference> 
    <Reference Type="http://uri.etsi.org/01903#SignedProperties" URI="#idSignedProperties"> 
     <Transforms> 
     <Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> 
     </Transforms> 
     <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/> 
     <DigestValue/> 
    </Reference> 
    </SignedInfo> 
    <SignatureValue/> 
    <KeyInfo> 
    <X509Data> 
     <X509Certificate/> 
    </X509Data> 
    </KeyInfo> 
    <Object Id="idPackageObject"> 
    <Manifest> 
     <Reference URI="/_rels/.rels?ContentType=application/vnd.openxmlformats-package.relationships+xml"> 
     <Transforms> 
      <Transform Algorithm="http://schemas.openxmlformats.org/package/2006/RelationshipTransform"> 
      <mdssi:RelationshipReference xmlns:mdssi="http://schemas.openxmlformats.org/package/2006/digital-signature" SourceId="rId1"/> 
      </Transform> 
      <Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> 
     </Transforms> 
     <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/> 
     <DigestValue/> 
     </Reference> 
     <Reference URI="/word/_rels/document.xml.rels?ContentType=application/vnd.openxmlformats-package.relationships+xml"> 
     <Transforms> 
      <Transform Algorithm="http://schemas.openxmlformats.org/package/2006/RelationshipTransform"> 
      <mdssi:RelationshipReference xmlns:mdssi="http://schemas.openxmlformats.org/package/2006/digital-signature" SourceId="rId5"/> 
      <mdssi:RelationshipReference xmlns:mdssi="http://schemas.openxmlformats.org/package/2006/digital-signature" SourceId="rId4"/> 
      <mdssi:RelationshipReference xmlns:mdssi="http://schemas.openxmlformats.org/package/2006/digital-signature" SourceId="rId3"/> 
      <mdssi:RelationshipReference xmlns:mdssi="http://schemas.openxmlformats.org/package/2006/digital-signature" SourceId="rId2"/> 
      <mdssi:RelationshipReference xmlns:mdssi="http://schemas.openxmlformats.org/package/2006/digital-signature" SourceId="rId1"/> 
      </Transform> 
      <Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> 
     </Transforms> 
     <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/> 
     <DigestValue/> 
     </Reference> 
     <Reference URI="/word/document.xml?ContentType=application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"> 
     <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/> 
     <DigestValue/> 
     </Reference> 
     <Reference URI="/word/fontTable.xml?ContentType=application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml"> 
     <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/> 
     <DigestValue/> 
     </Reference> 
     <Reference URI="/word/settings.xml?ContentType=application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml"> 
     <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/> 
     <DigestValue/> 
     </Reference> 
     <Reference URI="/word/styles.xml?ContentType=application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml"> 
     <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/> 
     <DigestValue/> 
     </Reference> 
     <Reference URI="/word/theme/theme1.xml?ContentType=application/vnd.openxmlformats-officedocument.theme+xml"> 
     <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/> 
     <DigestValue/> 
     </Reference> 
     <Reference URI="/word/webSettings.xml?ContentType=application/vnd.openxmlformats-officedocument.wordprocessingml.webSettings+xml"> 
     <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/> 
     <DigestValue/> 
     </Reference> 
    </Manifest> 
    <SignatureProperties> 
     <SignatureProperty Id="idSignatureTime" Target="#idPackageSignature"> 
     <mdssi:SignatureTime xmlns:mdssi="http://schemas.openxmlformats.org/package/2006/digital-signature"> 
      <mdssi:Format>YYYY-MM-DDThh:mm:ssTZD</mdssi:Format> 
      <mdssi:Value>2015-11-22T17:21:28Z</mdssi:Value> 
     </mdssi:SignatureTime> 
     </SignatureProperty> 
    </SignatureProperties> 
    </Object> 
    <Object Id="idOfficeObject"> 
    <SignatureProperties> 
     <SignatureProperty Id="idOfficeV1Details" Target="#idPackageSignature"> 
     <SignatureInfoV1 xmlns="http://schemas.microsoft.com/office/2006/digsig"> 
      <SetupID/> 
      <SignatureText/> 
      <SignatureImage/> 
      <SignatureComments>TEST SIGNING</SignatureComments> 
      <WindowsVersion>10.0</WindowsVersion> 
      <OfficeVersion>15.0</OfficeVersion> 
      <ApplicationVersion>15.0</ApplicationVersion> 
      <Monitors>1</Monitors> 
      <HorizontalResolution>1920</HorizontalResolution> 
      <VerticalResolution>1080</VerticalResolution> 
      <ColorDepth>32</ColorDepth> 
      <SignatureProviderId>{00000000-0000-0000-0000-000000000000}</SignatureProviderId> 
      <SignatureProviderUrl/> 
      <SignatureProviderDetails>9</SignatureProviderDetails> 
      <SignatureType>1</SignatureType> 
     </SignatureInfoV1> 
     </SignatureProperty> 
    </SignatureProperties> 
    </Object> 
    <Object> 
    <xd:QualifyingProperties xmlns:xd="http://uri.etsi.org/01903/v1.3.2#" Target="#idPackageSignature"> 
     <xd:SignedProperties Id="idSignedProperties"> 
     <xd:SignedSignatureProperties> 
      <xd:SigningTime>2015-11-22T17:21:28Z</xd:SigningTime> 
      <xd:SigningCertificate> 
      <xd:Cert> 
       <xd:CertDigest> 
       <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/> 
       <DigestValue/> 
       </xd:CertDigest> 
       <xd:IssuerSerial> 
       <X509IssuerName>[email protected], CN=ALI-PC, OU=ALI-PC, O=ALI-PC, L=ALI-PC, S=ALI-PC, C=98</X509IssuerName> 
       <X509SerialNumber>1</X509SerialNumber> 
       </xd:IssuerSerial> 
      </xd:Cert> 
      </xd:SigningCertificate> 
      <xd:SignaturePolicyIdentifier> 
      <xd:SignaturePolicyImplied/> 
      </xd:SignaturePolicyIdentifier> 
     </xd:SignedSignatureProperties> 
     <xd:SignedDataObjectProperties> 
      <xd:CommitmentTypeIndication> 
      <xd:CommitmentTypeId> 
       <xd:Identifier>http://uri.etsi.org/01903/v1.2.2#ProofOfOrigin</xd:Identifier> 
       <xd:Description>Created and approved this document</xd:Description> 
      </xd:CommitmentTypeId> 
      <xd:AllSignedDataObjects/> 
      <xd:CommitmentTypeQualifiers> 
       <xd:CommitmentTypeQualifier>TEST SIGNING</xd:CommitmentTypeQualifier> 
      </xd:CommitmentTypeQualifiers> 
      </xd:CommitmentTypeIndication> 
     </xd:SignedDataObjectProperties> 
     </xd:SignedProperties> 
    </xd:QualifyingProperties> 
    </Object> 
</Signature> 
+0

BTW merci pour le mod d'édition :) – lkn2993

+1

Note: J'ai reformaté le code XML qui manquait de plusieurs caractères <<'. Je ne sais pas si cela a été ou non un artefact de l'éditeur de SO. – collapsar

+0

Eh bien, disons en un mot, j'ai besoin de mettre en œuvre un projet comme: http://www.signfiles.com/signature-library/ – lkn2993

Répondre

1

vous pouvez jeter un oeil au code source de this project , il couvre les signatures numériques de base pour MS Offic Documents électroniques Notez que le code est un peu désuet mais les principes sont les mêmes

+0

bon exemple, mais son utilisation de la classe packagedigitalsignaturemanager dans la bibliothèque windowsbase, ce qui signifie pas de code source, et donc je serais incapable de le personnaliser. Maintenant, si vous me fournissez aussi le code source de la classe ci-dessus ou une alternative, je suppose que ce sera la bonne réponse. – lkn2993

+0

Un autre projet intéressant pour les signatures numériques (XAdES) dans les documents de bureau est [ici] (https://github.com/Caliper/Xades) (en français, mais le code source est en C# :) – hampidampi

+0

Excellent, même si le projet est conçu pour une signature détachée, je peux toujours l'utiliser comme référence pour mon programme original et créer une signature minimale pour cela (parce qu'il semble que Xades pointe vers un objet canonique au lieu d'un référencement indirect, ce qui rend les choses plus faciles) maintenant mais quand je suis fini, je vais marquer cela comme une réponse (c'est-à-dire, si c'est correct). – lkn2993