Práce s digitálními podpisy
Digitální podpis je technologická implementace elektronických podpisů k podepisování dokumentů a ověřování podepisujícího, aby bylo zaručeno, že dokument nebyl od podpisu změněn. Každý digitální podpis je jedinečný pro každého podepisujícího, protože následuje PKI protokol pro generování veřejných i soukromých klíčů. Digitální podepsání dokumentu znamená vytvoření podpisu pomocí soukromého klíče podepisujícího, kde se k šifrování generovaného hash používá matematický algoritmus.
Aspose.Words umožňuje detekovat, počítat nebo ověřovat existující digitální podpisy a také přidat nový podpis do dokumentu, abyste zjistili jakoukoli manipulaci v něm. Z dokumentu můžete také odebrat všechny digitální podpisy. Pro práci s digitálními podpisy použijte třídu DigitalSignatureUtil.
Tento článek vysvětluje, jak provést všechny výše uvedené kroky k ověření pravosti a integrity digitálního dokumentu.
Vyzkoušejte online
Tuto funkci můžete vyzkoušet pomocí našeho Zdarma online podpis.
Podporované Formáty
Aspose.Words umožňuje pracovat s digitálními podpisy na dokumentech DOC, OOXML a ODT a podepisovat vygenerovaný dokument ve formátu PDF nebo XPS.
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 pomocí Aspose.Words, a také některé alternativní možnosti.
Omezení | Alternativa |
---|---|
Ztráta digitálních podpisů na dokumentu po jeho načtení a uložení. Zpracování dokumentu na server proto může způsobit ztrátu všech digitálních podpisů bez předchozího upozornění. | Zkontrolujte, zda má dokument digitální podpisy, a pokud jsou nějaké nalezeny, proveďte příslušná opatření. Například pošlete klientům upozornění, že dokument, který nahrávají, obsahuje digitální podpisy, které budou při zpracování ztraceny. |
Aspose.Words podporuje práci s makry v dokumentu. Ale Aspose.Words zatím nepodporuje digitální podpisy na makrech. | Exportujte dokument zpět do libovolného formátu Word a pomocí Microsoft Word přidejte digitální podpis do Maker. |
Zjišťování, počítání a ověřování digitálních podpisů
Aspose.Words umožňuje detekovat digitální podpis v dokumentu pomocí metody DetectFileFormat a vlastnosti HasDigitalSignature. Stojí za zmínku, že taková kontrola zjistí pouze skutečnost podpisu, ale ne jeho platnost.
Dokument může být podepsán více než jednou, a to mohou provést různí uživatelé. Chcete-li zkontrolovat platnost digitálních podpisů, musíte je načíst z dokumentu pomocí metody LoadSignatures a použít vlastnost IsValid. Také Aspose.Words umožňuje počítat sadu všech digitálních podpisů v dokumentu pomocí Vlastnosti Count.
To vše poskytuje efektivní a bezpečný způsob kontroly podpisů dokumentu před jeho zpracováním.
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-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; | |
} |
Vytvoření digitálního podpisu
Chcete-li vytvořit digitální podpis, budete muset načíst podpisový certifikát, který potvrzuje identitu. Když odešlete digitálně podepsaný dokument, odešlete také 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ří podepisujícímu příjemci obsaženému v certifikátu. Chcete-li to provést, použijte metodu Create v rámci třídy CertificateHolder.
Další části vysvětlují, jak přidat digitální podpis, řádek podpisu a jak podepsat vygenerovaný dokument PDF.
Podepište dokument
Aspose.Words umožňuje digitálně podepsat dokument DOC, DOCX nebo ODT pomocí metody Sign a vlastností SignOptions.
Následující příklad kódu ukazuje, jak podepisovat dokumenty pomocí držitele certifikátu a možností podepisování:
// 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); |
Přidání řádku podpisu
Podpisový řádek je vizuální reprezentace digitálního podpisu v dokumentu. Aspose.Words umožňuje vložit řádek podpisu pomocí metody DocumentBuilder.InsertSignatureLine. Parametry pro tuto reprezentaci můžete také nastavit pomocí třídy SignatureLineOptions.
Například obrázek níže ukazuje, jak lze zobrazit platné a neplatné podpisy.


Pokud dokument obsahuje řádek podpisu a žádný digitální podpis, existuje funkce, která uživatele požádá o přidání podpisu.
Následující příklad kódu ukazuje, jak podepsat dokument osobním certifikátem a konkrétním podpisovým řádkem:
// 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); |
Podepsat vygenerovaný PDF dokument
Aspose.Words umožňuje podepsat a získat všechny podrobnosti o PDF dokumentu pomocí vlastností PdfDigitalSignatureDetails.
Následující příklad kódu ukazuje, jak podepsat vygenerovaný 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); |
Načtení hodnoty digitálního podpisu
Aspose.Words také poskytuje možnost načíst hodnotu digitálního podpisu z digitálně podepsaného dokumentu jako bajtové pole pomocí vlastnosti SignatureValue.
Následující příklad kódu ukazuje, jak získat hodnotu digitálního podpisu jako bajtové pole 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); | |
} |
Odstranění Digitálních Podpisů
Aspose.Words umožňuje odstranit všechny digitální podpisy ze podepsaného dokumentu pomocí metody RemoveAllSignatures.
Následující příklad kódu ukazuje, jak načíst a odebrat digitální podpisy 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()); |