Работа с цифрови подписи

Цифровият подпис е технологично приложение на електронните подписи за подписване и удостоверяване на подписа, за да се гарантира, че документът не е бил изменян от момента на подписването му. Всеки цифров подпис е уникален за всеки подпис, поради следването на протокола PKI за генериране на публични и частни ключове. Подписване на документ дигитално означава създаване на подпис с помощта на частния ключ на подписа, където се използва математически алгоритъм за криптиране на генерирания хашиш.

Aspose.Words ви позволява да откривате, броите или проверявате съществуващи цифрови подписи, а също и да добавяте нов подпис към документа си, за да разберете каквото и да е подправяне в него. Можете също така да премахнете всички цифрови подписи от документ. Използвайте DigitalSignatureUtil клас за работа с цифрови подписи.

Тази статия обяснява как да се направи всичко това, за да се потвърди автентичността и целостта на цифров документ.

Поддържани формати

Aspose.Words ви позволява да работите с цифрови подписи върху документи DOC, OOXML и ODT и да подпишете генерирания документ в PDF или XPS форматиране.

Ограничения на цифровите подписи

Таблицата по-долу описва няколко ограничения, с които можете да се сблъскате при работа с цифрови подписи чрез Aspose.Words, както и някои алтернативни възможности.

Ограничения Алтернативен вариант
Загуба на цифрови подписи върху документ след зареждане и запазване. Следователно обработката на документ на сървър може да причини загуба на всички цифрови подписи без предизвестие Проверете дали документът има цифрови подписи и предприемете необходимите действия, ако има такива. Например, изпратете сигнал до клиентите, за да ги информират, че документът, който качват, съдържа цифрови подписи, които ще бъдат изгубени, ако бъде обработен
Aspose.Words подкрепя работата с макроси в документ. Но… Aspose.Words все още не поддържа цифрови подписи върху макроси Експортиране на документа обратно във формат Word и използване Microsoft Word да се добави цифров подпис към макросите

Открийте, пребройте и проверете цифровите подписи

Aspose.Words ви позволява да откриете цифров подпис в документ с помощта на DetectFileFormat метод и HasDigitalSignature собственост. Струва си да се отбележи, че такава проверка ще открие само факта на подписа, но не и валидността му.

Документ може да бъде подписан повече от веднъж и това може да бъде направено от различни потребители. За да проверите валидността на цифровите подписи, трябва да ги заредите от документа с помощта на LoadSignatures метод и използване на IsValid собственост. Също така Aspose.Words ви позволява да броите набор от всички цифрови подписи в рамките на документ с помощта на Count собственост.

Всичко това осигурява ефективен и безопасен начин за проверка на документ за подписи преди обработката му.

Следният пример за код показва как да се открие наличието на цифрови подписи и да се проверят:

// 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 + ");
}

Създаване на цифров подпис

За да създадете цифров подпис, ще трябва да заредите сертификат за подписване, който потвърждава самоличността. Когато изпращате дигитално подписан документ, изпращате и вашия сертификат и публичен ключ.

Aspose.Words ви позволява да създадете X.509 сертификат, дигитален сертификат, който използва международно приетия X.509 PKI стандарт, за да потвърди, че публичният ключ принадлежи към подписа, включен в сертификата. За целта използвайте Create метод в рамките на CertificateHolder Клас.

Следващите раздели обясняват как да се добави цифров подпис, линия за подпис и как да се подпише генериран PDF документ.

Подпис на документ

Aspose.Words ви позволява да подпишете DOC, DOCX или OTT документ дигитално с помощта на Sign метод и SignOptions имоти.

Следният пример за код показва как да се подписват документи с използване на притежател на сертификат и опции за подписване:

// 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);

Добавяне на подпис

Линията на подпис е визуално представяне на цифров подпис в документ. Aspose.Words ви позволява да въведете сигнатура, като използвате DocumentBuilder.InsertSignatureLine метод. Можете също така да зададете параметрите за това представяне с помощта на SignatureLineOptions Клас.

Например, снимката по-долу показва колко валидни и невалидни подписи могат да бъдат показани.

valid-digital-signature invalid-digital-signature

Също така, ако документът съдържа линия за подпис и няма цифров подпис, има функция, която да поиска от потребителя да добави подпис.

Следният пример за код показва как да се подпише документ с личен сертификат и определен подпис:

// 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);

Подпис на генериран PDF документ

Aspose.Words ви позволява да подпишете и да получите всички подробности за PDF документ с помощта на PdfDigitalSignatureDetails имоти.

Следният пример с код показва как да се подпише генериран 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);

Снимката по-долу показва, че генерираният PDF документ е отворен в Adobe Acrobat дигиталният подпис се проверява като настоящ и валиден.

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

Изтегляне на стойността на цифровия подпис

Aspose.Words Също така предоставя възможност за извличане на стойността на цифровия подпис от цифров подписан документ като байт масив с помощта на SignatureValue собственост.

Следният пример за код показва как да се получи стойността на цифровия подпис като байт масив от документ:

// 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);
}

Премахване на цифрови подписи

Aspose.Words ви позволява да премахнете всички цифрови подписи от подписан документ с помощта на RemoveAllSignatures метод.

Следният пример за код показва как да заредите и премахнете цифровите подписи от документ:

// 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);