デジタル署名の使用

デジタル署名は、文書に署名し、署名者を認証して、文書が署名されてから変更されていないことを保証するための電子署名の技術的実装です。 PKI プロトコルに従って公開鍵と秘密鍵の両方を生成するため、各デジタル署名は署名者ごとに一意になります。ドキュメントにデジタル署名するということは、生成されたハッシュを暗号化するために数学的アルゴリズムが使用される、署名者の秘密キーを使用して署名を作成することを意味します。

Aspose.Words を使用すると、既存のデジタル署名を検出、カウント、検証したり、文書に新しい署名を追加して文書内の改ざんを検出したりできます。ドキュメントからすべてのデジタル署名を削除することもできます。デジタル署名を操作するには、DigitalSignatureUtil クラスを使用します。

この記事では、デジタル ドキュメントの信頼性と完全性を検証するために上記のすべてを行う方法について説明します。

サポートされている形式

Aspose.Words を使用すると、DOC、OOXML、および ODT ドキュメントのデジタル署名を操作し、生成されたドキュメントに PDF または XPS 形式で署名できます。

デジタル署名の制限

以下の表では、Aspose.Words を介してデジタル署名を使用するときに直面する可能性のあるいくつかの制限と、いくつかの代替オプションについて説明します。

制限 代替オプション
ドキュメントをロードして保存した後に、ドキュメント上のデジタル署名が失われる。したがって、ドキュメントをサーバーに送信すると、予告なしにすべてのデジタル署名が失われる可能性があります。 ドキュメントにデジタル署名があるかどうかを確認し、見つかった場合は適切なアクションを実行します。たとえば、アップロードしているドキュメントには、処理すると失われるデジタル署名が含まれていることをクライアントに通知するアラートを送信します。
Aspose.Words は、ドキュメント内のマクロの操作をサポートします。ただし、Aspose.Words はマクロのデジタル署名をまだサポートしていません。 ドキュメントを任意の Word 形式にエクスポートし、Microsoft Word を使用してマクロにデジタル署名を追加します。

デジタル署名の検出、カウント、検証

Aspose.Words では、DetectFileFormat メソッドと HasDigitalSignature プロパティを使用してドキュメント内のデジタル署名を検出できます。このようなチェックでは署名の事実のみが検出され、その有効性は検出されないことに注意してください。

ドキュメントには複数回署名することができ、異なるユーザーが署名を行うことができます。デジタル署名の有効性を確認するには、LoadSignatures メソッドを使用してドキュメントからデジタル署名を読み込み、IsValid プロパティを使用する必要があります。また、Aspose.Words では、Count プロパティを使用して、ドキュメント内のすべてのデジタル署名のセットをカウントできます。

これらすべてにより、文書を処理する前に文書の署名をチェックする効率的かつ安全な方法が提供されます。

次のコード例は、デジタル署名の存在を検出して検証する方法を示しています。

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git.
FileFormatInfo info = FileFormatUtil.DetectFileFormat(MyDir + "Digitally signed.docx");
if (info.HasDigitalSignature)
{
Console.WriteLine(
$"Document {Path.GetFileName(MyDir + "Digitally signed.docx")} has digital signatures, " +
"they will be lost if you open/save this document with Aspose.Words.");
}

デジタル署名の作成

デジタル署名を作成するには、身元を確認する署名証明書をロードする必要があります。デジタル署名された文書を送信するときは、証明書と公開キーも送信します。

Aspose.Words を使用すると、X.509 証明書を作成できます。X.509 証明書は、国際的に受け入れられている X.509 PKI 標準を使用して、公開キーが証明書内に含まれる署名者のものであることを検証するデジタル証明書です。これを行うには、CertificateHolder クラス内で Create メソッドを使用します。

次のセクションでは、デジタル署名、署名行を追加する方法、生成された PDF ドキュメントに署名する方法について説明します。

文書に署名する

Aspose.Words を使用すると、Sign メソッドと SignOptions プロパティを使用して、DOC、DOCX、XPS、または ODT ドキュメントにデジタル署名できます。

次のコード例は、証明書所有者と署名オプションを使用してドキュメントに署名する方法を示しています。

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git.
CertificateHolder certHolder = CertificateHolder.Create(MyDir + "morzal.pfx", "aw");
DigitalSignatureUtil.Sign(MyDir + "Digitally signed.docx", ArtifactsDir + "Document.Signed.docx",
certHolder);

署名欄を追加する

署名欄は、文書内のデジタル署名を視覚的に表現したものです。 Aspose.Words では、DocumentBuilder.InsertSignatureLine メソッドを使用して署名行を挿入できます。 SignatureLineOptions クラスを使用して、この表現のパラメータを設定することもできます。

たとえば、以下の図は、有効な署名と無効な署名がどのように表示されるかを示しています。

描画 描画

また、文書に署名欄がありデジタル署名がない場合、ユーザーに署名の追加を求める機能もあります。

次のコード例は、個人証明書と特定の署名行を使用してドキュメントに署名する方法を示しています。

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
SignatureLineOptions signatureLineOptions = new SignatureLineOptions
{
Signer = "yourname",
SignerTitle = "Worker",
Email = "yourname@aspose.com",
ShowDate = true,
DefaultInstructions = false,
Instructions = "Please sign here.",
AllowComments = true
};
SignatureLine signatureLine = builder.InsertSignatureLine(signatureLineOptions).SignatureLine;
signatureLine.ProviderId = Guid.Parse("CF5A7BB4-8F3C-4756-9DF6-BEF7F13259A2");
doc.Save(ArtifactsDir + "SignDocuments.SignatureLineProviderId.docx");
SignOptions signOptions = new SignOptions
{
SignatureLineId = signatureLine.Id,
ProviderId = signatureLine.ProviderId,
Comments = "Document was signed by Aspose",
SignTime = DateTime.Now
};
CertificateHolder certHolder = CertificateHolder.Create(MyDir + "morzal.pfx", "aw");
DigitalSignatureUtil.Sign(ArtifactsDir + "SignDocuments.SignatureLineProviderId.docx",
ArtifactsDir + "SignDocuments.CreateNewSignatureLineAndSetProviderId.docx", certHolder, signOptions);

生成された PDF ドキュメントに署名する

Aspose.Words を使用すると、PdfDigitalSignatureDetails プロパティを使用して PDF ドキュメントに署名し、その詳細をすべて取得できます。

次のコード例は、生成された PDF に署名する方法を示しています。

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.Writeln("Test Signed PDF.");
PdfSaveOptions saveOptions = new PdfSaveOptions
{
DigitalSignatureDetails = new PdfDigitalSignatureDetails(
CertificateHolder.Create(MyDir + "morzal.pfx", "aw"), "reason", "location",
DateTime.Now)
};
doc.Save(ArtifactsDir + "WorkingWithPdfSaveOptions.DigitallySignedPdfUsingCertificateHolder.pdf", saveOptions);

デジタル署名値の取得

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

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

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git.
Document doc = new Document(MyDir + "Digitally signed.docx");
foreach (DigitalSignature digitalSignature in doc.DigitalSignatures)
{
string signatureValue = Convert.ToBase64String(digitalSignature.SignatureValue);
Assert.AreEqual("K1cVLLg2kbJRAzT5WK+m++G8eEO+l7S+5ENdjMxxTXkFzGUfvwxREuJdSFj9AbD" +
"MhnGvDURv9KEhC25DDF1al8NRVR71TF3CjHVZXpYu7edQS5/yLw/k5CiFZzCp1+MmhOdYPcVO+Fm" +
"+9fKr2iNLeyYB+fgEeZHfTqTFM2WwAqo=", signatureValue);
}

デジタル署名を削除する

Aspose.Words を使用すると、RemoveAllSignatures メソッドを使用して署名済みドキュメントからすべてのデジタル署名を削除できます。

次のコード例は、ドキュメントからデジタル署名をロードおよび削除する方法を示しています。

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git.
// There are two ways of using the DigitalSignatureUtil class to remove digital signatures
// from a signed document by saving an unsigned copy of it somewhere else in the local file system.
// 1 - Determine the locations of both the signed document and the unsigned copy by filename strings:
DigitalSignatureUtil.RemoveAllSignatures(MyDir + "Digitally signed.docx",
ArtifactsDir + "DigitalSignatureUtil.LoadAndRemove.FromString.docx");
// 2 - Determine the locations of both the signed document and the unsigned copy by file streams:
using (Stream streamIn = new FileStream(MyDir + "Digitally signed.docx", FileMode.Open))
{
using (Stream streamOut = new FileStream(ArtifactsDir + "DigitalSignatureUtil.LoadAndRemove.FromStream.docx", FileMode.Create))
{
DigitalSignatureUtil.RemoveAllSignatures(streamIn, streamOut);
}
}
// Verify that both our output documents have no digital signatures.
Assert.That(DigitalSignatureUtil.LoadSignatures(ArtifactsDir + "DigitalSignatureUtil.LoadAndRemove.FromString.docx"), Is.Empty);
Assert.That(DigitalSignatureUtil.LoadSignatures(ArtifactsDir + "DigitalSignatureUtil.LoadAndRemove.FromStream.docx"), Is.Empty);