2015-11-23 46 views
9

Sto provando a firmare un file di Microsoft Office Word utilizzando C# in formato XML diretto.Firma diretta di un documento di Office Word utilizzando XML

ci sono alcune domande e ambiguità si pone qui come:

  • Come devo compilare i valori digest, quale valore devo esattamente digerire per ogni riferimento, e quale valore devo digerire per ogni trasformare?
  • Quale valore devo firmare per creare lo SignatureValue?
  • E quale certificato dovrei includere nei dati x509 e in che modo? (Non abbiamo esattamente un certificato quindi è gradita una guida per crearne uno.)

L'ultima domanda è sto facendo correttamente? Forse c'è qualcosa di sbagliato qui e ho perso un pacchetto che altrimenti avrebbe interagito con il documento openxml e lo avrebbe firmato.

Ma ricorda che in realtà sto provando a firmare un dato con un token esterno che ha un'interfaccia pkcs11 disponibile (ma senza CSP) quindi ho usato la libreria Interop PKCS11 per migrarlo in C#, ma sono ancora un po 'confuso qui.

  • Esiste un pacchetto che è possibile utilizzare per firmare documenti di parole?
  • Oppure c'è un pacchetto che facilita l'interazione openXML?
  • Oppure devo farlo manualmente?

Solo per testa a testa qualsiasi libreria che fa l'interazione OpenXML dovrebbe anche permettere a me di firmare i documenti utilizzando i comandi PKCS11 (vale a dire, che mi dà la bytestream di firmare e digerire, ma non le altre si parti, pkcs11 è davvero non dovrebbe essere considerato un importante qui (è possibile sostituirlo con il mio algoritmo personalizzato))

BTW un costruttore di firma in XML assomiglia a questo:

<?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 grazie per la modifica mod :) – lkn2993

+1

Nota: ho riformattato il codice xml che mancava di diversi '<' caratteri. Non so se sia stato un artefatto dell'editor SO. – collapsar

+0

Bene diciamo insomma che ho bisogno di implementare un progetto come: http://www.signfiles.com/signature-library/ – lkn2993

risposta

1

si può avere uno sguardo al codice sorgente di this project , copre le firme digitali di base per MS Offic e documenti. Si noti che il codice è un po 'obsoleto ma i principi sono gli stessi

+0

buon esempio, ma usa la classe packagedigitalsignaturemanager nella libreria di Windows, che significa nessun codice sorgente, e quindi non sarei in grado di personalizzarlo. ora se mi fornisci anche il codice sorgente della suddetta classe o un'alternativa, credo che sarà la risposta giusta. – lkn2993

+0

Un altro progetto interessante verso le firme digitali (XAdES) nei documenti di ufficio è [qui] (https://github.com/Caliper/Xades) (in francese, ma il codice sorgente è in C# :)) – hampidampi

+0

Eccellente, anche se il progetto è progettato per la firma distaccata, posso ancora usarlo come riferimento per il mio programma originale e creare una firma minimale per esso (perché sembra che Xades punti effettivamente all'oggetto canonico invece di riferimenti indiretti che rende le cose più facili) Io inviterò la risposta ora ma quando avrò finito lo segnerò come risposta (cioè se è corretta). – lkn2993