Praca z podpisami cyfrowymi

Podpis cyfrowy to technologiczna implementacja podpisów elektronicznych do podpisywania dokumentów i uwierzytelniania osoby podpisującej w celu zagwarantowania, że dokument nie został zmodyfikowany od czasu jego podpisania. Każdy podpis cyfrowy jest unikalny dla każdego sygnatariusza ze względu na przestrzeganie protokołu PKI w celu generowania zarówno kluczy publicznych, jak i prywatnych. Podpisanie dokumentu cyfrowo oznacza utworzenie podpisu przy użyciu klucza prywatnego sygnatariusza, w którym do szyfrowania wygenerowanego skrótu używany jest algorytm matematyczny.

Aspose.Words umożliwia wykrycie, policzenie lub weryfikację istniejących podpisów cyfrowych, a także dodanie nowego podpisu do dokumentu, aby wykryć wszelkie manipulacje w nim. Możesz także usunąć wszystkie podpisy cyfrowe z dokumentu. Użyj klasy DigitalSignatureUtil do pracy z podpisami cyfrowymi.

W tym artykule wyjaśniono, jak wykonać wszystkie powyższe czynności, aby zweryfikować autentyczność i integralność dokumentu cyfrowego.

Obsługiwane Formaty

Aspose.Words umożliwia pracę z podpisami cyfrowymi na dokumentach DOC, OOXML i ODT oraz podpisywanie wygenerowanego dokumentu w formacie PDF lub XPS.

Ograniczenia podpisów cyfrowych

Poniższa tabela opisuje kilka ograniczeń, które możesz napotkać podczas pracy z podpisami cyfrowymi za pośrednictwem Aspose.Words, a także kilka alternatywnych opcji.

Ograniczenie Opcja alternatywna
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. Sprawdź, czy dokument ma podpisy cyfrowe i podejmij odpowiednie działania, jeśli zostaną znalezione. Na przykład wyślij alert do klientów, informując ich, że przesyłany dokument zawiera podpisy cyfrowe, które zostaną utracone w przypadku przetworzenia.
Aspose.Words obsługuje pracę z makrami w dokumencie. Ale Aspose.Words nie obsługuje jeszcze podpisów cyfrowych na makrach. Eksportuj dokument z powrotem do dowolnego formatu Word i użyj Microsoft Word, aby dodać podpis cyfrowy do makr.

Wykrywaj, licz i weryfikuj Podpisy cyfrowe

Aspose.Words umożliwia wykrycie podpisu cyfrowego w dokumencie przy użyciu metody DetectFileFormat i właściwości HasDigitalSignature. Warto zauważyć, że taka kontrola wykryje tylko fakt podpisu, ale nie jego ważność.

Dokument może być podpisany więcej niż jeden raz, a mogą to zrobić różni użytkownicy. Aby sprawdzić ważność podpisów cyfrowych, musisz załadować je z dokumentu przy użyciu metody LoadSignatures i użyć właściwości IsValid. Również Aspose.Words pozwala policzyć zestaw wszystkich podpisów cyfrowych w dokumencie przy użyciu właściwości Count.

Wszystko to zapewnia skuteczny i bezpieczny sposób sprawdzania dokumentu pod kątem podpisów przed jego przetworzeniem.

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-C.git.
SharedPtr<FileFormatInfo> info = FileFormatUtil::DetectFileFormat(MyDir + u"Digitally signed.docx");
if (info->get_HasDigitalSignature())
{
std::cout << (String::Format(u"Document {0} has digital signatures, ", System::IO::Path::GetFileName(MyDir + u"Digitally signed.docx")) +
u"they will be lost if you open/save this document with Aspose.Words.")
<< std::endl;
}

Utwórz podpis cyfrowy

Aby utworzyć podpis cyfrowy, musisz załadować certyfikat podpisywania potwierdzający tożsamość. Kiedy wysyłasz podpisany cyfrowo dokument, wysyłasz również swój certyfikat i klucz publiczny.

Aspose.Words umożliwia utworzenie certyfikatu X. 509, certyfikatu cyfrowego, który wykorzystuje międzynarodowy standard X. 509 PKI w celu sprawdzenia, czy klucz publiczny należy do podpisującego zawartego w certyfikacie. Aby to zrobić, użyj metody Create w klasie CertificateHolder.

W następnych sekcjach wyjaśniono, jak dodać podpis cyfrowy, wiersz podpisu i jak podpisać wygenerowany dokument PDF.

Podpisz dokument

Aspose.Words umożliwia podpisanie dokumentu DOC, DOCX lub ODT cyfrowo przy użyciu metody Sign i właściwości SignOptions.

Poniższy przykład kodu pokazuje, jak podpisywać dokumenty za pomocą posiadacza certyfikatu i opcji podpisywania:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C.git.
SharedPtr<CertificateHolder> certHolder = CertificateHolder::Create(MyDir + u"morzal.pfx", u"aw");
DigitalSignatureUtil::Sign(MyDir + u"Digitally signed.docx", ArtifactsDir + u"Document.Signed.docx", certHolder);
view raw sign-document.h hosted with ❤ by GitHub

Dodaj linię podpisu

Linia podpisu to wizualna reprezentacja podpisu cyfrowego w dokumencie. Aspose.Words umożliwia wstawienie linii podpisu przy użyciu metody DocumentBuilder.InsertSignatureLine. Możesz także ustawić parametry dla tej reprezentacji za pomocą klasy SignatureLineOptions.

Na przykład poniższy obrazek pokazuje, jak można wyświetlać prawidłowe i nieprawidłowe podpisy.

valid-signature invalid-signature

Ponadto, jeśli dokument zawiera wiersz podpisu i nie ma podpisu cyfrowego, istnieje funkcja, która prosi użytkownika o dodanie podpisu.

Poniższy przykład kodu pokazuje, jak podpisać dokument osobistym certyfikatem i określoną linią podpisu:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C.git.
auto doc = MakeObject<Document>();
auto builder = MakeObject<DocumentBuilder>(doc);
auto signatureLineOptions = MakeObject<SignatureLineOptions>();
signatureLineOptions->set_Signer(u"vderyushev");
signatureLineOptions->set_SignerTitle(u"QA");
signatureLineOptions->set_Email(u"vderyushev@aspose.com");
signatureLineOptions->set_ShowDate(true);
signatureLineOptions->set_DefaultInstructions(false);
signatureLineOptions->set_Instructions(u"Please sign here.");
signatureLineOptions->set_AllowComments(true);
SharedPtr<SignatureLine> signatureLine = builder->InsertSignatureLine(signatureLineOptions)->get_SignatureLine();
signatureLine->set_ProviderId(System::Guid::Parse(u"CF5A7BB4-8F3C-4756-9DF6-BEF7F13259A2"));
doc->Save(ArtifactsDir + u"SignDocuments.SignatureLineProviderId.docx");
auto signOptions = MakeObject<SignOptions>();
signOptions->set_SignatureLineId(signatureLine->get_Id());
signOptions->set_ProviderId(signatureLine->get_ProviderId());
signOptions->set_Comments(u"Document was signed by vderyushev");
signOptions->set_SignTime(System::DateTime::get_Now());
SharedPtr<CertificateHolder> certHolder = CertificateHolder::Create(MyDir + u"morzal.pfx", u"aw");
DigitalSignatureUtil::Sign(ArtifactsDir + u"SignDocuments.SignatureLineProviderId.docx",
ArtifactsDir + u"SignDocuments.CreateNewSignatureLineAndSetProviderId.docx", certHolder, signOptions);

Podpisz wygenerowany PDF Dokument

Aspose.Words umożliwia podpisanie i uzyskanie wszystkich szczegółów dokumentu PDF przy użyciu właściwości PdfDigitalSignatureDetails.

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-C.git.
auto doc = MakeObject<Document>();
auto builder = MakeObject<DocumentBuilder>(doc);
builder->Writeln(u"Test Signed PDF.");
auto saveOptions = MakeObject<PdfSaveOptions>();
saveOptions->set_DigitalSignatureDetails(MakeObject<PdfDigitalSignatureDetails>(CertificateHolder::Create(MyDir + u"morzal.pfx", u"aw"), u"reason",
u"location", System::DateTime::get_Now()));
doc->Save(ArtifactsDir + u"WorkingWithPdfSaveOptions.DigitallySignedPdfUsingCertificateHolder.pdf", saveOptions);

Pobierz wartość podpisu cyfrowego

Aspose.Words zapewnia również możliwość pobierania wartości podpisu cyfrowego z podpisanego cyfrowo dokumentu jako tablicy bajtów przy użyciu właściwości SignatureValue.

Poniższy przykład kodu pokazuje, jak uzyskać wartość podpisu cyfrowego jako tablicę bajtów z dokumentu:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C.git.
auto doc = MakeObject<Document>(MyDir + u"Digitally signed.docx");
for (const auto& digitalSignature : doc->get_DigitalSignatures())
{
auto signatureValue = System::Convert::ToBase64String(digitalSignature->get_SignatureValue());
ASSERT_EQ(u"K1cVLLg2kbJRAzT5WK+m++G8eEO+l7S+5ENdjMxxTXkFzGUfvwxREuJdSFj9AbDMhnGvDURv9KEhC25DDF1al8NRVR71TF3CjHVZXpYu7edQS5/yLw/k5CiFZzCp1+MmhOdYPcVO+Fm+9fKr2iNLeyYB+fgEeZHfTqTFM2WwAqo=", signatureValue);
}

Usuwanie Podpisów Cyfrowych

Aspose.Words umożliwia usunięcie wszystkich podpisów cyfrowych z podpisanego dokumentu przy użyciu metody RemoveAllSignatures.

Poniższy przykład kodu pokazuje, jak załadować i usunąć podpisy cyfrowe z dokumentu:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C.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 + u"Digitally signed.docx", ArtifactsDir + u"DigitalSignatureUtil.LoadAndRemove.FromString.docx");
// 2 - Determine the locations of both the signed document and the unsigned copy by file streams:
{
SharedPtr<System::IO::Stream> streamIn = MakeObject<System::IO::FileStream>(MyDir + u"Digitally signed.docx", System::IO::FileMode::Open);
{
SharedPtr<System::IO::Stream> streamOut =
MakeObject<System::IO::FileStream>(ArtifactsDir + u"DigitalSignatureUtil.LoadAndRemove.FromStream.docx", System::IO::FileMode::Create);
DigitalSignatureUtil::RemoveAllSignatures(streamIn, streamOut);
}
}
// Verify that both our output documents have no digital signatures.
ASSERT_EQ(0, DigitalSignatureUtil::LoadSignatures(ArtifactsDir + u"DigitalSignatureUtil.LoadAndRemove.FromString.docx")->get_Count());
ASSERT_EQ(0, DigitalSignatureUtil::LoadSignatures(ArtifactsDir + u"DigitalSignatureUtil.LoadAndRemove.FromStream.docx")->get_Count());