Praca z podpisami cyfrowymi
Podpis cyfrowy jest technologicznym wdrożeniem podpisów elektronicznych w celu podpisania dokumentów i uwierzytelnienia podpisującego w celu zagwarantowania, że dokument nie został zmodyfikowany od momentu jego podpisania. Każdy podpis cyfrowy jest unikalny dla każdego sygnatariusza ze względu na przestrzeganie protokołu PKI, aby wygenerować zarówno klucze publiczne i prywatne. Podpisanie dokumentu cyfrowo oznacza stworzenie podpisu przy użyciu klucza prywatnego signera, gdzie do szyfrowania wygenerowanego haszu używany jest algorytm matematyczny.
Aspose.Words pozwala wykryć, policzyć lub zweryfikować istniejące podpisy cyfrowe, a także dodać nowy podpis do dokumentu, aby dowiedzieć się o wszelkich manipulacji w nim. Można również usunąć wszystkie podpisy cyfrowe z dokumentu. Użyj DigitalSignatureUtil klasy do pracy z podpisów cyfrowych.
Ten artykuł wyjaśnia, jak zrobić wszystkie powyższe, aby potwierdzić autentyczność i integralność dokumentu cyfrowego.
Spróbuj online
Możesz spróbować tej funkcjonalności z naszym Bezpłatny podpis online.
Obsługiwane formaty
Aspose.Words umożliwia pracę z podpisami cyfrowymi na dokumentach DOC, OOXML i ODT oraz podpisanie wygenerowanego dokumentu w formacie PDF lub XPS format.
Ograniczenia oznaczeń cyfrowych
Poniższa tabela opisuje kilka ograniczeń, z którymi możesz się zmierzyć podczas pracy z podpisami cyfrowymi poprzez Aspose.Words, oraz kilka alternatywnych opcji.
Ograniczenie | Wariant alternatywny |
---|---|
Utrata podpisów cyfrowych na dokumencie po załadowaniu i zapisaniu. Dlatego przetwarzanie dokumentu na serwer może spowodować utratę wszystkich podpisów cyfrowych bez powiadomienia | Sprawdzić, czy dokument posiada podpis cyfrowy i podjąć odpowiednie działania, jeśli zostaną znalezione. Na przykład, wysłać wpis do klientów, informując ich, że dokument, który przesyłają zawiera podpis cyfrowy, który zostanie utracony, jeśli zostanie przetworzony |
Aspose.Words obsługuje pracę z makrami w dokumencie. Ale… Aspose.Words nie obsługuje jeszcze podpisów cyfrowych na makro | Eksportuj dokument z powrotem do dowolnego formatu Word i użyj Microsoft Word dodanie podpisu cyfrowego do makr |
Wykrywanie, liczenie i weryfikowanie oznaczeń cyfrowych
Aspose.Words pozwala na wykrycie podpisu cyfrowego w dokumencie za pomocą DetectFileFormat metoda i HasDigitalSignature nieruchomości. Warto zauważyć, że taka kontrola wykryje jedynie fakt podpisu, ale nie jego ważność.
Dokument może być podpisany więcej niż jeden raz i może być wykonany przez różnych użytkowników. Aby sprawdzić ważność podpisów cyfrowych, należy załadować je z dokumentu za pomocą LoadSignatures metody i używać IsValid nieruchomości. Również Aspose.Words pozwala policzyć zestaw wszystkich podpisów cyfrowych w dokumencie za pomocą Count nieruchomości.
Wszystko to zapewnia skuteczny i bezpieczny sposób sprawdzenia dokumentów pod kątem podpisów przed ich przetwarzaniem.
Poniższy przykład kodu pokazuje jak wykryć obecność podpisów cyfrowych i je zweryfikować:
// 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 + "); | |
} |
Utwórz podpis cyfrowy
Aby utworzyć podpis cyfrowy, trzeba będzie załadować certyfikat podpisu, który potwierdza tożsamość. Po wysłaniu dokumentu podpisanego cyfrowo, wysyłasz także swój certyfikat i klucz publiczny.
Aspose.Words pozwala na stworzenie certyfikatu X.509, cyfrowego certyfikatu, który wykorzystuje akceptowany na całym świecie standard X.509 PKI w celu sprawdzenia, czy klucz publiczny należy do sygnatariusza umieszczonego w certyfikacie. Aby to zrobić, należy użyć Create metoda w ramach CertificateHolder Klasa.
Kolejne sekcje wyjaśniają jak dodać podpis cyfrowy, linię podpisu i jak podpisać wygenerowany dokument PDF.
Podpisz dokument
Aspose.Words pozwala na podpisanie dokumentu DOC, DOCX lub ODT cyfrowo za pomocą Sign metoda i SignOptions nieruchomości.
Poniższy przykład kodu pokazuje, jak podpisywać dokumenty przy użyciu posiadacza certyfikatu i podpisywać opcje:
// 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); |
Dodaj linię podpisu
Linia podpisu jest wizualną reprezentacją podpisu cyfrowego w dokumencie. Aspose.Words pozwala na wstawianie linii podpisu za pomocą DocumentBuilder.InsertSignatureLine Metoda. Można również ustawić parametry dla tej reprezentacji za pomocą SignatureLineOptions Klasa.
Na przykład poniższy obrazek pokazuje, jak ważne i nieprawidłowe mogą być wyświetlane podpisy.


Ponadto, jeśli dokument zawiera linię podpisu i nie ma podpisu cyfrowego, istnieje funkcja, aby poprosić użytkownika o dodanie podpisu.
Poniższy przykład kodu pokazuje, jak podpisać dokument z certyfikatem osobistym i określoną linią podpisu:
// 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); |
Podpisz wygenerowany dokument PDF
Aspose.Words pozwala podpisać i uzyskać wszystkie szczegóły dokumentu PDF za pomocą PdfDigitalSignatureDetails nieruchomości.
Poniższy przykład kodu pokazuje jak podpisać wygenerowany 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); |
Poniższe zdjęcie pokazuje, że wygenerowany dokument PDF jest otwarty w Adobe Acrobat i podpis cyfrowy jest weryfikowany jako obecny i ważny.
Pobieranie wartości podpisu cyfrowego
Aspose.Words zapewnia również możliwość pobrania wartości podpisu cyfrowego z podpisanego cyfrowo dokumentu jako tablicy bajtów za pomocą SignatureValue nieruchomości.
Poniższy przykład kodu pokazuje, jak uzyskać cyfrową wartość podpisu jako tablicę bajtów 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); | |
} |
Usuń znaki cyfrowe
Aspose.Words pozwala na usunięcie wszystkich podpisów cyfrowych z podpisanego dokumentu za pomocą RemoveAllSignatures Metoda.
Poniższy przykład kodu pokazuje jak załadować i usunąć podpis cyfrowy 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); |