개방형 패키징 규칙의 디지털 서명 프레임워크

 

데이비드 멜처와 안드레이 서
Microsoft Corporation

2006년 9월

적용 대상:
   OPC 디지털 서명 프레임워크
   W3C XML 디지털 서명 표준
   Microsoft .NET 3.0 Framework

요약: OPC 디지털 서명 프레임워크에 대해 설명하고 패키지 구성 요소 및 지원 서비스에 대한 개요와 서명 정책 및 구현 예제를 제공합니다. (인쇄된 12페이지)

콘텐츠

소개
OPC 디지털 서명 프레임워크의 구성 요소
   XML 디지털 서명 표준
   패키지의 디지털 서명 표현
   서명 부분 및 관계
패키지 서명에 대한 프로그래밍 지원
   서명 패키지 파트 및 관계
   인증서 및 서명 확인
애플리케이션 서명 정책
   XPS 문서
   XPS 서명에 대한 프로그래밍 지원
참조

소개

OPC(Open Packaging Conventions)에서 지정한 패키징 모델은 패키지, 부품 및 관계를 설명합니다. 패키지에는 콘텐츠 및 리소스를 보관하는 파트가 있습니다. 관계는 패키지를 파트에 연결하고 패키지의 다양한 부분을 연결하기 위해 정의됩니다.

이 문서에서는 패키지 구성 요소 및 지원 서비스에 대한 개요와 서명 정책 및 구현 예제를 제공하는 OPC 디지털 서명 프레임워크에 대해 설명합니다.

서명 프레임워크에는 디지털 서명을 나타내는 인프라와 서명을 만들고 유효성을 검사하기 위한 서비스가 포함되어 있습니다. 서명 프레임워크를 사용하면 W3C XML 디지털 서명 표준을 패키지 파트 및 관계에 적용할 수 있습니다.

서명 프레임워크를 사용하여 패키지 기반 형식의 소유자는 해당 형식과 관련된 "서명 정책"을 정의하고 구현합니다. 정책은 특정 형식의 정수 콘텐츠에 서명하고 유효성을 검사하는 방법을 지정하고 서명이 다른 워크플로에 사용되는 방법을 구현합니다. 실제로 단일 형식의 경우 문서 수명 주기의 여러 단계에서 사용하도록 정의된 여러 정책이 있을 수 있습니다.

패키지 기반 형식에 대한 서명 정책은 서명 부분 및 관계 및 기타 문서 특성(예: 의도한 디스플레이 디바이스, 색 깊이 또는 애플리케이션 버전 유효성 검사)의 관점에서 표현됩니다. 서명 정책은 서명할 문서 구성 요소와 서명되지 않은 상태로 둘 문서 구성 요소(있는 경우)를 지정합니다. 예를 들어 새 파트와 관계를 패키지에 추가할 수 있도록 서명 정책을 구현하거나 새 파트 또는 서명을 패키지에 추가하는 경우 정책이 무효화될 수 있습니다.

이 문서에서는 Open Packaging Conventions 사양 및 W3C Recommendation XML-Signature 구문 및 처리에 대해 잘 알고 있다고 가정합니다.

OPC 디지털 서명 프레임워크의 구성 요소

XML 디지털 서명 표준

패키지에 대한 서명 프레임워크는 W3C 권장 사항 XML 서명 구문 및 처리에 정의된 대로 XML 디지털 서명 표준을 사용합니다. 이 권장 사항은 디지털 서명을 생성하고 저장하기 위한 XML 구문 및 처리 규칙을 지정합니다.

표준은 모든 종류의 디지털 리소스에 서명하고 유효성을 검사하기 위한 XML 서명 요소 형식, 스키마 및 규칙 요구 사항을 정의합니다. 또한 스키마는 리소스를 참조하고 서명 관련 알고리즘을 지정하기 위한 요소를 정의합니다.

디지털 서명의 기능

디지털 서명을 사용하여 서명된 콘텐츠가 서명된 이후 변경되었는지 여부를 확인할 수 있습니다. 서명에는 잘 알려진 알고리즘에 따라 해시되고 생성될 때 서명에 저장된 콘텐츠의 매니페스트가 포함되어 있습니다. 콘텐츠가 변경되었는지 확인하기 위해 서명된 콘텐츠의 해시가 다시 만들어지고 서명 내에 저장된 해시와 비교됩니다.

디지털 서명을 사용하여 콘텐츠 서명자를 식별할 수도 있습니다. 서명자의 ID는 서명과 연결된 인증서로 표시됩니다. 인증서는 서명에 포함되거나 다른 곳에서 사용할 수 있습니다.

디지털 서명은 문서를 "잠그거나" 암호화되지 않습니다(이미 암호화되었을 수 있음). 문서 콘텐츠는 서명된 후에도 변경되지 않은 상태로 유지됩니다. 디지털 서명은 의도하지 않은 소비자가 서명된 콘텐츠를 보는 것을 방지하지 않습니다.

패키지의 디지털 서명 표현

애플리케이션은 지정된 부분 및 관계 구성을 사용하여 패키지에 디지털 서명을 통합합니다.

서명 프레임워크는 XML 디지털 서명 표준에서 허용하는 패키징 네임스페이스의 요소와 특성을 사용합니다. 패키징 네임스페이스에 정의된 서명 요소는 표준을 모순하지 않고 보강하는 패키지별 기능을 지원합니다. 추가 사항에 대한 요약은 OPC 사양의 "XML 디지털 서명 사양 수정" 섹션을 참조하세요.

서명 프레임워크에 대해 정의된 패키지 부분은 원본 부분, XML 서명 부분 및 인증서 부분입니다. 각각에는 잘 정의된 콘텐츠 형식이 있습니다. 잘 정의된 관계 형식은 OPC 사양의 부록 H, "표준 네임스페이스 및 콘텐츠 형식"에 지정된 대로 패키지의 서명 부분을 연결하는 데 사용됩니다.

디지털 서명 원본 파트

디지털 서명 원본 부분은 패키지의 서명을 탐색하기 위한 시작점입니다. 디지털 서명 원본 부분은 디지털 서명 원본 관계를 사용하여 패키지 루트에서 대상으로 지정됩니다. 여러 서명 부분은 원본 부분에서 대상으로 지정할 수 있습니다. 패키지에 서명이 없으면 원본 부분이 없습니다.

디지털 서명 XML 서명 파트

디지털 서명 XML 서명 파트는 패키징 네임스페이스뿐만 아니라 W3C 디지털 서명 표준에 정의된 태그를 포함합니다. 파트는 디지털 서명 관계와 디지털 서명 원본 파트 XML의 대상이 됩니다.

디지털 서명 인증서 파트

서명자를 식별하는 데 필요한 X.509 인증서(패키지에 배치된 경우)는 XML 서명 부분에 포함되거나 별도의 인증서 부분에 저장될 수 있습니다. 선택적 인증서 부분은 디지털 서명 인증서 관계가 있는 XML 서명 부분의 대상입니다. 인증서 부분은 여러 서명 부분 간에 공유할 수 있습니다.

사용자 지정 서명 파트

서명 프레임워크에서 사용자 지정(애플리케이션별) 서명 부분은 허용되지만 처리되지는 않습니다. XML 서명 이외의 서명 형식을 포함하는 서명 부분은 사용자 지정 콘텐츠 형식으로 식별되어야 합니다. 또한 디지털 서명 원본 부분의 파트를 대상으로 지정하려면 사용자 지정 관계 형식과의 관계를 사용해야 합니다.

서명 부분 및 관계

XML 디지털 서명 표준을 사용하면 주소 지정 가능한 리소스에 서명할 수 있으며 패키지의 경우 부분입니다. 서명 프레임워크를 사용하면 파트에 서명할 수 있습니다. 관계 파트에 저장된 패키지의 관계는 한 번에 모두 서명하거나 서명에 관계 하위 집합을 지정할 수 있습니다.

파트의 콘텐츠 형식은 파트 콘텐츠와 함께 서명되어 유효하게 서명된 패키지의 파트가 의도한 대로 사용되거나 렌더링되도록 합니다. 콘텐츠 형식은 주소 지정 가능한 리소스가 아니므로 패키지별 접근 방식을 사용하여 콘텐츠 형식 값에 서명합니다. 패키지가 서명되면 서명된 각 파트의 콘텐츠 형식이 서명된 부분을 참조하는 URI의 쿼리 구성 요소에 저장됩니다. 패키지를 사용하는 경우 OPC 디지털 서명 프레임워크는 콘텐츠 형식 값을 사용하여 파트가 서명된 이후 파트의 콘텐츠 형식이 변경되지 않도록 합니다.

관계 파트가 전체적으로 서명되면 해당 부분에 정의된 모든 관계가 서명됩니다. 서명을 무효화하지 않고 패키지의 일부 내용을 변경할 수 있는 서명 정책을 지원하기 위해 서명 프레임워크는 지정된 관계에 서명하는 메커니즘을 제공합니다. 지정한 관계에 서명하기 위해 서명 프레임워크는 특수 변환인 관계 변환을 사용합니다( 변환 알고리즘 참조).

관계 변환은 지정된 관계 집합만 포함하는 관계 부분을 만듭니다. 가져온 관계 부분은 서명 및 서명 유효성 검사 중에 사용됩니다.

패키지 서명에 대한 프로그래밍 지원

서명에 서명하고 유효성을 검사하기 위해 애플리케이션은 .NET 3.0 클래스 PackageDigitalSignatureManager를 사용할 수 있습니다. System.IO.Packaging 네임스페이스에 정의된 패키지별 클래스는 System.Security.Cryptography.Xml 네임스페이스에 정의된 Microsoft .NET 3.0 Framework의 디지털 서명 클래스를 기반으로 합니다.

PackageDigitalSignatureManager 클래스는 서명을 만들고 유효성을 검사하고 패키지에 서명 인프라를 배치하는 데 사용됩니다. 서명은 PackageDigitalSignature 클래스를 기반으로 하는 개체로 표시됩니다.

서명 패키지 파트 및 관계

애플리케이션은 서명 정책에 따라 서명할 부분 및 관계 목록을 정의합니다. 그런 다음, 애플리케이션은 PackageDigitalSignatureManager.Sign() 메서드를 호출하여 서명을 만들고 패키지에 서명 인프라를 추가합니다.

아래 샘플 코드는 관계 부분을 제외한 패키지의 모든 부분에 서명하고, 패키지 루트에서 시작된 모든 기존 관계에 서명하고, XML 서명 부분에 서명하는 데 사용되는 인증서를 포함하는 방법을 보여 줍니다. 샘플 코드는 처음에 패키지에 서명이 없고 확인 전에 하나의 서명만 적용된다고 가정합니다.

서명 프로세스 시작

패키지에서 서명 작업을 시작하려면 먼저 아래와 같이 PackageDigitalSignatureManager를 만듭니다.

    // Open the package.
    Package package = Package.Open(filename);

    // Create the PackageDigitalSignatureManager
      PackageDigitalSignatureManager dsm =
        new PackageDigitalSignatureManager(package);

인증서 포함 옵션

인증서는 서명 자체에 포함된 문자열, 패키지의 별도 부분 또는 패키지 외부의 리소스로 표시될 수 있습니다. 인증서를 패키지 내에 배치할 경우 애플리케이션은 PackageDigitalSignature.CertificateOption 속성의 포함 옵션을 사용하여 인증서를 유지하는 방법을 지정합니다. PackageDigitalSignatureManager 클래스를 만든 후 아래 샘플 코드와 같이 인증서에 대한 포함 옵션이 설정됩니다.

    //Specify that the certificate is embedded in the signature held
    //in the XML Signature part.

    //Certificate embedding options include:
    // InSignaturePart – Certificate is embedded in the signature.
    // InCertificatePart – Certificate is embedded in a 
    //                     separate certificate part

    dsm.CertificateOption =
        CertificateEmbeddingOption.InSignaturePart;

부록 목록

서명할 파트 목록은 파트를 주소 지정하는 URI를 사용하여 지정됩니다. 이 샘플에서는 PackUriHelper.IsRelationshipPartUri() 메서드를 사용하여 필터링되는 관계 부분을 제외하고 패키지의 모든 파트에 서명됩니다.

    //Initialize a list to hold the part URIs to sign.

    System.Collections.Generic.List<Uri> partsToSign =
        new System.Collections.Generic.List<Uri>();

    //Add each part to the list, except relationships parts.
    foreach (PackagePart packagePart in package.GetParts())
    {
        if (!PackUriHelper.IsRelationshipPartUri(packagePart.Uri))
      partsToSign.Add(packagePart.Uri);
  }

서명된 관계 목록

개별 관계는 관계 변환을 사용하여 서명됩니다. 이러한 방식으로 관계를 서명하면 서명을 무효화하지 않고 패키지에 새 관계를 추가할 수 있습니다.

서명 시 사용할 PackageRelationshipSelector 개체 목록을 만들어 서명을 위해 관계를 선택합니다. PackageRelationshipSelector 개체는 아래 샘플과 같이 관계 형식(Open Packaging Conventions의 "표준 네임스페이스 및 콘텐츠 형식" 섹션에 정의됨)에 따라 그룹으로 만들거나 관계 ID를 지정하여 개별적으로 만들 수 있습니다.

     //Create list of selectors for the list of relationships

     List<PackageRelationshipSelector> relationshipSelectors = 
          new List<PackageRelationshipSelector>();

     //Create one selector for each package-level relationship, based on id

  foreach (PackageRelationship relationship in package.GetRelationships())
            {
                relationshipSelectors.Add(new
                    PackageRelationshipSelector(relationship.sourceUri, 
                    PackageRelationshipSelectorType.Id, relationship.Id));
            }

PackageRelationshipSelectorType.Id 사용하여 PackageRelationshipSelector를 만들 때 고유한 ID를 가진 하나의 관계가 서명에 대해 선택됩니다. PackageRelationshipSelectorType.Type을 사용하여 선택기를 만들 때 지정된 형식과의 모든 관계가 서명에 대해 선택됩니다. 동일한 형식의 관계가 나중에 패키지에 추가되면 서명이 무효화됩니다.

인증서 개체 만들기

서명하기 전에 System.Security.Cryptography.X509Certificates.X509Certificate2 형식의 개체를 인스턴스화하여 유효한 X.509 인증서를 가져옵니다. 이 개체는 서명 시 PackageDigitalSignatureManager.Sign() 메서드에 전달됩니다. 인증서 개체를 만드는 방법에 대한 자세한 내용은 System.Security.Cryptography.X509Certificates 네임스페이스를 참조하세요.

서명 적용

서명할 부분 및 관계 목록을 만들고 인증서 개체를 가져온 후 애플리케이션은 PackageDigitalSignatureManager.Sign() 메서드를 호출합니다.

     //Sign package using components created above

     PackageDigitalSignature signature = dsm.Sign(partsToSign, 
          x509Certificate, relationshipSelectors);

     //After signing, close the package.
     //The signature will be persisted in the package.
     package.Close();

Sign() 메서드가 호출되면 해시가 생성되어 서명 매니페스트에 저장되고 서명 부분이 만들어집니다. 패키지에 서명 인프라가 이미 있는 경우 새 서명 부분이 추가됩니다(허용되는 경우). 패키지에 인프라가 아직 없는 경우 Sign() 메서드는 인프라를 만들고 패키지에 배치합니다.

인증서 및 서명 확인

애플리케이션은 인증서 또는 서명을 확인할 수 있습니다. 서명을 확인하기 전에 인증서를 확인해야 합니다. 패키지의 서명을 나타내는 개체 PackageDigitalSignature에는 패키지에 있는 경우 해당 서명을 만드는 데 사용되는 인증서를 반환하는 속성 "Signer"가 있습니다. 인증서가 패키지에 포함되지 않은 경우 애플리케이션은 애플리케이션에 알려진 위치에서 인증서를 가져옵니다.

PackageDigitalSignatureManager.VerifyCertificate() 메서드는 가져온 인증서의 유효성을 검사하고 인증서 구조, 만료 날짜 및 체인 상태 확인하는 데 사용됩니다. 체인 상태 대한 자세한 내용은 .NET Framework 클래스 라이브러리의 X509ChainStatusFlag 열거형을 참조하세요.

애플리케이션 개발자는 인증서 상태 사용하여 서명 정책을 지원할 수 있습니다. 예를 들어 애플리케이션은 특정 날짜 이후에 발급된 인증서만 허용되도록 지정할 수 있습니다.

PackageDigitalSignatureManager.VerifySignatures() 메서드는 패키지의 모든 서명의 유효성을 검사하는 데 사용됩니다. 이 메서드는 서명과 연결된 인증서가 아닌 서명의 유효성만 검사합니다.

아래 샘플 코드를 사용하여 서명 샘플의 패키지에 배치된 인증서 및 서명의 유효성을 검사할 수 있습니다. 샘플 코드는 패키지에 추가된 추가 서명이 없다고 가정합니다.

    // Open the package.

    Package package = Package.Open(filename);

    // Create the PackageDigitalSignatureManager

    PackageDigitalSignatureManager dsm =
        new PackageDigitalSignatureManager(package);

    // Verify the collection of certificates in the package (one, in this case)

        foreach(PackageDigitalSignature signature in pdsm.Signatures)
        {
        if(PackageDigitalSignatureManager.VerifyCertificate(signature.Signer)
            != X509ChainStatusFlags.NoError)
              {
                // Application-specific code for error handling 
                // or certificate validation 
              }
        }
 
   // For this example, if all certificates are valid,
   // verify all signatures in the package.
 
    VerifyResult vResult = dsm.VerifySignatures(false);
    Console.WriteLine("Result " + vResult.ToString());

    // Close the package.

    package.Close();

애플리케이션 서명 정책

패키지 기반 형식을 사용하는 애플리케이션은 서명 프레임워크의 일부로 자체 정책을 정의합니다. 정책은 형식의 요소 형식 및 워크플로 요구 사항에 따라 결정됩니다. 이 섹션에서는 서명 정책이 하나의 Microsoft 패키지 기반 형식인 XPS 문서 형식에 대해 설명합니다.

XPS 문서

XPS 문서 형식은 XML 용지 사양에 지정된 오픈 패키징 규칙을 기반으로 합니다. XML 용지 사양은 XPS 문서에 서명하기 위한 정책을 정의합니다. 해당 정책 내에는 애플리케이션 기능 또는 워크플로를 지원하는 데 사용할 수 있는 서명 옵션이 있습니다.

XPS 문서 패키지에 대한 서명 정책

XPS 문서에 대한 서명 정책은 콘텐츠의 유효성을 검사할 수 있도록 서명해야 하는 부분 및 관계 집합을 설명합니다. 이 정책의 일부로 애플리케이션은 필요에 따라 CoreProperties 부분과 같이 콘텐츠에 부속된 특정 부분의 조합을 포함하는 서명을 만들 수 있습니다. 이러한 부분에 서명하면 서명을 무효화하지 않고 변경되지 않습니다. 또한 애플리케이션은 필요에 따라 서명의 디지털 서명 원본 부분에 연결된 관계 부분에 서명하여 서명을 무효화하지 않고 새 서명이 문서에 추가되는 것을 금지할 수 있습니다.

서명이 유효하려면 XPS 문서 서명 정책을 사용하려면 특정 부분과 관계가 서명에 포함되어야 합니다. 인식할 수 없는 부분이나 관계에 서명할 수 없습니다. 서명을 확인할 때 애플리케이션은 필요한 모든 부분과 관계가 서명되었는지 확인해야 합니다.

서명할 XPS 문서 파트

다음 표에는 모든 XPS 문서에서 서명해야 하는 부분 목록과 선택적으로 서명된 부분이 포함되어 있습니다. 관계의 경우 XPS 서명 정책은 필요한 관계(필수 부분을 대상으로 하는 관계)가 항상 OPC 정의 관계 변환을 사용하여 서명되도록 지정합니다. 파트가 서명된 경우 파트를 대상으로 하는 관계도 서명되어야 합니다.

파트 형식 정책
FixedDocumentSequence 부분 서명해야 합니다.
FixedDocument 부분 서명해야 합니다.
DocumentStructure 부분 서명해야 합니다.
SignatureDefinitions 부분 서명해야 합니다.
FixedPage 부분 서명해야 합니다.
필수 리소스 부분(예: 글꼴, 이미지) 서명해야 합니다.
StoryFragments 부분 서명해야 합니다.
축소판 그림 부분 서명해야 합니다.
CoreProperties 부분 필요에 따라 서명됨
디지털 서명 원본 부분 필요에 따라 서명됨
디지털 서명 인증서 파트 필요에 따라 서명됨
PrintTicket 부분 필요에 따라 서명됨
DiscardControl 부분 필요에 따라 서명됨

XPS 서명 정책에 대한 자세한 내용은 XML 용지 사양의 "XPS 문서 패키지 기능: 디지털 서명: 서명 규칙" 섹션을 참조하세요.

태그 호환성 서명 정책

XML 용지 사양은 XPS 문서에 대체 콘텐츠인 태그 호환성을 포함하는 방법을 설명합니다. 대체 콘텐츠는 태그 호환성 네임스페이스의 요소 내에 배치됩니다. 정책별로 태그 호환성 요소와 특성이 있는 XPS 문서는 서명 애플리케이션이 모든 콘텐츠 대안을 동등한 것으로 인식하지 않는 한 유효하게 서명할 수 없습니다. 인식되는 요소와 특성을 포함하는 XPS 문서만 서명되거나 유효성을 검사할 수 있습니다.

연대 서명

XPS 문서의 내용에 둘 이상의 서명을 적용할 수 있습니다. 예를 들어 법적 계약을 나타내는 콘텐츠에는 서명된 콘텐츠와 서명자의 ID를 나타내는 서명을 여러 사람이 적용해야 할 수 있습니다.

새 서명을 추가하면 항상 디지털 서명 원본 파트에 연결된 관계 파트 내에 새 관계가 만들어집니다. 기존 서명을 무효화하지 않고 XPS 문서에 새 서명을 추가하려면 이 관계 부분은 서명되지 않은 상태로 유지되어야 합니다(관계의 하위 집합이 서명될 수 있음). 관계 부분이 서명에 포함된 경우 이후에 적용된 모든 서명에 의해 해당 서명이 무효화됩니다.

XPS 서명 유효성 검사

서명 만들기를 정의하는 것 외에도 XPS 서명 정책은 서명을 유효한 것으로 확인하는 방법도 지정합니다. 정책은 다음 표와 같이 비준수, 손상됨, 의심 및 유효함을 포함하는 서명의 유효성 상태를 정의합니다.

서명 상태 모든 필수 부분 및 관계가 서명되어 있나요? 서명에는 인식된 콘텐츠만 포함합니까? 서명된 콘텐츠의 해시가 확인되었나요? 서명된 태그 호환성 콘텐츠가 인식되었나요? 인증서가 유효한가요?
비준수 아니요

YES

해당 없음

아니요

해당 없음

해당 없음

해당 없음

해당 없음

해당 없음

해당 없음

끊어짐 YES YES 아니요 해당 없음 해당 없음
의심 YES

YES

YES

YES

YES

YES

아니요

YES

해당 없음

아니요

Valid YES YES YES YES YES

XPS 뷰어는 의심스러운 XPS 서명과 유효한 XPS 서명을 표시합니다. 비준수 서명은 열거되지 않습니다.

XPS 서명에 대한 프로그래밍 지원

XPS 문서로 작업할 때 애플리케이션은 XpsDigitalSignature 클래스의 메서드를 사용할 수 있습니다. 이 클래스는 PackageDigitalSignature 클래스를 기반으로 하며 XPS 디지털 서명 사양에 지정된 알고리즘 및 요구 사항을 따르는 메서드를 포함합니다. 서명 및 유효성 검사 메서드는 XPS 문서의 필요한 모든 부분과 관계가 서명되었는지 확인합니다.

XPS 문서 서명

XpsDocument.SignDigitally() 메서드는 XPS 문서에 서명하는 데 사용됩니다. 메서드를 호출하기 전에 애플리케이션에 X.509 인증서가 있어야 합니다. 이 인증서는 System.Security.Cryptography.X509Certificates.X509Certificate2 개체를 사용하여 가져올 수 있습니다.

     // Open the XPS Document

     XpsDocument document = new XpsDocument(dstContainer,
          FileAccess.ReadWrite);

     // Obtain the certificate object from a file

     X509Certificate certificate =
          509Certificate.CreateFromCertFile(certFilename);

     // Create the signature and add it to the document using
     // the OPC Signing Framework

     document.SignDigitally(certificate, true, 
          XpsDigSigPartAlteringRestrictions.None);

XpsDigSigPartAlteringRestrictions를 사용하여 서명 정책에 따라 서명에 대한 추가 제한을 지정할 수 있습니다. 이 매개 변수는 서명에서 CoreMetadata 및/또는 SignatureOrigin 부분을 제외할지 여부를 지정합니다. 그런 다음, 서명을 무효화하지 않고 나중에 제외된 부분을 변경할 수 있습니다. 예를 들어 서명에서 CoreMetadata 부분을 제외하면 애플리케이션이 서명을 무효화하지 않고 일부 문서 속성을 변경할 수 있습니다.

PrintTicketDiscardControl 부분은 SignDigitally() 메서드에서 만든 서명에서 제외되지만, 이러한 부분은 필요에 따라 애플리케이션별 방식으로 서명될 수 있습니다.

XPS 문서 서명 확인

하나 이상의 서명을 XPS 문서와 함께 저장할 수 있습니다. 서명은 XpsDocument.Signatures 속성에서 가져올 수 있습니다. 각 서명은 XpsDigitalSignature 개체의 instance 표시됩니다.

아래 샘플에서는 컬렉션의 첫 번째 서명만 확인됩니다.

     // Open the XPS Document.

     // Obtain the first enumerated signature.

     foreach (XpsDigitalSignature digitalSignature in
              document.Signatures)
     { 
          // Verify the signature object, if present.

          if (digitalSignature.Verify() ==
     System.IO.Packaging.PackageDigitalSignature.VerifyResult.Success)
          {
         //Signature is valid
          }
     }

참조