iText и цифровые подписи

Clone of Clone of Электронные подписи для PDF-документов

Заверяйте PDF-документы цифровыми подписями для обеспечения их неотрекаемости, целостности и подлинности.

Описание

Цифровые подписи

Цифровые подписи — решение, позволяющее заменить физические подписи при использовании цифровых документов. Эта концепция широко применяется и хорошо интегрируется в спецификации PDF-файлов. Ее принцип схож с наложением на документ печати государственного нотариуса, удостоверяющей законность подписей и отсутствие изменений в документе.

По сути электронная подпись фиксирует намерение лица заключить договор, а цифровая подпись используется для шифрования информации и подтверждения действительности подписанного документа.

Основные преимущества использования цифровых подписей включают автоматизацию и обеспечение безопасности цифрового документооборота, что позволяет сберечь время, средства и нервы.

Каковы преимущества использования iText и цифровых подписей?

Представьте себе документ, имеющий юридическую ценность. Такой документ может содержать важную информацию о правах и обязанностях, и в этом случае вам необходимо гарантировать его подлинность. Вы не хотите, чтобы люди отказались от обязательств, принятых на себя в письменном виде.

Кроме того, этот документ, вероятно, будет отправлен различным сторонам, которые будут его просматривать и хранить. Документ может быть изменен на разных этапах рабочего процесса, в разные моменты времени, будь то намеренно (например, с целью поставить дополнительную подпись), непреднамеренно (например, из-за ошибки при передаче) или умышленно, если кто-то хочет подделать оригинальный документ. 

На протяжении веков люди пытались решить эту проблему, заверяя документы так называемыми «собственноручными подписями».

В наши дни мы можем использовать цифровые подписи, чтобы обеспечить:

  • целостность документа — нам необходима уверенность в том, что документ не было изменен на каком-либо этапе рабочего процесса; 
  • подлинность документа — нам необходима уверенность в том, что автором документа является именно указанное лицо (а не кто-то иной);
  • неотрекаемость — нам необходима уверенность в том, что автор не сможет отказаться от своего авторства;
  • время подписи — нам необходима уверенность в дате и времени подписания документа.

В стандарте ISO-32000-2 также вводится понятие, впервые упомянутое в публикации PAdES-4:

  • долгосрочное подтверждение (long-term validation, LTV): нам необходима уверенность в том, что целостность, подлинность, неотрекаемость и время подписания можно будет по-прежнему подтвердить в долгосрочной перспективе.

Сочетание этих пяти факторов позволяет обрести уверенность в защищенности и правильности ваших документов на всем протяжении рабочего процесса. 

ПОДДЕРЖКА ЦИФРОВЫХ ПОДПИСЕЙ. PDF-документы уже очень давно совместимы со встроенными электронными подписями. Цифровые подписи могут предоставлять целый ряд ценных возможностей, от защиты от несанкционированного вмешательства до проверки подлинности и отзыва. 

УСКОРЕНИЕ ПРОЦЕССОВ УТВЕРЖДЕНИЯ И НАДЕЖНОСТЬ. Почти все страны переходят на правовые системы, которые при определенных условиях признают равноценность цифровых и бумажных доказательств. Несмотря на то что в разных государствах этот процесс проходит с разной скоростью, использование формата PDF рекомендуется многими правовыми системами.

Цифровые подписи в PDF-документах

В чем суть цифровых подписей?

Обычно цифровые подписи используются в PDF-документах физическими лицами и организациями с целью показать, кто проверил документ в конкретный момент времени, и что документ не обновлялся с момента его подписания.

Один и тот же PDF-документ может быть заверен одной или несколькими подписями в зависимости от спецификаций и процесса подписания договора. Фактическая цифровая подпись представляет собой часть невидимых, хешированных и зашифрованных метаданных, встроенных в файл вместе с сертификатом.

Помимо самой цифровой подписи, 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. 

Пример использования: упрощение применения цифровых подписей для потребителей и предприятий благодаря выпуску решения eaZySign

  • Компания Zetes, которая предоставляет решения для идентификации пользователей и электронные удостоверения личности в Бельгии, запустила облачную платформу цифровых подписей, упрощающую процесс замены собственноручных подписей их электронными версиями для предприятий и потребителей. Эта облачная платформа обеспечивает доступность с любого типа устройств — через Интернет, с компьютера или мобильного телефона — и предоставляет предприятиям возможность сократить время окупаемости, увеличить экономию и улучшить качество обслуживания клиентов.
  • В партнерстве с компанией iText, предоставляющей самую популярную в мире библиотеку для разработки PDF-решений, и компанией GlobalSign, ведущим поставщиком услуг идентификации и обеспечения безопасности, компания Zetes разработала решение eaZySign. Новая платформа eaZySign решает две наиболее распространенные проблемы, возникающие при переходе на цифровые подписи, упрощая управление цифровыми подписями и их наложение и обеспечивая при этом надлежащий уровень надежности и правомерности таких подписей.
  • Решение EaZySign можно настроить под нужды широкого спектра областей применения. Оно не зависит от платформы и операционной системы, позволяя выполнять процесс подписания на веб-порталах, настольных ПК и наиболее популярных мобильных платформах (iOS, Android), что упрощает доступ для конечных пользователей.
  • Подписи основаны на бельгийских электронных удостоверениях личности (e-ID) или учетных данных на основе инфраструктуры открытых ключей GlobalSign и соответствуют стандартам в отношении современных электронных подписей PDF-документов (PDF Advanced Electronic Signatures, PAdES), установленных Европейским институтом по стандартизации в области телекоммуникаций (European Telecommunications Standards Institute, ETSI).

Understanding PDF/A: Parts and conformance levels

PDF/A-1

The strictest of the four parts. It forbids Transparent elements, Layers and JPEG2000 and LZW compression.

PDF/A-2

Gets rid of the restricted features mentioned in PDF/A-1 and introduces the embedding of other PDF/A files, making it an effective container for multiple PDF documents.

PDF/A-3

The biggest change here is that one can now embed any type of file in a PDF/A-3 document. This proves especially handy to add a machine readable (XML) copy or to include the original data the document was based on in a form of hybrid archiving.

PDF/A-4

Published in 2020, Part 4 is not widely used yet. Its biggest change is that it allows some of the new features of PDF 2.0 such as page level output intents (output intent tells the processor how to interpret the colors used in the document).

Conformance levels

Level b (“basic”): ensures that the visual appearance of a document will be preserved for the long term.

Level a (“accessible”): ensures that the visual appearance of a document will be preserved for the long term, but also introduces structural and semantic properties. The PDF needs to be a Tagged PDF.

Level u (“Unicode”): ensures that the visual appearance of a document will be preserved for the long term, and that all text is stored in Unicode. This facilitates the searchability of text. This is also the preferred output format for OCR-generated PDFs.

The f and e conformance levels are much more functional profiles that extend the specification than conformance levels. PDF/A-4f allows embedding any other file, making it a successor to PDF/A-3. PDF/A-4e supports Rich Media and 3D annotations.

Image
pdfa table

Making PDF/A compliant documents with iText 7

iText 7’s open-source Core library gives us all the tools we need to make a PDF/A compliant document. See the following links to jump right into our tutorial:

Java tutorial .NET(C#) tutorial

Добавление примера цифровой подписи

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
/*
    Этот файл входит в проект iText (R).
    (c) iText Group NV, 1998–2019 
    Авторы: отдел разработки ПО компании iText.
 
    Для получения дополнительной информации обращайтесь в отдел разработки ПО компании iText по адресу:
    sales@itextpdf.com
 */
/*
 * Этот класс входит в информационную брошюру под названием
 * «Цифровые подписи для PDF-документов»,
 * автор — Бруно Ловаджи (Bruno Lowagie)
 *
 * Для получения дополнительной информации посетите сайт: 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
/*
 
Этот файл входит в проект iText (R).
(c)iText Group NV, 1998–2019
 
*/
/*
* Этот класс входит в информационную брошюру под названием
 * «Цифровые подписи для PDF-документов»,
 * автор — Бруно Ловаджи (Bruno Lowagie)
 *
 * Для получения дополнительной информации посетите сайт: 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");
        }
    }
}
Контактная информация

Остались вопросы? 

Мы готовы вам помочь. Обратитесь к нам, и мы ответим, как только сможем.

Связаться с нами
Оставаться в курсе

Присоединяйтесь к более чем 11 000 подписчиков и станьте экспертом iText PDF, следя за нашими новыми продуктами, обновлениями, советами, техническими решениями и событиями.

Подпишись сейчас