Arbeiten mit digitalen Signaturen

Mithilfe einer digitalen Signatur wird ein Dokument authentifiziert, um sicherzustellen, dass der Absender des Dokuments derjenige ist, für den er sich ausgibt, und dass der Inhalt des Dokuments nicht manipuliert wurde.

Aspose.Words unterstützt Dokumente mit digitalen Signaturen und bietet Zugriff darauf, sodass Sie digitale Signaturen in einem Dokument erkennen und validieren und ein generiertes PDF-Dokument mit einem bereitgestellten Zertifikat signieren können. Derzeit werden digitale Signaturen für DOC-, OOXML- und ODT-Dokumente unterstützt. Das Signieren generierter Dokumente wird im PDF-Format unterstützt.

Digitale Signaturen bleiben beim Öffnen und Speichern nicht erhalten

Ein wichtiger Punkt ist, dass bei einem mit Aspose.Words geladenen und dann gespeicherten Dokument alle auf dem Dokument signierten digitalen Signaturen verloren gehen. Dies ist beabsichtigt, da eine digitale Signatur sicherstellt, dass der Inhalt nicht geändert wurde, und außerdem die Identität des Unterzeichners des Dokuments authentifiziert. Diese Grundsätze würden ungültig, wenn die Originalunterschriften auf das resultierende Dokument übertragen würden.

Wenn Sie auf einen Server hochgeladene Dokumente verarbeiten, kann dies daher möglicherweise dazu führen, dass Sie ein auf Ihren Server hochgeladenes Dokument auf diese Weise beschädigen, ohne es zu wissen. Daher ist es am besten, ein Dokument auf digitale Signaturen zu überprüfen und die entsprechenden Maßnahmen zu ergreifen, wenn solche gefunden werden. Beispielsweise kann eine Warnung an den Kunden gesendet werden, die ihn darüber informiert, dass das Dokument, das er weitergibt, digitale Signaturen enthält, die verloren gehen, wenn dies der Fall ist verarbeitet. Sie können die Vorlagendatei dieses Beispiels von Hier herunterladen.

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

Der obige Code verwendet die FileFormatUtil.detect_file_format-Methode, um zu erkennen, ob ein Dokument digitale Signaturen enthält, ohne das Dokument zuerst zu laden. Dies bietet eine effiziente und sichere Möglichkeit, ein Dokument vor der Verarbeitung auf Unterschriften zu prüfen. Bei der Ausführung gibt die Methode ein FileFormatInfo-Objekt zurück, das die Eigenschaft FileFormatInfo.has_digital_signature bereitstellt. Diese Eigenschaft gibt true zurück, wenn das Dokument eine oder mehrere digitale Signaturen enthält. Es ist wichtig zu beachten, dass diese Methode die Signaturen nicht validiert, sondern nur ermittelt, ob Signaturen vorhanden sind. Die Validierung digitaler Signaturen wird im nächsten Abschnitt behandelt.

Digitale Signaturen auf Makros (VBA-Projekte)

Auf digitale Signaturen von Makros kann nicht zugegriffen oder diese signiert werden. Dies liegt daran, dass Aspose.Words nicht direkt mit Makros in einem Dokument umgeht. Allerdings bleiben digitale Signaturen auf Makros erhalten, wenn das Dokument zurück in ein beliebiges Word-Format exportiert wird. Diese Signaturen können im VBA-Code beibehalten werden, da der binäre Inhalt der Makros nicht geändert wird, selbst wenn das Dokument selbst geändert wird.

Auf digitale Signaturen zugreifen und diese überprüfen

Ein Dokument kann mehrere digitale Signaturen haben. Auf diese Signaturen kann alle über die Document.digital_signatures-Sammlung zugegriffen werden. Jedes zurückgegebene Objekt ist ein DigitalSignature, das eine einzelne digitale Signatur des Dokuments darstellt. Dies bietet Mitgliedern die Möglichkeit, die Gültigkeit der Signatur zu überprüfen.

Die wichtigste Eigenschaft, die mit digitalen Signaturen überprüft werden muss, ist die Gültigkeit jeder Signatur im Dokument. Alle Signaturen im Dokument können durch Aufruf der DigitalSignatureCollection.is_valid-Eigenschaft auf einmal validiert werden. Dies gibt true zurück, wenn alle Signaturen im Dokument gültig sind oder wenn das Dokument keine Signaturen hat, und false, wenn mindestens eine digitale Signatur ungültig ist.

Jede Signatur kann auch einzeln durch den Aufruf von DigitalSignature.is_valid validiert werden. Eine Signatur kann aus mehreren Gründen ungültig sein, beispielsweise wurde das Dokument seit der Signatur geändert oder das Zertifikat ist abgelaufen. Darüber hinaus können auch zusätzliche Details der Signatur abgerufen werden. Das folgende Codebeispiel zeigt, wie jede Signatur in einem Dokument validiert und grundlegende Informationen zur Signatur angezeigt werden. Sie können die Vorlagendatei dieses Beispiels von Hier herunterladen.

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

Signieren von Word-Dokumenten

Die DigitalSignatureUtil-Klasse stellt Methoden zum Signieren von Dokumenten bereit. Die DigitalSignatureUtil.sign-Methode signiert das Quelldokument mithilfe des angegebenen CertificateHolder mit digitaler Signatur und schreibt das signierte Dokument in den Zielstream

Das folgende Beispiel zeigt, wie ein einfaches Dokument signiert wird

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

Das folgende Beispiel zeigt, wie ein verschlüsseltes Dokument signiert wird

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

Signieren eines Word-Dokuments mit der Signaturzeile

Sie können das Quelldokument mit der angegebenen CertificateHolder- und SignOptions-Datei mit digitaler Signatur signieren und das signierte Dokument in die Zieldatei schreiben. Mithilfe der SignOptions-Klasse können Sie Optionen für das Signieren von Dokumenten festlegen. Das folgende Beispiel zeigt, wie Sie eine neue Signaturzeile erstellen und ein Dokument signieren

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

Das folgende Beispiel zeigt, wie Sie eine vorhandene Signaturzeile ändern und ein Dokument signieren

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

Signieren eines Word-Dokuments mit der Signaturanbieter-ID

Das folgende Beispiel zeigt, wie Sie ein Word-Dokument mit der Signaturanbieter-ID signieren. Der Kryptografiedienstanbieter (CSP) ist ein unabhängiges Softwaremodul, das tatsächlich Kryptografiealgorithmen zur Authentifizierung, Kodierung und Verschlüsselung ausführt. MS Office reserviert den Wert {00000000-0000-0000-0000-000000000000} für seinen Standardsignaturanbieter.

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

Erstellen Sie ein neues Signaturzeilen-Signatur-Word-Dokument mit der Anbieter-ID

Das folgende Beispiel zeigt, wie Sie eine Signaturzeile erstellen und ein Word-Dokument mithilfe der Signaturanbieter-ID signieren.

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

Rufen Sie den Wert der digitalen Signatur ab

Aspose.Words bietet außerdem die Möglichkeit, mithilfe der SignatureValue-Eigenschaft den Wert der digitalen Signatur aus einem digital signierten Dokument als Byte-Array abzurufen.

Das folgende Codebeispiel zeigt, wie der Wert der digitalen Signatur als Byte-Array aus einem Dokument abgerufen wird:

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