다음을 통해 공유


방법: InfoPath 2003 개체 모델을 사용하여 디지털 서명 작업

InfoPath 2003 호환 개체 모델에서는 디지털 서명 작업을 프로그래밍 방식으로 실행할 수 있는 기능을 제공합니다.

디지털 서명 기능

InfoPath의 디지털 서명 기능을 사용하면 다음을 수행할 수 있습니다.

  • 전체 양식에 대해 서명하거나 양식의 특정 데이터 집합에 대해 별도로 서명할 수 있습니다.

  • 서명할 수 있는 각 데이터 집합에 대해 단일 서명을 허용할지 아니면 복수 서명을 허용할지와 이러한 서명 간의 관계를 지정합니다. 예를 들어 한 문서에 여러 사람이 서명(연서)하는지 아니면 이전의 모든 서명에 각 새 서명을 추가(연대 서명)하는지 등을 지정할 수 있습니다.

  • 양식에 서명할 때 양식 사용자에게 표시되는 메시지를 지정합니다.

  • 문서에 서명을 삽입하고 각 서명을 확인합니다.

  • 보안이 강화됨에 따라 각 서명에 추가된 확인할 수 있으며 거부할 수 없는 정보를 표시합니다. 각 서명자에게 표시되는 대로 양식의 보기를 포함하는 이 추가 정보는 서명의 일부이며 서명을 무효화하지 않으면 제거할 수 없습니다. 양식에서 서명을 클릭하면 이 데이터를 회수하여 디지털 서명 확인 대화 상자를 표시할 수 있습니다.

  • 디지털 서명 작업을 위해 개체 모델을 활용합니다. 즉, 디지털 서명 개체 모델을 통해 완전히 신뢰할 수 있는 양식의 서명 블록에 사용자 지정 정보를 추가합니다.

디지털 서명 개체 모델 개요

이벤트

디지털 서명 개체 모델에서는 다음과 같은 이벤트를 제공합니다.

이름

설명

OnSign

서명 가능한 데이터 집합을 서명하도록 선택한 후에 발생합니다.

이 이벤트를 사용하여 디지털 서명에 추가 데이터를 추가할 수 있습니다. 예를 들어 신뢰할 수 있는 타임스탬프 서버로부터 데이터를 추가하거나 트랜잭션의 서버 쪽 연대 서명을 추가할 수 있습니다. 또한 현재 사용자가 특정 그룹의 구성원이 아닌 경우 이 이벤트를 사용하여 서명하지 못하도록 막을 수 있습니다.

OnSign 이벤트는 다음 속성을 제공하는 SignEventObject 개체에 대한 참조를 반환합니다.

이름

설명

ReturnStatus

OnSign 이벤트의 반환 상태를 나타내는 Boolean 값을 가져오거나 설정합니다.

SignedDataBlock

OnSign 이벤트를 트리거한 서명한 데이터 블록을 가져옵니다.

XDocument

OnSign 이벤트에 연결된 XDocument 개체에 대한 참조를 가져옵니다.

컬렉션 및 개체

디지털 서명 개체 모델에서는 다음과 같은 컬렉션을 제공합니다.

이름

설명

SignedDataBlocksCollection

양식 정의 파일(.xsf)에 정의된 대로 양식 서식 파일의 SignedDataBlockObject 개체에 대한 모음입니다.

SignedDataBlocksCollection 컬렉션은 양식에 연결된 SignedDataBlockObjects 개체에 액세스하는 데 사용할 수 있는 속성을 구현합니다. XDocument 개체의 SignedDataBlocks 속성을 통해 SignedDataBlocks 컬렉션에 액세스할 수 있습니다.

SignaturesCollection

양식의 각 SignedDataBlockObject에 대한 SignatureObject 개체의 모음을 포함합니다.

SignaturesCollection 컬렉션은 양식의 연결 SignatureObject 개체에 액세스하여 서명을 만드는 데 사용될 수 있는 속성과 메서드를 구현합니다. SignedDataBlockObject 개체를 통해 액세스할 수 있습니다.

SignaturesCollection 컬렉션의 Create 메서드를 사용하는 경우 SignatureObject 개체에서 Sign 메서드를 호출할 때까지 서명이 작성되지 않습니다. 이러한 메서드는 완전히 신뢰할 수 있는 양식 서식 파일의 OnSign 이벤트 처리기에서만 호출할 수 있습니다.

디지털 서명 개체 모델에서는 다음과 같은 개체를 제공합니다.

이름

설명

SignedDataBlockObject

양식의 서명 가능한 데이터 집합을 나타냅니다. SignedDataBlock 개체는 서명 가능한 데이터 집합과 프로그래밍 방식으로 상호 작용하는 데 사용할 수 있는 여러 속성과 메서드 하나를 제공합니다.

SignatureObject

양식에 추가된 디지털 서명이나 양식의 서명 가능한 데이터 집합을 나타냅니다. SignatureObject 컬렉션은 디지털 서명에 대한 정보를 가져오는 데 사용할 수 있는 속성 및 XML 디지털 서명 블록을 작성하고 암호화 해시 값을 계산하는 데 필요한 Sign 메서드를 구현합니다.

CertificateObject

서명을 만드는 데 사용된 X.509 디지털 인증서를 나타냅니다.

프로그래밍 방식으로 디지털 서명 작업

InfoPath 2003 호환 개체 모델에서는 프로그래밍 방식으로 디지털 서명과 상호 작용하는 데 사용할 수 있는 멤버를 제공합니다. 특히 완전히 신뢰할 수 있는 양식은 커밋되기 전에 다음과 같은 순서로 서명 블록에 사용자 지정 정보를 추가할 수 있습니다.

  1. 사용자가 양식에 디지털 서명을 추가하도록 선택합니다.

  2. 디지털 서명 마법사의 첫 번째 패널이 표시됩니다.

  3. SignedDataBlockObject 개체에 의해 나타나는 선택한 데이터에 대한 OnSign 이벤트가 발생하고 SignedDataBlockObject의 Sign 메서드 및 SignaturesCollection 컬렉션의 Create 메서드가 실행됩니다.

  4. 선택적 사용자 지정 작업이 실행됩니다.

  5. SignatureObject의 Sign 메서드가 실행됩니다.

  6. 서명할 인증서를 선택하고 설명을 입력할 수 있도록 마법사의 두 번째 창과 세 번째 창이 표시됩니다.

  7. 거부할 수 없는 정보가 표시됩니다. 이 내용은 나중에 디지털 서명 확인 대화 상자에서 볼 수 있습니다.

  8. 서명 단추를 클릭하면 양식의 서명 모음에 서명이 추가됩니다.

다음 예제에서는 서명 대화 상자를 호출하고, 신뢰할 수 있는 타임스탬프 서비스에서 가져온 타임스탬프 값으로 서명에 연대 서명합니다.

[InfoPathEventHandler(EventType=InfoPathEventType.OnSign)]
public void OnSign(SignEvent e)
{
    Signature signature = e.SignedDataBlock.Signatures.Create();
    // Invoke the Sign dialog box to sign the data block.
    signature.Sign();
    // Countersign the signature with a trusted timestamp
    // Get the XML node storing the signature block
    IXMLDOMNode oNodeSig = signature.SignatureBlockXmlNode;
    IXMLDOMNode oNodeSigValue = oNodeSig.selectSingleNode(".//*[local-name(.)='signatureValue']");
    // Get timestamp from a trusted timestamp service (fictitious).
    MyTrustedTimeStampService s = new MyTrustedTimeStampService();
    string strVerifiedTimeStamp = s.AddTimeStamp(oNodeSigValue.text);
    
    //Add the value returned from the timestamp service to the 
    //unsigned part of the signature block
    IXMLDOMNode oNodeObj = oNodeSig.selectSingleNode(".//*[local-name(.)='Object']");
    IXMLDOMNode oNode = oNodeObj.cloneNode(false);
    oNode.text = strVerifiedTimeStamp;
    oNodeObj.parentNode.appendChild(oNode);

    e.ReturnStatus = true;
}