Trabalhe com assinaturas digitais
Uma assinatura digital é uma implementação tecnológica de assinaturas eletrônicas para assinar documentos e autenticar o signatário para garantir que um documento não foi modificado desde que foi assinado. Cada assinatura digital é exclusiva para cada signatário devido ao protocolo PKI para gerar chaves públicas e privadas. Assinar um documento digitalmente significa criar uma assinatura usando a chave privada do signatário, onde um algoritmo matemático é usado para criptografar o hash gerado.
Aspose.Words permite detectar, contar ou verificar assinaturas digitais existentes e também adicionar uma nova assinatura ao seu documento para descobrir qualquer adulteração nele. Você também pode remover todas as assinaturas digitais de um documento. Use a classe DigitalSignatureUtil para trabalhar com assinaturas digitais.
Este artigo explica como fazer tudo isso para validar a autenticidade e integridade de um documento digital.
Experimente on-line
Você pode experimentar esta funcionalidade com nosso Assinatura on-line gratuita.
Formatos Suportados
Aspose.Words permite trabalhar com assinaturas digitais em documentos DOC, OOXML e ODT e assinar o documento gerado em formato PDF ou XPS.
Limitações das assinaturas digitais
A tabela abaixo descreve algumas limitações que você pode enfrentar ao trabalhar com assinaturas digitais por meio de Aspose.Words, bem como algumas opções alternativas.
Limitação | Opção alternativa |
---|---|
Perda de assinaturas digitais em um documento após carregá-lo e salvá-lo. Portanto, o processamento de um documento em um servidor pode causar a perda de todas as assinaturas digitais sem aviso prévio | Verifique se um documento possui assinaturas digitais e tome as medidas apropriadas se alguma for encontrada. Por exemplo, envie um alerta aos clientes informando que o documento que estão enviando contém assinaturas digitais que serão perdidas caso sejam processadas |
Aspose.Words suporta trabalhar com macros em um documento. Mas o Aspose.Words ainda não oferece suporte a assinaturas digitais em macros | Exporte o documento de volta para qualquer formato Word e use Microsoft Word para adicionar uma assinatura digital às macros |
Detecte, conte e verifique assinaturas digitais
Aspose.Words permite detectar assinatura digital em um documento usando o método DetectFileFormat e a propriedade HasDigitalSignature. Vale ressaltar que tal verificação detectará apenas o fato da assinatura, mas não sua validade.
Um documento pode ser assinado mais de uma vez e isso pode ser feito por diferentes usuários. Para verificar a validade das assinaturas digitais, você precisa carregá-las do documento usando o método LoadSignatures e usar a propriedade IsValid. Além disso, o Aspose.Words permite contar um conjunto de todas as assinaturas digitais em um documento usando a propriedade Count.
Tudo isso fornece uma maneira eficiente e segura de verificar se há assinaturas em um documento antes de processá-lo.
O exemplo de código a seguir mostra como detectar a presença de assinaturas digitais e verificá-las:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
FileFormatInfo info = FileFormatUtil.DetectFileFormat(MyDir + "Digitally signed.docx"); | |
if (info.HasDigitalSignature) | |
{ | |
Console.WriteLine( | |
$"Document {Path.GetFileName(MyDir + "Digitally signed.docx")} has digital signatures, " + | |
"they will be lost if you open/save this document with Aspose.Words."); | |
} |
Crie uma assinatura digital
Para criar uma assinatura digital, você precisará carregar um certificado de assinatura que confirme a identidade. Ao enviar um documento assinado digitalmente, você também envia seu certificado e sua chave pública.
Aspose.Words permite criar um certificado X.509, um certificado digital que usa o padrão PKI X.509 aceito internacionalmente para verificar se uma chave pública pertence ao signatário incluído no certificado. Para fazer isso, use o método Create dentro da classe CertificateHolder.
As próximas seções explicam como adicionar uma assinatura digital, uma linha de assinatura e como assinar um documento PDF gerado.
Assine um documento
Aspose.Words permite assinar digitalmente um documento DOC, DOCX, XPS ou ODT usando o método Sign e propriedades SignOptions.
O exemplo de código a seguir mostra como assinar documentos usando um detentor de certificado e opções de assinatura:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
CertificateHolder certHolder = CertificateHolder.Create(MyDir + "morzal.pfx", "aw"); | |
DigitalSignatureUtil.Sign(MyDir + "Digitally signed.docx", ArtifactsDir + "Document.Signed.docx", | |
certHolder); |
Adicione uma linha de assinatura
Uma linha de assinatura é uma representação visual de uma assinatura digital em um documento. Aspose.Words permite inserir uma linha de assinatura usando o método DocumentBuilder.InsertSignatureLine. Você também pode definir os parâmetros para esta representação usando a classe SignatureLineOptions.
Por exemplo, a imagem abaixo mostra como as assinaturas válidas e inválidas podem ser exibidas.


Além disso, se um documento contiver uma linha de assinatura e nenhuma assinatura digital, existe um recurso para solicitar ao usuário que adicione uma assinatura.
O exemplo de código a seguir mostra como assinar um documento com um certificado pessoal e uma linha de assinatura específica:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
SignatureLineOptions signatureLineOptions = new SignatureLineOptions | |
{ | |
Signer = "yourname", | |
SignerTitle = "Worker", | |
Email = "yourname@aspose.com", | |
ShowDate = true, | |
DefaultInstructions = false, | |
Instructions = "Please sign here.", | |
AllowComments = true | |
}; | |
SignatureLine signatureLine = builder.InsertSignatureLine(signatureLineOptions).SignatureLine; | |
signatureLine.ProviderId = Guid.Parse("CF5A7BB4-8F3C-4756-9DF6-BEF7F13259A2"); | |
doc.Save(ArtifactsDir + "SignDocuments.SignatureLineProviderId.docx"); | |
SignOptions signOptions = new SignOptions | |
{ | |
SignatureLineId = signatureLine.Id, | |
ProviderId = signatureLine.ProviderId, | |
Comments = "Document was signed by Aspose", | |
SignTime = DateTime.Now | |
}; | |
CertificateHolder certHolder = CertificateHolder.Create(MyDir + "morzal.pfx", "aw"); | |
DigitalSignatureUtil.Sign(ArtifactsDir + "SignDocuments.SignatureLineProviderId.docx", | |
ArtifactsDir + "SignDocuments.CreateNewSignatureLineAndSetProviderId.docx", certHolder, signOptions); |
Assine um documento PDF gerado
Aspose.Words permite assinar e obter todos os detalhes de um documento PDF usando as propriedades PdfDigitalSignatureDetails.
O exemplo de código a seguir mostra como assinar um PDF gerado:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
builder.Writeln("Test Signed PDF."); | |
PdfSaveOptions saveOptions = new PdfSaveOptions | |
{ | |
DigitalSignatureDetails = new PdfDigitalSignatureDetails( | |
CertificateHolder.Create(MyDir + "morzal.pfx", "aw"), "reason", "location", | |
DateTime.Now) | |
}; | |
doc.Save(ArtifactsDir + "WorkingWithPdfSaveOptions.DigitallySignedPdfUsingCertificateHolder.pdf", saveOptions); |
Recuperar o valor da assinatura digital
Aspose.Words também oferece a capacidade de recuperar o valor da assinatura digital de um documento assinado digitalmente como uma matriz de bytes usando a propriedade SignatureValue.
O exemplo de código a seguir mostra como obter o valor da assinatura digital como uma matriz de bytes de um documento:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
Document doc = new Document(MyDir + "Digitally signed.docx"); | |
foreach (DigitalSignature digitalSignature in doc.DigitalSignatures) | |
{ | |
string signatureValue = Convert.ToBase64String(digitalSignature.SignatureValue); | |
Assert.AreEqual("K1cVLLg2kbJRAzT5WK+m++G8eEO+l7S+5ENdjMxxTXkFzGUfvwxREuJdSFj9AbD" + | |
"MhnGvDURv9KEhC25DDF1al8NRVR71TF3CjHVZXpYu7edQS5/yLw/k5CiFZzCp1+MmhOdYPcVO+Fm" + | |
"+9fKr2iNLeyYB+fgEeZHfTqTFM2WwAqo=", signatureValue); | |
} |
Remover assinaturas digitais
Aspose.Words permite remover todas as assinaturas digitais de um documento assinado usando o método RemoveAllSignatures.
O exemplo de código a seguir mostra como carregar e remover assinaturas digitais de um documento:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
// There are two ways of using the DigitalSignatureUtil class to remove digital signatures | |
// from a signed document by saving an unsigned copy of it somewhere else in the local file system. | |
// 1 - Determine the locations of both the signed document and the unsigned copy by filename strings: | |
DigitalSignatureUtil.RemoveAllSignatures(MyDir + "Digitally signed.docx", | |
ArtifactsDir + "DigitalSignatureUtil.LoadAndRemove.FromString.docx"); | |
// 2 - Determine the locations of both the signed document and the unsigned copy by file streams: | |
using (Stream streamIn = new FileStream(MyDir + "Digitally signed.docx", FileMode.Open)) | |
{ | |
using (Stream streamOut = new FileStream(ArtifactsDir + "DigitalSignatureUtil.LoadAndRemove.FromStream.docx", FileMode.Create)) | |
{ | |
DigitalSignatureUtil.RemoveAllSignatures(streamIn, streamOut); | |
} | |
} | |
// Verify that both our output documents have no digital signatures. | |
Assert.That(DigitalSignatureUtil.LoadSignatures(ArtifactsDir + "DigitalSignatureUtil.LoadAndRemove.FromString.docx"), Is.Empty); | |
Assert.That(DigitalSignatureUtil.LoadSignatures(ArtifactsDir + "DigitalSignatureUtil.LoadAndRemove.FromStream.docx"), Is.Empty); |