C# 기반의 Excel 파일에서 디지털 서명 할당 및 유효성 검사하기 > 블로그 & Tips

본문 바로가기

.NET Core API

블로그 & Tips

C# 기반의 Excel 파일에서 디지털 서명 할당 및 유효성 검사하기

페이지 정보

작성자 GrapeCity 작성일 20-11-12 13:54 조회 596회 댓글 0건

본문

현재의 디지털 환경에서는 기존의 문서 서명 및 인증이 디지털 서명으로 빠르게 대체되고 있습니다. 디지털 서명은 이메일 메시지, 전자 문서 등의 디지털 정보에 대한 전자식 암호화 인증 스탬프입니다.

간단히 말해, 디지털 서명은 서명자의 ID와 문서의 신뢰성을 확인하는 전자 지문이라고 할 수 있습니다. 디지털 서명 지원은 디지털 문서에서 표준이 되고 있습니다.

GcExcel v3.2 릴리스는 Excel 스프레드시트에 디지털 서명 지원을 도입했습니다.


Excel 스프레드시트에서 디지털 서명 지원

새 GcExcel 릴리스에서는 Excel 파일을 디지털 방식으로 서명하여 콘텐츠의 진위를 보장할 수 있습니다. 라이브러리는 IWorkbook.SignaturesIWorksheet.Shapes 속성을 사용하여 Excel 스프레드시트에서 디지털 서명을 지원합니다.

GcExcel을 사용하면 실제 서명 또는 ‘서명란’의 두 가지 양식으로 Excel에 디지털 서명을 추가할 수 있습니다. 서명은 문서에 포함되는 디지털 인증서(PFX/PKCS12)의 실제 사본입니다. Excel 문서에 서명이 추가된 후에는 해당 서명을 무효로 하기 전에는 문서를 편집할 수 없습니다.

img

서명란은 겉보기에는 인쇄된 문서에 있는 일반적인 서명 자리 표시자와 비슷합니다. 서명란을 Excel 파일에 삽입한 경우, 작성자는 의도된 서명자에 대한 정보(이름, 직함, 이메일 주소 등)와 서명자에게 제시하는 지침을 지정할 수 있습니다.

파일의 전자 사본을 의도한 서명자에게 전송하면 서명자는 서명란 및 서명을 요청하는 알림을 볼 수 있습니다.

img

GcExcel은 디지털 서명을 만들기 위한 여러 가지 옵션을 제공합니다. 보이지 않는 서명을 추가하고, 서명란을 추가/제거/업데이트하고, 서명한 통합 문서를 PDF로 내보내고, 서명을 확인할 수 있습니다.


GcExcel에서 지원되는 디지털 서명 기능

Excel 통합 문서에 디지털 서명을 추가하는 것 외에도 GcExcel은 여러 가지 기능을 추가로 지원합니다.

지원되는 기능은 세 가지 범주로 구분할 수 있습니다.

이 범주의 기능은 Excel 스프레드시트의 서명을 보여 줍니다. 다음 메서드를 사용하여 GcExcel에서 Excel 파일에 서명할 수 있습니다.


표시되지 않는 서명 추가

통합 문서에 서명하려면 먼저 ISignatureSet.AddNonVisibleSignature 메서드를 사용하여 서명을 만들고 SignatureDetails 클래스를 사용하여 서명 세부 정보를 입력합니다. 서명이 정의되면 X509Certificate2 클래스를 통해 인증서를 로드하고, ISignature.Sign 메서드를 사용하여 서명 패킷을 만들고, 마지막으로 IWorkbook.Save 메서드를 호출하여 서명을 커밋합니다.

//create a new workbook
var workbook = new GrapeCity.Documents.Excel.Workbook();
​
ISignature signature = workbook.Signatures.AddNonVisibleSignature();
​
// TODO: Use your information
var details = new SignatureDetails
{
    Address1 = "<your address>",
    Address2 = "<address 2>",
    SignatureComments = "Final",
    City = "<your city>",
    StateOrProvince = "<your state or province>",
    PostalCode = "<your postal code>",
    CountryName = "<your country or region>",
    ClaimedRole = "<your role>",
    CommitmentTypeDescription = "Approved",
    CommitmentTypeQualifier = "Final"
};
​
// TODO: Use your certificate
var cert = new X509Certificate2("<your certificate file>", "<your password>");
​
// TODO: Use your name or signature image
signature.Sign(cert, details);
​
// Commit signature
workbook.Save("SignWorkbook.xlsx");

서명란 서명

Excel 스프레드시트에 서명란이 포함되어 있으면 문서에 서명하고 서명 세부 정보를 제공하기 위한 알림을 표시합니다. GcExcel을 사용하면 이 작업을 코드로 완전히 수행할 수 있습니다. 즉, GcExcel은 서명란이 있는 Excel 파일을 로드하고, 서명 세부 정보 입력을 사용하도록 설정하고, 코드를 사용하여 문서에 서명합니다.

서명란에 서명하려면 위와 같이 Excel 스프레드시트에 서명을 추가하고 ISignature.Sign 메서드를 호출합니다.

ISignature signature = workbook.Signatures.AddSignatureLine(workbook.ActiveSheet, 100.0, 50.0);
​
// TODO: Use your information
ISignatureSetup setup = signature.Setup;
setup.ShowSignDate = true;
setup.AllowComments = true;
setup.SigningInstructions = "<your signing instructions>";
setup.SuggestedSigner = "<signer's name>";
setup.SuggestedSignerEmail = "example@microsoft.com";
setup.SuggestedSignerLine2 = "<signer's title>";
​
// TODO: Use your information
var details = new SignatureDetails
{
    Address1 = "<your address>",
    Address2 = "<address 2>",
    SignatureComments = "Final",
    City = "<your city>",
    StateOrProvince = "<your state or province>",
    PostalCode = "<your postal code>",
    CountryName = "<your country or region>",
    ClaimedRole = "<your role>",
    CommitmentTypeDescription = "Approved",
    CommitmentTypeQualifier = "Final"
};
​
// TODO: Use your certificate
var cert = new X509Certificate2("<your certificate file>", "<your password>");
​
// TODO: Use your name or signature image
signature.Sign(cert, "<your name>", details);
​
// Commit signature
workbook.Save("SignSignatureLine.xlsx");

통합 문서에 연대 서명

연대 서명(이미 서명된 통합 문서에 서명 추가)하려면 먼저 위와 같이 서명란과 서명을 만든 다음 ISignature.Countersign 메서드를 동일한 인증서와 함께 사용하여 연대 서명합니다.

ISignature signature = workbook.Signatures.AddSignatureLine(workbook.ActiveSheet, 100.0, 50.0);
​
ISignatureSetup setup = signature.Setup;
setup.ShowSignDate = true;
setup.AllowComments = true;
setup.SigningInstructions = "<your signing instructions>";
setup.SuggestedSigner = "<signer's name>";
setup.SuggestedSignerEmail = "example@microsoft.com";
setup.SuggestedSignerLine2 = "<signer's title>";
​
var details = new SignatureDetails
{
    Address1 = "<your address>",
    Address2 = "<address 2>",
    SignatureComments = "Final",
    City = "<your city>",
    StateOrProvince = "<your state or province>",
    PostalCode = "<your postal code>",
    CountryName = "<your country or region>",
    ClaimedRole = "<your role>",
    CommitmentTypeDescription = "Approved",
    CommitmentTypeQualifier = "Final"
};
​
// Sign the workbook
var cert = new X509Certificate2("<your certificate file>", "<your password>");
signature.Sign(cert, "<your name>", details);
​
// Reopen the workbook
var ms = new MemoryStream();
workbook.Save(ms);
ms.Position = 0;
workbook.Open(ms);
​
// Modify
workbook.Worksheets["Sheet1"].Range["A1"].Value = "Modified";
​
// Countersign
workbook.Signatures[0].Countersign(cert);
​
// Commit signature
workbook.Save("CountersignSignature.xlsx");


서명 관리

또한 GcExcel을 사용하여 서명을 관리할 수 있습니다(서명 또는 서명란을 통해 Excel 파일에 이미 서명된 경우 서명 수정, 검색 및 확인 가능). 다음은 서명 관리를 위해 GcExcel에서 지원하는 다양한 작업입니다.


서명란 추가
IWorksheet activeSheet = workbook.ActiveSheet;
​
ISignatureSetup setup = workbook.Signatures.AddSignatureLine(activeSheet, 100.0, 50.0).Setup;
setup.ShowSignDate = false;
setup.AllowComments = false;
setup.SigningInstructions = "Please check the content before signing.";
setup.SuggestedSigner = "Shinzo Nagama";
setup.SuggestedSignerEmail = "shinzo.nagama@ea.com";
setup.SuggestedSignerLine2 = "Commander (Balanced)";
​
//save to an excel file
workbook.Save("addsignaturelines.xlsx");

서명란 복사

문서에 추가된 서명란을 다른 범위 또는 워크시트로 복사할 수 있습니다. 이를 위해서는 IRange.Copy, IShape.Duplicate 또는 IWorksheet.Copy 메서드를 사용하여 서명란을 다른 범위 또는 워크시트에 복사하면 됩니다.

// Copy signature line with Range.Copy
IRange srcRange = activeSheet.Range["A1:I15"];
IRange destRange = activeSheet.Range["A16:I30"];
srcRange.Copy(destRange);
​
// Copy signature line with Shape.Duplicate
signature.SignatureLineShape.Duplicate();
​
// Copy signature line with Worksheet.Copy
activeSheet.Copy();
​
//save to an excel file
workbook.Save("copysignaturelines.xlsx");

서명란 잘라내기

서명란을 다른 범위로 잘라내려면 IRange.Cut 메서드를 사용합니다.

// Cut signature line with Range.Cut
IRange srcRange = activeSheet.Range["A1:I15"];
IRange destRange = activeSheet.Range["A16:I30"];
srcRange.Cut(destRange);
​
//save to an excel file
workbook.Save("cutsignaturelines.xlsx");

서명란 삭제

GcExcel에서는 서명란을 삭제하는 것으로 완전히 제거할 수도 있습니다. 서명란을 삭제하려면 ISignature.Delete 또는 IShape.Delete 메서드를 사용합니다.

// Create a new signature line and delete with Signature.Delete
ISignature signatureForTest = newSignatureLine();
signatureForTest.Delete();
​
// Create a new signature line and delete with Shape.Delete
signatureForTest = newSignatureLine();
IShape signatureLineShape = signatureForTest.SignatureLineShape;
signatureLineShape.Delete();
​
//save to an excel file
workbook.Save("deletesignaturelines.xlsx");

서명란 이동

IShape.TopIShape.Left 속성을 사용하여 서명란을 다른 범위 또는 워크시트로 이동합니다.

// Move signature line
signatureShinzo.SignatureLineShape.Top += 100;
signatureShinzo.SignatureLineShape.Left += 50;
​
//save to an excel file
workbook.Save("movesignaturelines.xlsx");


서명 확인

Excel 스프레드시트에서 기존 서명을 확인할 수 있습니다. 이를 위해서는 ISignature.IsSignedISignature.IsValid 속성을 사용합니다.


ISignatureSet signatures = workbook.Signatures;
​
bool signed = false;
bool valid = false;
X509Certificate2 certificate = null;
​
// Verify the first signed signature
foreach (var signature in signatures)
{
    if (signature.IsSigned)
    {
        signed = true;
        certificate = signature.Details.SignatureCertificate;
        // Verify signature
        valid = signature.IsValid;
        break;
    }
}
​
// Verify certificate
if (certificate != null)
{
    var status = X509ChainStatusFlags.NoError;
​
    // build the certificate chain
    var chain = new X509Chain();
    bool certValid = chain.Build(certificate);
​
    // inspect the results
    if (!certValid)
    {
        var chainStatus = chain.ChainStatus;
        for (var i = 0; i < chainStatus.Length; i++)
        {
            status |= chainStatus[i].Status;
        }
    }
​
    // Extract the certificate verification result.
    // You can write them to trace listeners or draw them on your screen to observe the result.
    var isCertificateExpired = status.HasFlag(X509ChainStatusFlags.NotTimeValid);
    var isCertificateRevoked = status.HasFlag(X509ChainStatusFlags.Revoked);
    var isCertificateUntrusted = status.HasFlag(X509ChainStatusFlags.UntrustedRoot);
}

서명 나열

여러 서명란이 추가되면 IWorkbook.Signatures를 사용하여 인덱스 또는 열거자로 서명란을 나열합니다.

// List signatures with indexes
for (var i = 0; i < signatures.Count; i++)
{
    var signature = signatures[i];
    // Insert your code here
}
​
// List signatures with enumerator
foreach (var signature in signatures)
{
    // Insert your code here
}
​
//save to an excel file
workbook.Save("listsignaturelines.xlsx");


서명된 Excel 스프레드시트를 PDF로 내보내기

GcExcel을 사용하면 서명란에 의해 서명된 Excel 스프레드시트를 PDF 형식으로 내보낼 수 있습니다. 내보내려면 IWorkbook.Save 메서드를 사용합니다.

workbook.Open(GetResourceStream(@"xlsx\Signature.xlsx"));
workbook.Signatures.SkipCertificateValidationOnExporting = false;
​
//save to a pdf file
workbook.Save("exportsignaturelinetopdf.pdf");

몇 가지 일반적인 상황을 고려하고 GcExcel을 사용하여 디지털 서명을 추가/관리하는 방법을 알아보겠습니다.


Excel 파일에 디지털 서명하는 방법

Visual Studio .NET Core 응용 프로그램을 빌드하고 다음 두 가지 시나리오를 구현합니다.


Excel 파일에 서명하는 방법

가장 일반적인 시나리오는 Excel 스프레드시트의 진위를 확인하기 위해 기존 Excel 파일에 서명하는 것이 요구 사항인 경우입니다. 이를 위해 Excel 파일에 디지털 서명(보이지 않음)을 추가합니다.

1단계 설치
  • .Net Core 콘솔 응용 프로그램에서 '종속성'을 마우스 오른쪽 버튼으로 클릭하고 'NuGet 패키지 관리'를 선택합니다.
  • '찾아보기' 탭에서 GrapeCity.Documents.Excel을 검색하고 '설치'를 클릭합니다.
  • 설치 중에 두 가지 확인 대화 상자가 나타납니다. ‘변경 내용 미리 보기’ 및 ‘라이선스 수락’ 여부를 묻는 대화 상자가 나타나면 ‘확인’ 및 ‘동의함’을 각각 클릭하여 계속 진행합니다.
2단계 C# 프로젝트 설정

네임스페이스 추가

프로그램 파일에서 다음 네임스페이스를 가져옵니다.

using GrapeCity.Documents.Excel;

새 통합 문서 만들기

기본 함수에 다음 코드를 추가하여 새 GcExcel 통합 문서를 만듭니다.

Workbook workbook = new Workbook();

Excel 통합 문서 로드

기본 함수에 다음 코드를 추가하여 Excel 보고서를 프로젝트 리소스의 파일 스트림 형태로 로드합니다.

var assembly = typeof(DigitalSignaturesDemo_GcExcel.Program).GetTypeInfo().Assembly;
Stream signedFileStream = assembly.GetManifestResourceStream("DigitalSignaturesDemo_GcExcel.Resources.Financial Sample.xlsx");
workbook.Open(signedFileStream);

보이지 않는 서명 만들기

기본 함수에서 AddNonVisibleSignature 메서드를 호출해 보이지 않는 새 서명을 만듭니다.

ISignature signature = workbook.Signatures.AddNonVisibleSignature();

서명 세부 정보 정의

SignatureDetails 클래스의 인스턴스를 만들고 다양한 속성을 설정하여 서명 세부 정보를 정의합니다.

SignatureDetails details = new SignatureDetails
{
    Address1 = "GrapeCity India Pvt Ltd",
    Address2 = "A-15, Sector 62",
    SignatureComments = "Final",
    City = "Noida>",
    StateOrProvince = "Uttar Pradesh",
    PostalCode = "201307",
    CountryName = "India",
    ClaimedRole = "Software Engineer",
    CommitmentTypeDescription = "Approved",
    CommitmentTypeQualifier = "Final"
};

인증서 로드

X509Certificate2 클래스를 사용하여 인증서를 로드합니다.

X509Certificate2 cert = new X509Certificate2("Resources/GPCTAdmin.pfx", "grapecity@123");

Excel 파일 서명

로드된 인증서로 서명 패킷을 만들고 Sign. html 메서드를 호출하여 생성된 보이지 않는 서명에 대한 세부 정보를 정의합니다.

signature.Sign(cert, details);

서명 커밋

서명을 커밋하려면 통합 문서를 .xlsx 또는 .xlsm으로 저장합니다.

workbook.Save("SignWorkbook.xlsx");

img


이미 서명된 Excel 파일에 서명하는 방법

다른 일반 시나리오는 이미 서명된 Excel 파일을 수정한 후 서명하는 상황입니다. 문서가 수정되면 기존 서명은 무효가 됩니다. 따라서 문서에 다시 서명해야 합니다.

이를 위해서는 GcExcel을 사용하여 보이지 않는 디지털 서명을 추가합니다. 수정 사항이 포함된 이미 서명된 Excel 파일에 서명하는 단계에는 앞의 시나리오에 해당하는 모든 단계가 포함되며, 여기에 몇 가지 단계가 추가됩니다.

앞의 시나리오에서는 통합 문서에 직접 서명을 추가했습니다. 그러나 이 시나리오에서는 기존 Excel 파일에 다시 서명하라는 요청이므로, XlsxOpenOptions 클래스를 사용하여 파일이 DigitalSignatureOnly 모드에서 열려 있는지 확인해야 합니다.

Excel 파일을 DigitalSignatureOnly 모드에서 열어야 합니다. 디지털 서명 전용 모드가 없는 경우에는 통합 문서를 저장하면 기존의 모든 서명이 제거됩니다.

앞의 예에서 제공된 코드 외에도 통합 문서 인스턴스를 만든 후 다음 코드를 사용합니다.

XlsxOpenOptions openOption = new XlsxOpenOptions { DigitalSignatureOnly = true };
workbook.Open(signedFileStream, openOption);

img

이 프로세스는 이미 서명란으로 서명된 Excel에서 보이지 않는 서명이 있는 Excel 파일을 생성합니다.

데모 다운로드

도움말: .NET | JAVA

데모: .NET | JAVA

  • 페이스북으로 공유
  • 트위터로  공유
  • 구글플러스로 공유
  • 카카오톡으로 보내기

댓글목록

등록된 댓글이 없습니다.

그레이프시티 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기

태그

인기글

더보기
  • 인기 게시물이 없습니다.
그레이프시티 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기
이메일 : sales-kor@grapecity.com | 전화 : 1670-0583 | 경기도 안양시 동안구 시민대로 230, B-703(관양동, 아크로타워) 그레이프시티(주) 대표자 : 허경명 | 사업자등록번호 : 123-84-00981 | 통신판매업신고번호 : 2013-경기안양-00331 Copyright ⓒ 2021 GrapeCity inc.