デジタル署名の操作

デジタル署名は、文書の送信者が本人であること、および文書の内容が改ざんされていないことを証明するために文書を認証するために使用されます。

Aspose.Words はデジタル署名付きのドキュメントをサポートし、デジタル署名へのアクセスを提供します。これにより、ドキュメント上のデジタル署名を検出して検証し、生成された PDF ドキュメントに提供された証明書を使用して署名できるようになります。現時点では、デジタル署名は DOC、OOXML、および ODT ドキュメントでサポートされています。生成されたドキュメントの署名は PDF 形式でサポートされています。

デジタル署名は開いて保存するときに保持されません

注意すべき重要な点は、Aspose.Words を使用してドキュメントを読み込んで保存すると、ドキュメントに署名されたデジタル署名が失われるということです。これは設計によるもので、デジタル署名によってコンテンツが変更されていないことが保証され、さらに文書に署名した人の身元が認証されます。元の署名が結果の文書に引き継がれた場合、これらの原則は無効になります。

このため、サーバーにアップロードされたドキュメントを処理する場合、この方法でサーバーにアップロードされたドキュメントが知らないうちに破損する可能性があります。したがって、ドキュメント上のデジタル署名を確認し、見つかった場合は適切な措置を講じることが最善です。たとえば、クライアントに、渡されたドキュメントにデジタル署名が含まれている場合は失われることを通知するアラートをクライアントに送信できます。加工された。この例のテンプレート ファイルは ここ からダウンロードできます。

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

上記のコードは、FileFormatUtil.detect_file_format メソッドを使用して、最初にドキュメントをロードせずに、ドキュメントにデジタル署名が含まれているかどうかを検出します。これにより、文書を処理する前に文書の署名をチェックする効率的かつ安全な方法が提供されます。メソッドが実行されると、プロパティ FileFormatInfo.has_digital_signature を提供する FileFormatInfo オブジェクトが返されます。ドキュメントに 1 つ以上のデジタル署名が含まれている場合、このプロパティは true を返します。このメソッドは署名を検証するのではなく、署名が存在するかどうかを判断するだけであることに注意することが重要です。デジタル署名の検証については、次のセクションで説明します。

マクロのデジタル署名 (VBA プロジェクト)

マクロのデジタル署名にアクセスしたり、署名したりすることはできません。これは、Aspose.Words がドキュメント内のマクロを直接処理しないためです。ただし、マクロのデジタル署名は、ドキュメントを Word 形式にエクスポートして戻すときに保持されます。ドキュメント自体が変更されてもマクロのバイナリ コンテンツは変更されないため、これらの署名は VBA コード上に保持できます。

デジタル署名にアクセスして検証する

ドキュメントには複数のデジタル署名を含めることができます。これらの署名はすべて、Document.digital_signatures コレクションを通じてアクセスできます。返される各オブジェクトは、ドキュメントに属する単一のデジタル署名を表す DigitalSignature です。これにより、署名の有効性を確認できるメンバーが提供されます。

デジタル署名で確認する最も重要な特性は、ドキュメント内の各署名の有効性です。 DigitalSignatureCollection.is_valid プロパティを呼び出すことで、ドキュメント内のすべての署名を一度に検証できます。ドキュメント内のすべての署名が有効である場合、またはドキュメントに署名がない場合は true が返され、少なくとも 1 つのデジタル署名が無効である場合は false が返されます。

各署名は、DigitalSignature.is_valid を呼び出して個別に検証することもできます。署名は、署名後に文書が変更されているか、証明書の有効期限が切れているなど、さまざまな理由で無効になる可能性があります。さらに、署名の追加の詳細にもアクセスできます。以下のコード サンプルは、ドキュメント内の各署名を検証し、署名に関する基本情報を表示する方法を示しています。この例のテンプレート ファイルは ここ からダウンロードできます。

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

Word 文書に署名する

DigitalSignatureUtil クラスは、ドキュメントに署名するためのメソッドを提供します。 DigitalSignatureUtil.sign メソッドは、デジタル署名付きの指定された CertificateHolder を使用してソース ドキュメントに署名し、署名されたドキュメントを宛先ストリームに書き込みます。

以下の例は、簡単な文書に署名する方法を示しています。

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

以下の例は、暗号化されたドキュメントに署名する方法を示しています。

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

署名欄を使用して Word 文書に署名する

指定された CertificateHolder および SignOptions を使用してデジタル署名を使用してソース文書に署名し、署名された文書を宛先ファイルに書き込むことができます。 SignOptions クラスを使用すると、ドキュメント署名のオプションを指定できます。以下の例は、新しい署名欄を作成して文書に署名する方法を示しています。

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

以下の例は、既存の署名欄を変更して文書に署名する方法を示しています。

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

署名プロバイダー識別子を使用した Word 文書への署名

以下の例は、署名プロバイダー識別子を使用して Word 文書に署名する方法を示しています。暗号化サービス プロバイダー (CSP) は、認証、エンコード、および暗号化のための暗号化アルゴリズムを実際に実行する独立したソフトウェア モジュールです。 MS Office は、デフォルトの署名プロバイダーとして値 {00000000-0000-0000-0000-000000000000} を予約しています。

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

プロバイダー識別子を使用して Word 文書に署名する新しい署名欄を作成する

以下の例は、署名欄を作成し、署名プロバイダー識別子を使用して Word 文書に署名する方法を示しています。

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

デジタル署名値の取得

Aspose.Words は、SignatureValue プロパティを使用して、デジタル署名されたドキュメントからデジタル署名値をバイト配列として取得する機能も提供します。

次のコード例は、ドキュメントからデジタル署名値をバイト配列として取得する方法を示しています。

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