Lucrul cu semnături digitale

O semnătură digitală este utilizată pentru autentificarea unui document pentru a stabili că expeditorul documentului este cine spune că este și că conținutul documentului nu a fost modificat.

Aspose.Words acceptă documente cu semnături digitale și oferă acces la acestea, permițându-vă să detectați și să validați semnăturile digitale pe un document și să semnați un document PDF generat cu un certificat furnizat. În prezent, semnăturile digitale sunt acceptate pe documentele DOC, OOXML și ODT. Semnarea documentelor generate este acceptată în format PDF.

Semnăturile digitale nu sunt păstrate pe Open și Save

Un punct important de remarcat este că un document încărcat și apoi salvat folosind Aspose.Words va pierde orice semnături digitale semnate pe document. Aceasta este prin design, deoarece o semnătură digitală asigură că conținutul nu a fost modificat și, în plus, autentifică identitatea persoanei care a semnat documentul. Aceste principii ar fi invalidate dacă semnăturile originale ar fi transferate în documentul rezultat.

Din acest motiv, dacă procesați documente încărcate pe un server, acest lucru ar putea însemna că puteți corupe un document încărcat pe serverul dvs. în acest fel fără să știți. Prin urmare, cel mai bine este să verificați semnăturile digitale pe un document și să luați măsurile corespunzătoare dacă se găsesc, de exemplu, o alertă poate fi trimisă clientului informându-l că documentul pe care îl transmite conține semnături digitale care se vor pierde dacă este procesat. Puteți descărca fișierul șablon al acestui exemplu din aici.

# 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.")

Codul de mai sus utilizează metoda FileFormatUtil.detect_file_format pentru a detecta dacă un document conține semnături digitale fără a încărca mai întâi documentul. Aceasta oferă o modalitate eficientă și sigură de a verifica semnăturile unui document înainte de a le procesa. Când este executată, metoda returnează un obiect FileFormatInfo care furnizează proprietatea FileFormatInfo.has_digital_signature. Această proprietate returnează true dacă documentul conține una sau mai multe semnături digitale. Este important să rețineți că această metodă nu validează semnăturile, ci determină doar dacă semnăturile sunt prezente. Validarea semnăturilor digitale este prezentată în secțiunea următoare.

Semnături digitale pe macrocomenzi (VBA proiecte)

Semnăturile digitale de pe macrocomenzi nu pot fi accesate sau semnate. Acest lucru se datorează faptului că Aspose.Words nu se ocupă direct de macrocomenzi într-un document. Cu toate acestea, semnăturile digitale pe macrocomenzi sunt păstrate atunci când exportați documentul înapoi în orice format word. Aceste semnături pot fi păstrate pe codul VBA deoarece conținutul binar al macrocomenzilor nu este modificat chiar dacă documentul în sine este modificat.

Accesați și verificați semnăturile digitale

Un document poate avea mai multe semnături digitale. Aceste semnături pot fi accesate prin colecția Document.digital_signatures. Fiecare obiect returnat este un DigitalSignature care reprezintă o singură semnătură digitală aparținând documentului. Aceasta oferă membrilor care vă permit să verificați validitatea semnăturii.

Cea mai importantă proprietate de verificat cu semnături digitale este valabilitatea fiecărei semnături din document. Toate semnăturile din document pot fi validate simultan apelând proprietatea DigitalSignatureCollection.is_valid. Aceasta va returna true dacă toate semnăturile din document sunt valide sau dacă documentul nu are semnături și false dacă cel puțin o semnătură digitală nu este validă.

Fiecare semnătură poate fi, de asemenea, validată individual prin apelarea DigitalSignature.is_valid. O semnătură poate reveni nevalidă din mai multe motive, de exemplu documentul a fost modificat de la semnare sau certificatul a expirat. În plus, detalii suplimentare ale semnăturii pot fi, de asemenea, accesate. Eșantionul de cod de mai jos arată cum să validați fiecare semnătură dintr-un document și să afișați informații de bază despre semnătură. Puteți descărca fișierul șablon al acestui exemplu din aici.

# 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()

Semnarea Documentelor Word

DigitalSignatureUtil clasa oferă metode pentru semnarea documentului. DigitalSignatureUtil.sign metoda semnează documentul sursă folosind dat CertificateHolder cu semnătură digitală și scrie documentul semnat în fluxul de destinație.

Exemplul de mai jos arată cum să semnați un document simplu.

# 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)

Exemplul de mai jos arată cum să semneze documentul criptat.

# 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)

Semnarea documentului Word cu linia de semnătură

Puteți semna documentul sursă folosind dat CertificateHolder și SignOptions cu semnătură digitală și scrie documentul semnat în fișierul destinație. Folosind clasa SignOptions Puteți specifica opțiuni pentru semnarea documentelor. Exemplul de mai jos arată cum să creați o nouă linie de semnătură și un document de semnare.

# 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)

Exemplul de mai jos arată cum să modificați linia de semnătură existentă și documentul de semnare.

# 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)

Semnarea documentului Word utilizând identificatorul furnizorului de semnături

Exemplul de mai jos arată cum să semnați documentul Word utilizând identificatorul furnizorului de semnături. Furnizorul de servicii criptografice (CSP) este un modul software independent care efectuează de fapt algoritmi de criptografie pentru autentificare, codificare și criptare. MS Office își rezervă valoarea {00000000-0000-0000-0000-000000000000} Pentru furnizorul său implicit de semnături.

# 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)

Creați un nou Document de semnare a liniei de semnătură utilizând identificatorul furnizorului

Exemplul de mai jos arată cum să creați linia de semnătură și să semnați documentul Word utilizând identificatorul furnizorului de semnătură.

# 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)

Regăsiți valoarea semnăturii digitale

Aspose.Words oferă, de asemenea, posibilitatea de a prelua valoarea semnăturii digitale dintr-un document semnat digital ca matrice de octeți folosind proprietatea SignatureValue.

Următorul exemplu de cod arată cum se obține valoarea semnăturii digitale ca matrice de octeți dintr-un document:

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}")