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에서 처음 공개된 다음과 같은 개념을 도입했습니다.

  • 장기적 검증(LTV): 무결성, 진위, 부인 방지, 서명 시기를 장기적으로 검증할 수 있다는 보증이 필요합니다.

이 다섯 가지 개념을 모두 충족할 때 워크플로를 처음부터 끝까지 거치는 동안 문서가 안전하고 올바르게 유지되었다는 확신을 가질 수 있습니다. 

디지털 서명: PDF는 매우 오래전부터 내장된 전자 서명과 명시적으로 호환되었습니다. 디지털 서명은 조작 방지, 인증, 철회 등의 다양한 중요 기능을 제공할 수 있습니다. 

빠른 승인 프로세스 및 보안: 거의 모든 국가가 특정 조건에서 디지털 증거에 종이 문서와 동등한 가치를 부여하는 법적 프레임워크로 옮겨가고 있습니다. 모든 정부가 같은 속도로 움직이는 것은 아니지만, 많은 법적 시스템에서 PDF 형식을 권장합니다.

아키텍처

디지털 서명의 아키텍처는 무엇인가요?

iText는 PAdES를 지원하고 최초로 최신 PDF 2.0 릴리스에서 서명을 지원하는 등과 같이 언제나 디지털 서명을 앞장서서 지원했습니다.

iText의 성숙하고 사용이 간편한 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) 프로젝트의 일부입니다.
    Copyright (c) 1998-2019 iText Group NV
    저자: iText Software.
 
    자세한 정보는 다음의 주소로 iText Software에 문의하세요.
    sales@itextpdf.com
 */
/*
 * 이 클래스는 
 * Bruno Lowagie가 작성한 "Digital Signatures for PDF documents"라는 제목의 백서에
 * 포함되어 있습니다.
 *
 * 자세한 정보: 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)
 
                // 필드에 서명하기 전에 표시를
                // 서명된 필드의 배경으로 사용할지 지정합니다. "false"가 기본값입니다.
                .setReuseAppearance(false)
                .setPageRect(rect)
                .setPageNumber(1);
        signer.setFieldName("sig");
 
        IExternalSignature pks = new PrivateKeySignature(pk, digestAlgorithm, provider);
        IExternalDigest digest = new BouncyCastleDigest();
 
        // 분리된 모드, CMS 또는 CAdES 등으로 문서에 서명합니다.
        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) 프로젝트의 일부입니다.
Copyright (c) 1998-2019 iText Group NV
 
*/
/*
* 이 클래스는
* Bruno Lowagie가 작성한 "Digital Signatures for PDF documents"라는 제목의
* 백서에 포함됩니다.
*
* 자세한 정보: 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)
 
                // 필드에 서명하기 전에 표시를
                // 서명된 필드의 배경으로 사용할지 지정합니다. "false"가 기본값입니다.
                .SetReuseAppearance(false)
                .SetPageRect(rect)
                .SetPageNumber(1);
            signer.SetFieldName("sig");
 
            IExternalSignature pks = new PrivateKeySignature(pk, digestAlgorithm);
 
            // 분리된 모드, CMS 또는 CAdES 등을 사용하여 문서에 서명합니다.
            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 코드를 스캔하면 언제든 자격증 또는 기타 승인서를 인증할 수 있습니다. 따라서 누구나 자격증 취득 사실을 검증받을 수 있습니다.
  • CVTrust는 벨기에에서 가장 거래 규모가 큰 고객 중 하나로, GlobalSign API를 사용하여 디지털 서명에 필요한 인증서를 생성해야 했습니다. 이를 위해서는 iText 7을 Smart Certificate 백엔드에 통합해야 했습니다. iText 7과 GlobalSign API를 사용하는 새로운 솔루션은 Smart Certificate 플랫폼의 기능을 확장하면서도 기존 인프라에 손쉽게 통합할 수 있어야 했습니다.
  • iText 7을 사용하면 필요한 PDF 문서를 대량으로 생성할 수 있고, PDF 내에서 디지털 서명을 추가하고 표시하는 작업도 처리됩니다. Smart Certificate 플랫폼은 스마트 인증서를 수신하면 기존의 PDF 템플릿에 기반하여 고유한 PDF를 생성합니다. 그런 다음, GlobalSign API를 사용하여 인증된 디지털 서명을 문서에 추가합니다.

  • 그와 동시에 PDF의 고유한 해시도 생성되어 Woleet 서버로 전송되고, 해시는 블록체인에 안전하게 저장됩니다. CVTrust는 블록체인 기술을 사용하여 문서 보안을 향상하였고, 해시가 변경되면 모든 블록체인 노드에 변경 사항이 복제되어야 하므로 사실상 위조가 불가능합니다. CVTrust는 블록체인 기술을 사용하여 문서 보안을 향상하였고, 해시가 변경되면 모든 블록체인 노드에 변경 사항이 복제되어야 하므로 사실상 위조가 불가능합니다.

즉, 다음과 같은 문서가 생성됩니다. 

  • 한 번의 클릭으로 액세스(블록체인 해시/인증 포함)
  • 한 번의 클릭으로 다운로드
  • 한 번의 클릭으로 공유 가능(예: LinkedIn)
  • 한 번의 클릭으로 확인(링크/QR 코드)하여 각 문서의 무결성, 진위, 유효성 보증
이미지
A key benefit of Smart Certificates are the secure validation options

사용 사례: eaZySign 릴리스로 소비자와 기업의 서명 작업 단순화

  • 사용자 식별 솔루션과 벨기에 eID를 제공하는 Zetes는 기업과 소비자가 손으로 쓴 서명을 전자 서명으로 간단히 대체할 수 있는 클라우드 기반 디지털 서명 플랫폼을 출시했습니다. 이 클라우드 기반 플랫폼은 웹, 컴퓨터, 모바일 등 모든 기기에서 액세스할 수 있으며, 기업에서는 빠른 수익 창출, 비용 절감, 고객 경험 개선 효과를 누릴 수 있습니다.
  • Zetes는 세계에서 가장 널리 사용되는 PDF 개발 라이브러리 업체인 iText와 주요 ID 및 보안 서비스 업체인 GlobalSign과 협력하여 eaZySign 솔루션을 개발했습니다. 이 새로운 eaZySign 플랫폼은 디지털 서명 도입에서 발생하는 가장 일반적인 문제 두 가지를 해결합니다. 쉽게 관리하고 디지털 서명을 적용할 수 있으면서도 서명이 적절한 수준의 신뢰도와 적법성을 유지할 수 있기 때문입니다.
  • EaZySign은 맞춤 설정을 통해 다양한 애플리케이션 요구 사항을 지원합니다. 플랫폼과 운영 체제와 무관하게 웹 포털, 데스크톱, 가장 널리 사용하는 모바일 플랫폼(iOS, Android)에서 서명 프로세스를 실행할 수 있어, 최종 사용자가 쉽게 액세스할 수 있습니다.
  • 서명은 벨기에 전자 신분증(e-ID) 또는 GlobalSign PKI 기반 자격 증명을 사용하며, ETSI(European Telecommunications Standards Institute)에서 규정한 PDF Advanced Electronic Signatures( PAdES) 표준을 준수합니다.

대규모 소비자 도입: iText는 암호화에 대한 심층적 지식을 바탕으로 편리하면서 보안이 적용된 eaZySign 플랫폼을 구현하여 대량 사용이 가능하게 했습니다.  


회사 프로세스와 관련된 PDF 디지털 서명 워크플로:  iText는 eaZySign 솔루션에 내장되는 디지털 서명 워크플로 개발에 사용되었습니다. 사용자가 플랫폼에 문서를 업로드하는 것만으로 최종 사용자는 문서에 서명할 수 있게 됩니다.


디지털 서명 인증서와 PAdES 준수: GlobalSign은 신뢰할 수 있는 타임스탬프 기관(TSA)이며, eaZySign에서 생성된 디지털 서명에 필요한 타임 스탬핑 서비스를 모든 PAdES 준수 수준에 맞추어 제공합니다. 또한, 문서가 생성된 시점과 부인 방지 지원 여부를 확인하기 위한 타사 타임스탬프도 포함됩니다.

문의

문의가 해결되지 않았습니까? 

저희가 도와드리겠습니다. 연락해 주시면 빠르게 답변해 드리겠습니다.

문의하기
최신 정보를 받아보세요

11,000명 이상의 가입자와 함께 새로운 제품, 업데이트, 팁, 기술 솔루션 및 기회에 대한 최신 정보를 받아보시면서 iText PDF 전문가가 되어보세요.

지금 구독하기