Práce s digitálními podpisy

Digitální podpis je technologickou implementací elektronických podpisů k podpisu dokumentů a ověření podpisu, aby bylo zaručeno, že dokument nebyl od podpisu změněn. Každý digitální podpis je unikátní pro každého signera, protože následuje protokol PKI pro generování veřejných i soukromých klíčů. Podepsání dokumentu digitálně znamená vytvoření podpisu pomocí podpisového soukromého klíče, kde se používá matematický algoritmus k zašifrování generovaného hašiše.

Aspose.Words umožňuje detekovat, počítat nebo ověřovat existující digitální podpisy a také přidat nový podpis do svého dokumentu, aby zjistil jakékoli manipulace v něm. Můžete také odstranit všechny digitální podpisy z dokumentu. Použijte DigitalSignatureUtil třída pracovat s digitálními podpisy.

Tento článek vysvětluje, jak udělat vše výše uvedené pro ověření pravosti a integrity digitálního dokumentu.

Podporované formáty

Aspose.Words umožňuje pracovat s digitálními podpisy na dokumentech DOC, OOXML a ODT a podepsat vygenerovaný dokument v PDF nebo XPS formát.

Omezení digitálních podpisů

Níže uvedená tabulka popisuje několik omezení, kterým můžete čelit při práci s digitálními podpisy prostřednictvím Aspose.Words, stejně jako některé alternativní možnosti.

Omezení Alternativní možnost
Ztráta digitálních podpisů na dokumentu po jeho načtení a uložení. Proto může zpracování dokumentu na server způsobit ztrátu všech digitálních podpisů bez předchozího upozornění Zkontrolujte, zda dokument má digitální podpisy, a přijmout vhodná opatření, pokud jsou nalezeny. Pošlete například upozornění klientům, kteří informují o tom, že dokument, který nahrávají, obsahuje digitální podpisy, které budou ztraceny, pokud bude zpracován
Aspose.Words podporuje práci s makro v dokumentu. Ale… Aspose.Words dosud nepodporuje digitální podpisy na makros Exportovat dokument zpět do jakéhokoli formátu Word a používat Microsoft Word přidat digitální podpis do makros

Detekovat, počítat a ověřit digitální podpisy

Aspose.Words umožňuje detekovat digitální podpis v dokumentu pomocí DetectFileFormat metoda a HasDigitalSignature majetek. Stojí za zmínku, že taková kontrola odhalí pouze skutečnost podpisu, ale nikoli jeho platnost.

Dokument může být podepsán více než jednou, a to může být provedeno různými uživateli. Chcete-li zkontrolovat platnost digitálních podpisů, musíte je načíst z dokumentu pomocí LoadSignatures metoda a použití IsValid majetek. Také Aspose.Words umožňuje spočítat soubor všech digitálních podpisů v dokumentu pomocí Count majetek.

To vše poskytuje účinný a bezpečný způsob, jak před jeho zpracováním ověřit podpisy dokumentu.

Následující příklad kódu ukazuje, jak zjistit přítomnost digitálních podpisů a ověřit je:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git.
FileFormatInfo info = FileFormatUtil.detectFileFormat(getMyDir() + "Digitally signed.docx");
if (info.hasDigitalSignature())
{
System.out.println("Document {Path.GetFileName(MyDir + ");
}

Vytvořit digitální podpis

Chcete-li vytvořit digitální podpis, budete muset načíst podpis certifikát, který potvrzuje identitu. Když zašlete digitálně podepsaný dokument, zašlete také svůj certifikát a veřejný klíč.

Aspose.Words umožňuje vytvořit certifikát X.509, digitální certifikát, který používá mezinárodně uznávaný standard X.509 PKI k ověření, že veřejný klíč patří podepisovači, který je součástí certifikátu. K tomu použijte Create metoda v rámci CertificateHolder třída.

Další sekce vysvětlují, jak přidat digitální podpis, podpisovou linii a jak podepsat vygenerovaný PDF dokument.

Podepsat dokument

Aspose.Words umožňuje podepsat dokument DOC, DOCX nebo ODT digitálně pomocí Sign metoda a SignOptions vlastnosti.

Následující příklad kódu ukazuje, jak se podepisují dokumenty pomocí držitele certifikátu a podepisují možnosti:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git.
CertificateHolder certHolder = CertificateHolder.create(getMyDir() + "morzal.pfx", "aw");
DigitalSignatureUtil.sign(getMyDir() + "Digitally signed.docx", getArtifactsDir() + "Document.Signed.docx",
certHolder);

Přidat řádek podpisu

Podpis je vizuální reprezentace digitálního podpisu v dokumentu. Aspose.Words umožňuje vložit řádek podpisu pomocí DocumentBuilder.InsertSignatureLine metoda. Můžete také nastavit parametry pro tuto reprezentaci pomocí SignatureLineOptions třída.

Následující obrázek například ukazuje, jak mohou být zobrazeny platné a neplatné podpisy.

valid-digital-signature invalid-digital-signature

Také, pokud dokument obsahuje podpisovou řadu a žádný digitální podpis, je funkce požádat uživatele o přidání podpisu.

Následující příklad kódu ukazuje, jak podepsat dokument s osobním certifikátem a zvláštním podpisem:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
SignatureLineOptions signatureLineOptions = new SignatureLineOptions();
{
signatureLineOptions.setSigner("yourname");
signatureLineOptions.setSignerTitle("Worker");
signatureLineOptions.setEmail("yourname@aspose.com");
signatureLineOptions.setShowDate(true);
signatureLineOptions.setDefaultInstructions(false);
signatureLineOptions.setInstructions("Please sign here.");
signatureLineOptions.setAllowComments(true);
}
SignatureLine signatureLine = builder.insertSignatureLine(signatureLineOptions).getSignatureLine();
signatureLine.setProviderId(UUID.fromString("CF5A7BB4-8F3C-4756-9DF6-BEF7F13259A2"));
doc.save(getArtifactsDir() + "SignDocuments.SignatureLineProviderId.docx");
SignOptions signOptions = new SignOptions();
{
signOptions.setSignatureLineId(signatureLine.getId());
signOptions.setProviderId(signatureLine.getProviderId());
signOptions.setComments("Document was signed by Aspose");
signOptions.setSignTime(new Date());
}
CertificateHolder certHolder = CertificateHolder.create(getMyDir() + "morzal.pfx", "aw");
DigitalSignatureUtil.sign(getArtifactsDir() + "SignDocuments.SignatureLineProviderId.docx",
getArtifactsDir() + "SignDocuments.CreateNewSignatureLineAndSetProviderId.docx", certHolder, signOptions);

Podepsat Generovaný dokument PDF

Aspose.Words umožňuje podepsat a získat všechny podrobnosti PDF dokumentu pomocí PdfDigitalSignatureDetails vlastnosti.

Následující příklad kódu ukazuje, jak podepsat generovaný PDF:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.writeln("Test Signed PDF.");
PdfSaveOptions saveOptions = new PdfSaveOptions();
{
saveOptions.setDigitalSignatureDetails(new PdfDigitalSignatureDetails(
CertificateHolder.create(getMyDir() + "morzal.pfx", "aw"), "reason", "location",
new Date()));
}
doc.save(getArtifactsDir() + "WorkingWithPdfSaveOptions.DigitallySignedPdfUsingCertificateHolder.pdf", saveOptions);

Následující obrázek ukazuje, že generovaný dokument PDF je otevřen v Adobe Acrobat a digitální podpis je ověřen jako současný a platný.

create-digital-signed-pdf-aspose-words-java

Získat hodnotu digitálního podpisu

Aspose.Words poskytuje také schopnost získat hodnotu digitálního podpisu z digitálně podepsaného dokumentu jako pole byte pomocí pole SignatureValue majetek.

Následující příklad kódu ukazuje, jak získat hodnotu digitálního podpisu jako pole byte z dokumentu:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git.
Document doc = new Document(getMyDir() + "Digitally signed.docx");
for (DigitalSignature digitalSignature : doc.getDigitalSignatures())
{
String signatureValue = Base64.getEncoder().encodeToString(digitalSignature.getSignatureValue());
Assert.assertEquals("K1cVLLg2kbJRAzT5WK+m++G8eEO+l7S+5ENdjMxxTXkFzGUfvwxREuJdSFj9AbD" +
"MhnGvDURv9KEhC25DDF1al8NRVR71TF3CjHVZXpYu7edQS5/yLw/k5CiFZzCp1+MmhOdYPcVO+Fm" +
"+9fKr2iNLeyYB+fgEeZHfTqTFM2WwAqo=", signatureValue);
}

Odstranit digitální podpisy

Aspose.Words umožňuje odstranit všechny digitální podpisy z podepsaného dokumentu pomocí RemoveAllSignatures metoda.

Následující příklad kódu ukazuje, jak načíst a odstranit digitální podpisy z dokumentu:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.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(getMyDir() + "Digitally signed.docx",
getArtifactsDir() + "DigitalSignatureUtil.LoadAndRemove.FromString.docx");
// 2 - Determine the locations of both the signed document and the unsigned copy by file streams:
try (FileInputStream streamIn = new FileInputStream(getMyDir() + "Digitally signed.docx"))
{
try (FileOutputStream streamOut = new FileOutputStream(getArtifactsDir() + "DigitalSignatureUtil.LoadAndRemove.FromStream.docx"))
{
DigitalSignatureUtil.removeAllSignatures(streamIn, streamOut);
}
}
// Verify that both our output documents have no digital signatures.
Assert.assertEquals(IterableUtils.size(DigitalSignatureUtil.loadSignatures(getArtifactsDir() + "DigitalSignatureUtil.LoadAndRemove.FromString.docx")), 0);
Assert.assertEquals(IterableUtils.size(DigitalSignatureUtil.loadSignatures(getArtifactsDir() + "DigitalSignatureUtil.LoadAndRemove.FromStream.docx")), 0);