Práce s digitálními podpisy

K ověření dokladu se používá digitální podpis, který prokazuje, že odesílatelem dokladu je, kdo tvrdí, že je a s obsahem dokumentu nebylo manipulováno.

Aspose.Words podporuje dokumenty s digitálními podpisy a poskytuje k nim přístup, který vám umožní detekovat a validovat digitální podpisy na dokumentu a podepsat vygenerovaný dokument PDF s dodaným certifikátem. V současné době jsou digitální podpisy podporovány na dokumentech DOC, OOXML a ODT. Podepisování generovaných dokumentů je podporováno ve formátu PDF.

Digitální podpisy nejsou uloženy na otevřeném a uložit

Důležité je poznamenat, že dokument načten a pak uložen pomocí Aspose.Words ztratí jakékoli digitální podpisy podepsané na dokumentu. Je to návrh digitálního podpisu, který zajišťuje, že obsah nebyl upraven, a dále ověřuje, kdo dokument podepsal. Tyto zásady by byly neplatné, pokud by původní podpisy byly přeneseny do výsledného dokumentu.

Vzhledem k tomu, pokud zpracováváte dokumenty nahrané na server, mohlo by to potenciálně znamenat, že můžete zkazit dokument nahraný na váš server tímto způsobem bez vědomí. Proto je nejlepší zkontrolovat digitální podpisy na dokumentu a přijmout vhodná opatření, pokud jsou nalezeny, např. záznam může být zaslán klientovi, který je informuje o tom, že dokument, který míjí, obsahuje digitální podpisy, které budou ztraceny, pokud bude zpracován. Můžete si stáhnout šablonu souboru tohoto příkladu z Tady.

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
info = aw.FileFormatUtil.detect_file_format(docs_base.my_dir + "Digitally signed.docx")
if info.has_digital_signature:
print("Document has digital signatures, they will be lost if you open/save this document with Aspose.words.")

Výše uvedený kód používá FileFormatUtil.detect_file_format způsob, jak zjistit, zda dokument obsahuje digitální podpisy, aniž by nejprve zadal dokument. To poskytuje účinný a bezpečný způsob, jak před jejich zpracováním ověřit podpisy dokumentu. Po provedení metoda vrací a FileFormatInfo objekt, který poskytuje vlastnost FileFormatInfo.has_digital_signature. Tato vlastnost vrací true pokud dokument obsahuje jeden nebo více digitálních podpisů. Je důležité poznamenat, že tato metoda nepotvrzuje podpisy, určuje pouze, zda existují podpisy. Ověření digitálních podpisů je zahrnuto v další části.

Digitální podpisy na Macros (VBA Projekty)

Digitální podpisy na makros nelze získat ani podepsat. To je proto, že Aspose.Words se přímo nezabývá makro v dokumentu. Nicméně digitální podpisy na makros jsou zachovány při exportu dokumentu zpět do libovolného formátu slov. Tyto podpisy lze zachovat na VBA kódu, protože binární obsah makros se nemění ani v případě, že se dokument sám upraví.

Přístup a ověření digitálních podpisů

Dokument může mít více digitálních podpisů. Všechny tyto podpisy lze získat prostřednictvím Document.digital_signatures kolekce. Každý vrácený objekt je DigitalSignature který představuje jediný digitální podpis patřící k dokumentu. To poskytuje členům, kteří vám umožní zkontrolovat platnost podpisu.

Nejdůležitější vlastnost pro kontrolu s digitálními podpisy je platnost každého podpisu v dokumentu. Všechny podpisy v dokumentu lze potvrdit najednou voláním DigitalSignatureCollection.is_valid majetek. Tohle se vrátí. true pokud jsou všechny podpisy v dokladu platné nebo pokud dokument nemá žádné podpisy a false pokud alespoň jeden digitální podpis není platný.

Každý podpis může být také individuálně potvrzen voláním DigitalSignature.is_valid. Podpis může vrátit neplatný z několika důvodů, například dokument byl změněn od podpisu nebo platnost osvědčení skončila. Dále lze získat další podrobnosti o podpisu. Vzorek kódu níže ukazuje, jak validovat každý podpis v dokumentu a zobrazí základní informace o podpisu. Můžete si stáhnout šablonu souboru tohoto příkladu z Tady.

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
doc = aw.Document(docs_base.my_dir + "Digitally signed.docx")
for signature in doc.digital_signatures :
print("*** Signature Found ***")
print("Is valid: " + str(signature.is_valid))
# This property is available in MS Word documents only.
print("Reason for signing: " + signature.comments)
print("Time of signing: " + str(signature.sign_time))
#print("Subject name: " + signature.certificate_holder.certificate.subject_name.name)
#print("Issuer name: " + signature.certificate_holder.certificate.issuer_name.name)
print()

Podepisování dokumentů slov

DigitalSignatureUtil třída poskytuje metody pro podpis dokumentu. DigitalSignatureUtil.sign metoda označuje zdrojový dokument pomocí dané CertificateHolder s digitálním podpisem a zápisem podepsaného dokumentu do cílového proudu

Níže uvedený příklad ukazuje, jak podepsat jednoduchý dokument

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
certHolder = aw.digitalsignatures.CertificateHolder.create(docs_base.my_dir + "morzal.pfx", "aw")
aw.digitalsignatures.DigitalSignatureUtil.sign(docs_base.my_dir + "Digitally signed.docx", docs_base.artifacts_dir + "Document.signed.docx", certHolder)

Níže uvedený příklad ukazuje, jak podepsat zašifrovaný dokument

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
signOptions = aw.digitalsignatures.SignOptions()
signOptions.decryption_password = "decryptionPassword"
certHolder = aw.digitalsignatures.CertificateHolder.create(docs_base.my_dir + "morzal.pfx", "aw")
aw.digitalsignatures.DigitalSignatureUtil.sign(docs_base.my_dir + "Digitally signed.docx", docs_base.artifacts_dir + "Document.encrypted_document.docx",
certHolder, signOptions)

Podepisování Word dokumentu s podpisem Line

Můžete podepsat zdrojový dokument pomocí zadaného CertificateHolder a SignOptions digitálním podpisem a zápisem podepsaného dokumentu do cílového souboru. Použití SignOptions třída můžete určit možnosti pro podepisování dokumentů. Níže uvedený příklad ukazuje, jak vytvořit nový podpisový řádek a podepsat dokument

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
doc = aw.Document()
builder = aw.DocumentBuilder(doc)
signatureLine = builder.insert_signature_line(aw.SignatureLineOptions()).signature_line
doc.save(docs_base.artifacts_dir + "SignDocuments.signature_line.docx")
signOptions = aw.digitalsignatures.SignOptions()
signOptions.signature_line_id = signatureLine.id
with open(docs_base.images_dir + "Enhanced Windows MetaFile.emf", "rb") as image_file:
signOptions.signature_line_image = image_file.read()
certHolder = aw.digitalsignatures.CertificateHolder.create(docs_base.my_dir + "morzal.pfx", "aw")
aw.digitalsignatures.DigitalSignatureUtil.sign(docs_base.artifacts_dir + "SignDocuments.signature_line.docx",
docs_base.artifacts_dir + "SignDocuments.new_signature_line.docx", certHolder, signOptions)

Níže uvedený příklad ukazuje, jak upravit existující podpisovou linii a podepsat dokument

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
doc = aw.Document(docs_base.my_dir + "Signature line.docx")
signatureLine = doc.first_section.body.get_child(aw.NodeType.SHAPE, 0, True).as_shape().signature_line
signOptions = aw.digitalsignatures.SignOptions()
signOptions.signature_line_id = signatureLine.id
imagefile = open(docs_base.images_dir + "Enhanced Windows MetaFile.emf", "rb")
with open(docs_base.images_dir + "Enhanced Windows MetaFile.emf", "rb") as image_file:
signOptions.signature_line_image = image_file.read()
certHolder = aw.digitalsignatures.CertificateHolder.create(docs_base.my_dir + "morzal.pfx", "aw")
aw.digitalsignatures.DigitalSignatureUtil.sign(docs_base.my_dir + "Digitally signed.docx",
docs_base.artifacts_dir + "SignDocuments.signing_existing_signature_line.docx", certHolder, signOptions)

Podpis Word Document pomocí identifikátoru poskytovatele podpisu

Níže uvedený příklad ukazuje, jak podepsat dokument Word pomocí identifikátoru poskytovatele podpisu. Poskytovatel šifrovacích služeb (CSP) je nezávislý softwarový modul, který ve skutečnosti provádí kryptografické algoritmy pro autentizaci, kódování a šifrování. MS Office si vyhrazuje hodnotu {00000000-0000-0000-0000-000000000000} pro svého poskytovatele podpisu v selhání.

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
doc = aw.Document(docs_base.my_dir + "Signature line.docx")
signatureLine = doc.first_section.body.get_child(aw.NodeType.SHAPE, 0, True).as_shape().signature_line
signOptions = aw.digitalsignatures.SignOptions()
signOptions.provider_id = signatureLine.provider_id
signOptions.signature_line_id = signatureLine.id
certHolder = aw.digitalsignatures.CertificateHolder.create(docs_base.my_dir + "morzal.pfx", "aw")
aw.digitalsignatures.DigitalSignatureUtil.sign(docs_base.my_dir + "Digitally signed.docx",
docs_base.artifacts_dir + "SignDocuments.set_signature_provider_id.docx", certHolder, signOptions)

Vytvořit nový podpis Line Sign Word Dokument pomocí identifikátoru poskytovatele

Níže uvedený příklad ukazuje, jak vytvořit podpisovou čáru a znak Slovní dokument pomocí identifikátoru poskytovatele podpisu.

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
doc = aw.Document()
builder = aw.DocumentBuilder(doc)
signatureLineOptions = aw.SignatureLineOptions()
signatureLineOptions.signer = "vderyushev"
signatureLineOptions.signer_title = "QA"
signatureLineOptions.email = "vderyushev@aspose.com"
signatureLineOptions.show_date = True
signatureLineOptions.default_instructions = False
signatureLineOptions.instructions = "Please sign here."
signatureLineOptions.allow_comments = True
signatureLine = builder.insert_signature_line(signatureLineOptions).signature_line
signatureLine.provider_id = uuid.UUID('{CF5A7BB4-8F3C-4756-9DF6-BEF7F13259A2}')
doc.save(docs_base.artifacts_dir + "SignDocuments.signature_line_provider_id.docx")
signOptions = aw.digitalsignatures.SignOptions()
signOptions.signature_line_id = signatureLine.id
signOptions.provider_id = signatureLine.provider_id
signOptions.comments = "Document was signed by vderyushev"
signOptions.sign_time = datetime.today()
certHolder = aw.digitalsignatures.CertificateHolder.create(docs_base.my_dir + "morzal.pfx", "aw")
aw.digitalsignatures.DigitalSignatureUtil.sign(docs_base.artifacts_dir + "SignDocuments.signature_line_provider_id.docx",
docs_base.artifacts_dir + "SignDocuments.create_new_signature_line_and_set_provider_id.docx", certHolder, signOptions)

Získat hodnotu digitálního podpisu

Aspose.Words poskytuje také možnost získat hodnotu digitálního podpisu z digitálně podepsaného dokumentu jako pole byte pomocí pole SignatureValue majetek.

Následující příklad kódu ukazuje, jak získat hodnotu digitálního podpisu jako pole byte z dokumentu:

doc = aw.Document(MY_DIR + "Digitally signed.docx")

for digital_signature in doc.digital_signatures:
    signature_value = base64.b64encode(digital_signature.signature_value)
    print(f"Base64 signature value is: {signature_value}")