Praca z podpisami cyfrowymi

Podpis cyfrowy służy do uwierzytelnienia dokumentu w celu ustalenia, że nadawca dokumentu jest tym, za kogo się podaje, a treść dokumentu nie została naruszona.

Aspose.Words obsługuje dokumenty z podpisami cyfrowymi i zapewnia do nich dostęp, umożliwiając wykrycie i weryfikację podpisów cyfrowych na dokumencie oraz podpisanie wygenerowanego dokumentu PDF dostarczonym certyfikatem. Obecnie podpisy cyfrowe są obsługiwane w dokumentach DOC, OOXML i ODT. Podpisywanie wygenerowanych dokumentów obsługiwane jest w formacie PDF.

Podpisy cyfrowe nie są zachowywane podczas otwierania i zapisywania

Należy pamiętać, że dokument załadowany, a następnie zapisany przy użyciu formatu Aspose.Words utraci wszelkie podpisy cyfrowe podpisane na dokumencie. Jest to zgodne z projektem, ponieważ podpis cyfrowy gwarantuje, że treść nie została zmodyfikowana, a ponadto potwierdza tożsamość osoby, która podpisała dokument. Zasady te utraciłyby ważność, gdyby oryginalne podpisy zostały przeniesione na dokument powstały.

Z tego powodu, jeśli przetwarzasz dokumenty przesłane na serwer, może to potencjalnie oznaczać, że możesz bez wiedzy uszkodzić dokument przesłany na serwer w ten sposób. Dlatego najlepiej jest sprawdzić podpisy cyfrowe na dokumencie i podjąć odpowiednie działania w przypadku ich znalezienia, na przykład można wysłać do klienta alert informujący, że przekazywany przez niego dokument zawiera podpisy cyfrowe, które zostaną utracone w przypadku obrobiony. Możesz pobrać plik szablonu tego przykładu z Tutaj.

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

Powyższy kod wykorzystuje metodę FileFormatUtil.detect_file_format do wykrywania, czy dokument zawiera podpisy cyfrowe, bez konieczności wcześniejszego ładowania dokumentu. Zapewnia to skuteczny i bezpieczny sposób sprawdzenia dokumentu pod kątem podpisów przed ich przetworzeniem. Po wykonaniu metoda zwraca obiekt FileFormatInfo, który udostępnia właściwość FileFormatInfo.has_digital_signature. Ta właściwość zwraca true, jeśli dokument zawiera jeden lub więcej podpisów cyfrowych. Należy zauważyć, że ta metoda nie sprawdza poprawności podpisów, a jedynie sprawdza, czy podpisy są obecne. Sprawdzanie poprawności podpisów cyfrowych opisano w następnej sekcji.

Podpisy cyfrowe w makrach (projekty VBA)

Nie można uzyskać dostępu do podpisów cyfrowych w makrach ani ich podpisać. Dzieje się tak, ponieważ Aspose.Words nie zajmuje się bezpośrednio makrami w dokumencie. Jednak podpisy cyfrowe w makrach są zachowywane podczas eksportowania dokumentu z powrotem do dowolnego formatu Word. Podpisy te można zachować w kodzie VBA, ponieważ binarna zawartość makr nie ulega zmianie nawet w przypadku modyfikacji samego dokumentu.

Uzyskaj dostęp i weryfikuj podpisy cyfrowe

Dokument może mieć wiele podpisów cyfrowych. Dostęp do tych podpisów można uzyskać poprzez kolekcję Document.digital_signatures. Każdy zwrócony obiekt to plik DigitalSignature reprezentujący pojedynczy podpis cyfrowy należący do dokumentu. Zapewnia to członkom możliwość sprawdzenia ważności podpisu.

Najważniejszą właściwością, którą należy sprawdzić w przypadku podpisów cyfrowych, jest ważność każdego podpisu w dokumencie. Wszystkie podpisy w dokumencie można sprawdzić jednocześnie, wywołując właściwość DigitalSignatureCollection.is_valid. Spowoduje to zwrócenie formatu true, jeśli wszystkie podpisy w dokumencie są ważne lub jeśli dokument nie zawiera podpisów, oraz false, jeśli co najmniej jeden podpis cyfrowy jest nieprawidłowy.

Każdy podpis można również sprawdzić indywidualnie, wywołując DigitalSignature.is_valid. Podpis może zostać zwrócony nieważny z kilku powodów, na przykład dokument został zmieniony od czasu podpisania lub wygasł ważność certyfikatu. Dodatkowo można uzyskać dostęp do dodatkowych szczegółów podpisu. Poniższy przykładowy kod pokazuje, jak sprawdzić poprawność każdego podpisu w dokumencie i wyświetlić podstawowe informacje o podpisie. Możesz pobrać plik szablonu tego przykładu z Tutaj.

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

Podpisywanie dokumentów Worda

Klasa DigitalSignatureUtil udostępnia metody podpisywania dokumentu. Metoda DigitalSignatureUtil.sign podpisuje dokument źródłowy przy użyciu podanego formatu CertificateHolder podpisem cyfrowym i zapisuje podpisany dokument do strumienia docelowego

Poniższy przykład pokazuje jak podpisać prosty 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)

Poniższy przykład pokazuje jak podpisać zaszyfrowany 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)

Podpisywanie dokumentu Word za pomocą linii podpisu

Możesz podpisać dokument źródłowy przy użyciu podanych formatów CertificateHolder i SignOptions podpisem cyfrowym i zapisać podpisany dokument do pliku docelowego. Za pomocą klasy SignOptions możesz określić opcje podpisywania dokumentu. Poniższy przykład pokazuje jak utworzyć nową linię podpisu i podpisać 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)

Poniższy przykład pokazuje jak zmodyfikować istniejącą linię podpisu i podpisać 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)

Podpisywanie dokumentu programu Word przy użyciu identyfikatora dostawcy podpisu

Poniższy przykład pokazuje, jak podpisać dokument Word przy użyciu identyfikatora dostawcy podpisu. Dostawca usług kryptograficznych (CSP) to niezależny moduł oprogramowania, który faktycznie wykonuje algorytmy kryptograficzne w celu uwierzytelniania, kodowania i szyfrowania. MS Office rezerwuje wartość {00000000-0000-0000-0000-000000000000} dla swojego domyślnego dostawcy podpisów.

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

Utwórz nowy dokument Word z linią podpisu, korzystając z identyfikatora dostawcy

Poniższy przykład pokazuje, jak utworzyć linię podpisu i podpisać dokument Word przy użyciu identyfikatora dostawcy 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)

Pobierz wartość podpisu cyfrowego

Aspose.Words zapewnia także możliwość pobrania wartości podpisu cyfrowego z dokumentu podpisanego cyfrowo w postaci tablicy bajtów przy użyciu właściwości SignatureValue.

Poniższy przykład kodu pokazuje, jak uzyskać wartość podpisu cyfrowego w postaci tablicy bajtów 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}")