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

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

Заверяйте 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. 

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

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

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

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

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

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

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

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

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

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

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

Структура

Какова структура цифровых подписей?

Компания iText стабильно лидирует в области цифровых подписей PDF-документов, поскольку поддерживает стандарт PAdES и одной из первых реализовала поддержку подписей в последнем выпуске PDF 2.0.

Наш отработанный и удобный 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
/*
    Этот файл входит в проект 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");
        }
    }
}

Пример использования: Smart Certificate 2.0 — выпуск и предоставление сертифицированных и надежных цифровых документов

Компания CVTrust разработала платформу Smart Certificate, которая позволяет учреждениям выпускать и предоставлять сертифицированные и надежные документы в цифровом виде, проверить которые можно одним щелчком мыши. 

  • В платформе Smart Certificate 2.0 реализовано много улучшений, таких как более удобный пользовательский интерфейс, дополнительные функции и возможность использования по модели SaaS (программное обеспечение как услуга), доступная для организаций, выпускающих сертифицируемые и проверяемые документы любого назначения. Кроме того, она обеспечивает чрезвычайно высокий уровень шифрования данных, а также соблюдение Общего регламента по защите данных (GDPR) и требований защиты конфиденциальности.
  • Smart Certificate 2.0 также гарантирует действительность документов, выпущенных с использованием этой платформы. Квалификацию или другой тип аккредитации можно в любой момент проверить, перейдя по ссылке или отсканировав QR-код. Это гарантирует возможность доказать, что любое лицо, утверждающее наличие у себя определенной квалификации, действительно ее получило.
  • Во время работы на одного из своих крупнейших бельгийских клиентов компании CVTrust понадобилось использовать API GlobalSign для создания сертификатов, необходимых для цифровых подписей. Для этого нужно было интегрировать iText 7 в серверную часть платформы Smart Certificate. Новое решение с использованием iText 7 и API GlobalSign должно было расширять возможности платформы Smart Certificate и при этом обеспечивать простоту интеграции в существующую инфраструктуру.
  • iText 7 предоставляет возможность массового создания PDF-документов, а также управления добавлением и отображением цифровых подписей в PDF-документах. При выдаче смарт-сертификата платформа Smart Certificate создает уникальный PDF-документ на основании готового шаблона PDF. После этого с помощью API GlobalSign к документу добавляется проверенная цифровая подпись.

  • Одновременно создается уникальный хеш PDF-документа и отправляется на серверы Woleet для надежного хранения хешей в блокчейне. Компания CVTrust использует технологию блокчейн, чтобы повысить уровень защищенности документов и практически исключить возможность их подделки, поскольку любые изменения в хеше должны воспроизводиться по всем узлам блокчейна.

Все это обеспечивает для документов: 

  • доступность по одному щелчку мыши (включая хеш блокчейна/проверку);
  • возможность скачивания в одно действие;
  • возможность отправки в одно действие, например на LinkedIn;
  • возможность проверки в одно действие (через ссылку/QR-код) для гарантии целостности, подлинности и действительности каждого документа.
Image
A key benefit of Smart Certificates are the secure validation options

Пример использования: упрощение применения цифровых подписей для потребителей и предприятий благодаря выпуску решения 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).

Пригодность для массового потребителя. Глубокие знания компании iText в области шифрования позволили ей объединить простоту использования и высокий уровень безопасности в платформе eaZySign, что обеспечивает возможность ее массового использования.  


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


Сертификат цифровой подписи и соответствие стандарту PAdES. Компания GlobalSign является уполномоченным по выпуску временных меток (TSA) и предоставляет услуги выпуска временных меток, необходимых для соответствия цифровых подписей, созданных в eaZySign, всем уровням соответствия по стандарту PAdES. Сертификат также включает стороннюю временную метку для подтверждения времени создания документа и поддерживает неотрекаемость.

Контактная информация

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

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

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

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

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