iTextとデジタル署名

PDFドキュメントのための電子署名

否認防止、完全性、信頼性保護のためにPDFドキュメントにデジタル署名します。

はじめに

デジタル署名

デジタル署名は、デジタルドキュメントを使用する際に手書き署名の代わりとなりました。このコンセプトは広く受け入れられており、PDFの要件に統合されています。これは、その署名が正当であり、ドキュメントに変更が加えられていないということを確認する、ドキュメントに公証人のスタンプを付けるのと類似しています。

電子署名は基本的に、個人が契約を結ぶという意向を捉えており、デジタル署名は情報を暗号化して、署名されたドキュメントの有効性を確認するために使われます。

デジタル署名を使用する主な利点は 自動化とデジタルドキュメントワークフローを安全にし、時間や労力を節約する点にあります。

PDFでのデジタル署名

デジタル署名のコンセプトは何でしょうか?

通常、デジタル署名は個人または組織がPDFドキュメントにおいて、誰が、特定の日にちまたは日程に、該当のドキメントが署名されてからアップデートされていないことを証明するために使用されます。

契約の署名についての仕様とプロセスによっては、1つのPDFドキュメントに1つ以上の署名が含まれるケースもあります。実際の署名は見えない状態で、ハッシュされ、暗号化されためたデータにファイルの証明とともに組み込まれています。

実際のデジタル署名に加えて、PDFファイルは署名のオプションの可視表現が含まれるケースもあります。署名の写真とサインされる証明の要約は、署名の可視比率を含むケースもあります。

Digital signatures icon
Hashing

Using a Cryptographic hash function to turn an arbitrary block of data into a fixed-size block of data.  

Digital signatures icon
Encryption

  • Central Idea
    • Transform message before sending
    • Transformed message is not readable
    • Receiver transforms message back to readable format
  • Transforms are done using mathematical functions
  • Symmetric Encryption
    • Depends on shared key
  • Asymmetric Encryption
    • Participants have a Private and a Public Key
    • Only Public Key is shared

Digital signatures icon
Certificate Authorities

  • A certificate authority (CA) is an entity maintaining and issuing security certificates and public keys that are used in a public network for protected communication. Together with the registration authority (RA), the CA is part of the public key infrastructure (PKI), which verifies the information provided by an electronic certificate requester. If the information is correct, the certificate is verified.

  • Before you use the public key of someone to verify a signature, you need proof that it truly belongs to them. The role of the CA is to issue digital certificates to individuals within a PKI program that shows that a particular public key belongs to a specific individual–so you can claim that digital certificates bind the identity of the individual to their public key. This bond is secured by the CA using the CA's own private key with a digital signature.

  • There are many CAs worldwide, and they can be either enterprise-based, industry-based, national (e.g. linked to e-ID card schemes), or publicly available online. In the case of PDF documents, a list of default CAs is distributed with PDF applications which support digital signatures. 

なぜiTextとデジタル署名を使うのでしょうか?

法的に価値のあるドキュメントを想像してみてください。そのようなドキュメントは権威を確約しなければならない場合に、権利や義務に関する重要な情報を含んでいる可能性があります。その時、誰かによって書いてあるコミットメントを否定されたくないはずです。

その上、このドキュメントはおそらく違う関係者へ送信され、閲覧及び保管されます。ワークフローの色々な場所やタイミングで、ドキュメントを変更することが可能です。自発的な場合 (たとえば、追加の署名を追加するため)や、非自発的 (たとえば、送信エラーが原因)な場合、もしくは故意に、元のドキュメントから偽造したい場合が考えられます。 

100年以上、当社はこの問題を解決するために、手書きサインを行なってきました。

現在では、デジタル署名を使用することによって、下記のことが可能になりました。

  • ドキュメントの完全性—ドキュメントがワークフローのどこかで変更されていないということを保証しなければなりません。 
  • ドキュメントの権威—ドキュメントの作者が、想定の人物であるということを保証する必要があります。
  • 否認防止— 作成者自身であるということを否定不可能であるということを保証します。
  • 署名のタイミング – ドキュメントがサインされた日付と時間を保証します。

ISO-32000-2 はPAdES-4ではじめに発行された、コンセプトを紹介します。

  • 長期間の有効性(LTV): 完全性、信頼性、否認防止、そして署名の時間を長期的に検証できるということを保証しなければなりません。

これらの5つのコンセプトを組み合わせることによって、ワークフロー全体を通じてドキュメントが安全かつ正しいということを確信できます。 

デジタル署名: PDFは長い間、埋め込まれた電子署名と明示的な互換性を保持しています。デジタル署名は、改ざんの防止措置から認証と失効まで、様々な価値をもつ機能を提供することが可能です 

より早い承認プロセスとセキュリティ: ほぼすべての国が、特定の条件のもとで紙のドキュメントと同じ価値をもつデジタル証拠に認めるリーガルフレームワークに向かって動いています。あらゆる政府が同じペースで取り組んでいるということないですが、PDF形式は多数の法制度によって奨励されています。

アーキテクチャー

デジタル署名のアーキテクチャは何でしょうか?

iTextはPAdESをサポートして、最新版のPDF 2.0リリースではじめに署名をサポートする流れの1つとして、常にPDFのデジタル署名の最先端で活躍します。

当社の洗練されて使いやさを誇るAPIは、業界によって漏れなくテストされており、いくつかの用途で使われても機能することが証明されています。

Digital signatures icon
Server-side signing

Use Case: 

  • Company signature: Invoice, Contracts
  • Signing services in the Cloud: DocuSign, Adobe Sign
  • Security management responsibilities

Digital signatures icon
Client-side signing

Use Case:

  • Desktop applications: Adobe Acrobat Pro, Adobe Reader (for Reader-enabled documents, Home-made, e.g. using iText)
  • In a web context: The PDF software runs to the client, e.g. using Java Web Start
  • Access to the token or smart card through MSCAPI, PKCS#11, Custom smart card library (1 Signature / Second)
  • Security: User has smart card and PIN, or USB token and passphrase

Digital signatures icon
Deferred signing

Use Case:

  • Signing on an iPad/Tablet: Easy to integrate into a document management system
  • ISAE 3000: The standard for assurance over non-financial information

デジタル署名を付け加える例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
/*
    This file is part of the iText (R) project.
Copyright (c) 1998-2019 iText Group NV
    Authors: iText Software.
 
For more information, please contact iText Software at this address:
    sales@itextpdf.com
*/
/*
 * This class is part of the white paper entitled
 * "Digital Signatures for PDF documents"
 * written by Bruno Lowagie
 *
 * For more info, go to: http://itextpdf.com/learn
*/
package com.itextpdf.samples.signatures.chapter02;
 
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.StampingProperties;
import com.itextpdf.signatures.BouncyCastleDigest;
import com.itextpdf.signatures.DigestAlgorithms;
import com.itextpdf.signatures.IExternalDigest;
import com.itextpdf.signatures.IExternalSignature;
import com.itextpdf.signatures.PdfSignatureAppearance;
import com.itextpdf.signatures.PdfSigner;
import com.itextpdf.signatures.PrivateKeySignature;
 
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.Security;
import java.security.cert.Certificate;
 
import org.bouncycastle.jce.provider.BouncyCastleProvider;
 
public class C2_01_SignHelloWorld {
    public static final String DEST = "./target/signatures/chapter02/";
 
public static final String KEYSTORE = "./src/test/resources/encryption/ks";
public static final String SRC = "./src/test/resources/pdfs/hello.pdf";
 
public static final char[] PASSWORD = "password".toCharArray();
 
    public static final String[] RESULT_FILES = new String[] {
            "hello_signed1.pdf",
            "hello_signed2.pdf",
            "hello_signed3.pdf",
            "hello_signed4.pdf"
    };
 
    public void sign(String src, String dest, Certificate[] chain, PrivateKey pk, String digestAlgorithm,
            String provider, PdfSigner.CryptoStandard signatureType, String reason, String location)
            throws GeneralSecurityException, IOException {
        PdfReader reader = new PdfReader(src);
        PdfSigner signer = new PdfSigner(reader, new FileOutputStream(dest), new StampingProperties());
 
        // Create the signature appearance
        Rectangle rect = new Rectangle(36, 648, 200, 100);
        PdfSignatureAppearance appearance = signer.getSignatureAppearance();
appearance
                .setReason(reason)
.setLocation(location)
 
// Specify if the appearance before field is signed will be used
                // as a background for the signed field.The "false" value is the default value.
.setReuseAppearance(false)
.setPageRect(rect)
.setPageNumber(1);
signer.setFieldName("sig");
 
IExternalSignature pks = new PrivateKeySignature(pk, digestAlgorithm, provider);
        IExternalDigest digest = new BouncyCastleDigest();
 
        // Sign the document using the detached mode, CMS or CAdES equivalent.
signer.signDetached(digest,pks, chain, null, null, null, 0, signatureType);
    }
 
    public static void main(String[] args) throws GeneralSecurityException, IOException {
        File file = new File(DEST);
        file.mkdirs();
 
BouncyCastleProvider provider = new BouncyCastleProvider();
        Security.addProvider(provider);
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(new FileInputStream(KEYSTORE), PASSWORD);
        String alias = ks.aliases().nextElement();
PrivateKey pk = (PrivateKey) ks.getKey(alias, PASSWORD);
        Certificate[] chain = ks.getCertificateChain(alias);
 
C2_01_SignHelloWorld app = new C2_01_SignHelloWorld();
        app.sign(SRC,DEST + RESULT_FILES[0], chain, pk, DigestAlgorithms.SHA256, provider.getName(),
PdfSigner.CryptoStandard.CMS, "Test 1", "Ghent");
        app.sign(SRC,DEST + RESULT_FILES[1], chain, pk, DigestAlgorithms.SHA512, provider.getName(),
PdfSigner.CryptoStandard.CMS, "Test 2", "Ghent");
        app.sign(SRC,DEST + RESULT_FILES[2], chain, pk, DigestAlgorithms.SHA256, provider.getName(),
PdfSigner.CryptoStandard.CADES, "Test 3", "Ghent");
        app.sign(SRC,DEST + RESULT_FILES[3], chain, pk, DigestAlgorithms.RIPEMD160, provider.getName(),
PdfSigner.CryptoStandard.CADES, "Test 4", "Ghent");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/*
 
This file is part of the iText (R) project.
Copyright (c) 1998-2019 iText Group NV
 
*/
/*
* This class is part of the white paper entitled
* "Digital Signatures for PDF documents"
* written by Bruno Lowagie
*
* For more info, go to: http://itextpdf.com/learn
*/
 
using System;
using System.IO;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.X509;
using iText.Kernel.Geom;
using iText.Kernel.Pdf;
using iText.Signatures;
using Org.BouncyCastle.Pkcs;
 
namespace iText.Samples.Signatures.Chapter02
{
    public class C2_01_SignHelloWorld
    {
        public static readonly string DEST = "../../results/signatures/chapter02/";
 
        public static readonly string KEYSTORE = "../../resources/encryption/ks";
        public static readonly string SRC = "../../resources/pdfs/hello.pdf";
 
        public static readonly char[] PASSWORD = "password".ToCharArray();
 
        public static readonly String[] RESULT_FILES =
        {
            "hello_signed1.pdf",
            "hello_signed2.pdf",
            "hello_signed3.pdf",
            "hello_signed4.pdf"
        };
 
        public void Sign(String src, String dest, X509Certificate[] chain, ICipherParameters pk,
            String digestAlgorithm, PdfSigner.CryptoStandard subfilter, String reason, String location)
        {
            PdfReader reader = new PdfReader(src);
            PdfSigner signer = new PdfSigner(reader, new FileStream(dest, FileMode.Create), new StampingProperties());
 
            // Create the signature appearance
            Rectangle rect = new Rectangle(36, 648, 200, 100);
            PdfSignatureAppearance appearance = signer.GetSignatureAppearance();
            appearance
                .SetReason(reason)
                .SetLocation(location)
 
                // Specify if the appearance before field is signed will be used
                // as a background for the signed field.The "false" value is the default value.
.SetReuseAppearance(false)
                .SetPageRect(rect)
                .SetPageNumber(1);
            signer.SetFieldName("sig");
 
            IExternalSignature pks = new PrivateKeySignature(pk, digestAlgorithm);
 
            // Sign the document using the detached mode, CMS or CAdES equivalent.
signer.SignDetached(pks, chain, null, null, null, 0, subfilter);
        }
 
        public static void Main(String[] args)
        {
            DirectoryInfo directory = new DirectoryInfo(DEST);
            directory.Create();
 
            Pkcs12Store pk12 = new Pkcs12Store(new FileStream(KEYSTORE, FileMode.Open, FileAccess.Read), PASSWORD);
            string alias = null;
            foreach (var a in pk12.Aliases)
            {
                alias = ((string) a);
                if (pk12.IsKeyEntry(alias))
                    break;
            }
 
            ICipherParameters pk = pk12.GetKey(alias).Key;
            X509CertificateEntry[] ce = pk12.GetCertificateChain(alias);
            X509Certificate[] chain = new X509Certificate[ce.Length];
            for (int k = 0; k < ce.Length; ++k)
            {
                chain[k] = ce[k].Certificate;
            }
 
            C2_01_SignHelloWorld app = new C2_01_SignHelloWorld();
            app.Sign(SRC, DEST + RESULT_FILES[0], chain, pk, DigestAlgorithms.SHA256,
                PdfSigner.CryptoStandard.CMS, "Test 1", "Ghent");
            app.Sign(SRC, DEST + RESULT_FILES[1], chain, pk, DigestAlgorithms.SHA512,
                PdfSigner.CryptoStandard.CMS, "Test 2", "Ghent");
            app.Sign(SRC, DEST + RESULT_FILES[2], chain, pk, DigestAlgorithms.SHA256,
                PdfSigner.CryptoStandard.CADES, "Test 3", "Ghent");
            app.Sign(SRC, DEST + RESULT_FILES[3], chain, pk, DigestAlgorithms.RIPEMD160,
                PdfSigner.CryptoStandard.CADES, "Test 4", "Ghent");
        }
    }
}

使用例: Smart Certificate 2.0 - 認定・信頼できるデジタルドキュメントを発行し、共有する

CVTrustは自社のSmart Certificateプラットフォームを開発し、機関は認証の済んだ信頼性の高いドキュメントをデジタル発行します。これによって、クリックするだけで共有が可能になります。

  • Smart Certificate 2.0はユーザーエクスペリエンスやUIの向上、追加などのたくさんの改善を提供します。そしてSaaS(Software as a Service)として利用できるようにデザインされており、目的にかかわらず、様々な組織が認定済みの検証可能なドキュメントを発行することができます。GDPRとプライバシー要件に準拠するのと同時に、非常に優れたレベルのデータ暗号化を提供します。
  • Smart Certificate 2.0は、プラットフォームを使って発行されたドキュメントの有効性の保証も行います。資格やその他の認定は、リンクをクリックするか、もしくはQRコードをスキャンするといつでも確認することが可能です。これによって、資格を取得したことを申請する人は、該当の資格を取得したという事実を証明することが可能です。
  • もっとも大切なベルギーのお客様のうちの1人にとって、CVTrustはGlobalSign APIを使ってデジタル署名に必要な証明書を作る必要がありました。これを達成するために、iText 7をSmart Certificateバックエンドに統合する必要がありました。iText 7とGlobalSign APIを使った新しいソリューションは、Smart Certificateプラットフォームの機能拡張を行う際に、既存のインフラストラクチャへの統合も簡単でなければなりませんでした。
  • iText 7は、必要なPDFドキュメントを大量に生成することを可能にし、PDF内のデジタル署名を追加したり、ドキュメントの見た目を整えたりします。Smart Certificateが付与されると、Smart Certificateプラットフォームは既存のPDFテンプレートにをベースにして任意のPDFを生成します。そして、GlobalSign APIを使って証明済のデジタル署名がドキュメントにつきます。

  • 同時に、PDFの固有ハッシュが生成されて、  Woleet サーバーに送信されます。サーバーではブロックチェーンに安全に保存されます。CVTrustはブロックチェーンテクノロジーを使って、ドキュメント自体のセキュリティを強化し、改ざんができないようにします。これは、ハッシュへの変更をブロックチェーンのあらゆるノードに複製する必要があるためです。

これらはすべて、ドキュメントが下記であることを示します:

  • ワンクリックでアクセス可能(ブロックチェーンハッシュ/証明を含む)
  • クリックしてダウンロード可能
  • クリックで共有が可能。 例)LinkedIn
  • クリック(リンク/ QRコード経由)するとチェックが可能で、それぞれのドキュメントの整合性、信頼性、有効性の保証を行う
Image
A key benefit of Smart Certificates are the secure validation options

使用例:eaZySignのリリースにより、デジタル署名が消費者および企業向けに簡素化

  • ユーザー識別ソリューションおよびベルギーのeIDを提供するZetesは、企業と消費者が手書きの署名をデジタル版に換える方法を簡略化する、クラウドベースのデジタル署名プラットフォームを設立しました。クラウドベースのプラットフォームは、様々なデバイスのアクセシビリティ–ウェブ、コンピューター、もしくはモバイル–の提供を行い、企業が収益化できるまでの時間を短縮し、関連コストを大幅に節約し、カスタマーエクスペリエンスの向上に努めます。
  • Zetesは、世界中で一番使われているPDF開発ライブラリのプロバイダーであるiText、そしてIDとセキュリティサービスの大手プロバイダーであるGlobalSignと協力の上、eaZySignソリューションを開発しました。新たなeaZySignプラットフォームは、デジタル署名に関する適切なレベルの信頼性や合法性を保ちつつ、管理と適用を簡単にすることで、デジタル署名を取り入れる際に直面する、最も一般的な2つの課題を解決します。
  • EaZySignは、様々なアプリケーションニーズをサポートするようにカスタマイズすることが可能です。この仕組みはプラットフォームやオペレーティングシステムに依存しないので、エンドユーザーが簡単にアクセスできるように、Webポータル、デスクトップ、そして一番人気のあるモバイルプラットフォーム(iOS、Android)を介して通して署名プロセスを実行することが可能になります。
  • 署名はベルギーの電子IDカード(e-ID)もしくはGlobalSign PKIベースの資格情報に依存しており、ヨーロッパてれコミュニケーション標準機関(ETSI)によって確立されたPDF先進電子署名(PAdES)の標準に準拠しています。

大量の消費者による採用:暗号化についてのiTextの深い知識によって、利便性とセキュリティがeaZySignプラットフォームを力づけて、大量消費についてさらに受け入れやすくなっています。  


企業プロセス周りのPDFデジタル署名ワークフロー:  iTextはeaZySignソリューションに組み込まれたデジタル署名ワークフロー生成に用いられています。ユーザーはドキュメントをプラットフォームにアップロードする作業のみで、エンドユーザーが署名できるようになります。


デジタル署名証明書とPAdESコンプライアンス:GlobalSignは、信頼性のあるタイムスタンプ機関(TSA)であり、eaZySignで作られたデジタル署名が様々なPAdES準拠レベルを満たすために必要なタイムスタンプサービスの提供を行います。また、ドキュメントがいつ作成されたかを証明する第三者のタイムスタンプが含まれ、否認防止をサポートします。

お問い合わせ

それでも問題が解決しませんか? 

お寄せいただいたご質問には、喜んでお答えいたします。当社へご連絡ください。内容を確認次第、追ってご連絡いたします。

問い合わせる
常に最新情報を得る

11,000人以上の購読者に加わって、iTextの新しい製品、アップデート、ヒント、記述的な解決策や出来事に関する最新情報を得ることでiText PDF専門家になりましょう。

今すぐ購読