Работа с цифрови подписи
Цифровият подпис е технологично приложение на електронните подписи за подписване и удостоверяване на подписа, за да се гарантира, че документът не е бил изменян от момента на подписването му. Всеки цифров подпис е уникален за всеки подпис, поради следването на протокола 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 Клас.
Например, снимката по-долу показва колко валидни и невалидни подписи могат да бъдат показани.


Също така, ако документът съдържа линия за подпис и няма цифров подпис, има функция, която да поиска от потребителя да добави подпис.
Следният пример за код показва как да се подпише документ с личен сертификат и определен подпис:
// 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 дигиталният подпис се проверява като настоящ и валиден.
Изтегляне на стойността на цифровия подпис
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); |