방법: 디지털 서명 사용

Microsoft.Office.InfoPath 네임스페이스의 개체 모델에서는 디지털 서명 작업을 프로그래밍 방식으로 실행할 수 있는 기능을 제공합니다.

디지털 서명 기능

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

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

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

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

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

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

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

디지털 서명 개체 모델 개요

Sign 이벤트

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

이름

설명

Sign

서명할 데이터 집합을 선택한 후에 발생합니다.

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

SignEventArgs 개체

Sign 이벤트에 대한 이벤트 처리기는 다음 속성을 제공하는 SignEventArgs 이벤트 개체에서 작동할 수 있습니다.

이름

설명

SignedDataBlock

Sign 이벤트를 발생시킨 데이터 집합을 가져옵니다.

SignatureWizard

디지털 서명 대화 상자 표시 여부를 나타내는 값을 가져오거나 설정합니다.

참고 사항참고 사항

InfoPath 2003과 함께 제공되는 Microsoft.Office.Interop.InfoPath.SemiTrust 관리 코드 개체 모델에서 OnSign 이벤트에 대한 SignEvent 이벤트 개체는 이벤트에 연결된 양식의 XDocument 개체에 액세스하는 데 사용되는 XDocument 속성을 제공합니다. XmlForm 클래스의 개체 모델 멤버는 this(C#) 또는 Me(Visual Basic) 키워드를 사용하여 양식 코드에서 액세스할 수 있으므로 InfoPath Forms Services 또는 InfoPath 2010에서 Microsoft.Office.InfoPath 개체 모델을 사용하여 만든 양식 서식 파일에는 이 속성이 필요하지 않습니다. 예를 들어 XmlForm 클래스의 Signed 속성에 액세스하여 양식이 서명되었는지 확인하려면 this.Signed 또는 Me.Signed를 입력할 수 있습니다.

컬렉션 및 개체

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

이름

설명

SignedDataBlockCollection

InfoPath 디자인 모드에서 디자인 타임에 정의된 대로 양식 서식 파일에 포함된 SignedDataBlock 개체의 컬렉션입니다.

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

SignatureCollection

양식에 있는 각 SignedDataBlock 개체에 대한 Signature 개체의 컬렉션을 포함합니다.

SignatureCollection 클래스는 양식에 연결된 Signature 개체에 액세스하고 서명을 만드는 데 사용할 수 있는 속성과 하나의 메서드를 구현합니다. SignedDataBlock에 연결된 SignatureCollection 개체는 Signatures 속성을 사용하여 액세스할 수 있습니다.

SignatureCollection 클래스의 CreateSignature 메서드를 사용하는 경우 Signature 개체에서 Sign 메서드를 호출할 때까지 서명이 작성되지 않습니다. 이러한 메서드는 완전히 신뢰할 수 있는 양식 서식 파일의 Sign 이벤트 처리기에서만 호출할 수 있습니다.

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

이름

설명

SignedDataBlock

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

Signature

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

Certificate

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

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

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

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

  2. 디지털 서명 대화 상자가 표시되면 사용자가 추가를 클릭한 다음 서명할 데이터를 선택합니다.

  3. SignedDataBlock 개체가 나타내는 선택한 데이터에 대한 Sign 이벤트가 발생하고 SignedDataBlock 개체의 Sign() 메서드와 SignatureCollection 컬렉션의 CreateSignature 메서드가 실행됩니다.

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

  5. Signature 개체의 Sign() 메서드가 실행됩니다.

  6. 서명 대화 상자가 표시됩니다. 여기서 이름을 입력하거나 서명 이미지를 선택하고 서명에 사용할 인증서를 선택한 다음 주석을 입력할 수 있습니다.

  7. 서명 단추를 클릭하면 양식에 대한 서명 컬렉션에 서명이 추가되고 거부할 수 없는 정보가 캡처되어 서명과 함께 저장됩니다. 나중에 디지털 서명 대화 상자에서 서명한 양식 보기를 클릭한 다음 수집된 추가 서명 정보 보기을 클릭하면 이 정보를 볼 수 있습니다.

다음 예제에서는 사용자가 선택한 데이터에 서명하고 신뢰할 수 있는 타임스탬프 서비스에서 가져온 타임스탬프 값으로 서명에 연대 서명할 때 Sign() 메서드를 호출합니다.

public void FormEvents_Sign(object sender, SignEventArgs e)
{
   // Add a new Signature object to the SignedDataBlockCollection.
   Signature thisSignature = 
      e.SignedDataBlock.Signatures.CreateSignature();

   // Write the XML digital signature block and compute hash
   // for signed data.
   thisSignature.Sign();

   // Countersign the signature with a trusted timestamp.

   // Get the XML node storing the signature block.
   XPathNavigator oNodeSig = thisSignature.SignatureBlockXmlNode;
   XPathNavigator oNodeSigValue = 
      oNodeSig.SelectSingleNode(
      ".//*[local-name(.)='signatureValue']");

   // Get timestamp from a trusted timestamp service (fictitious).
   MyTrustedTimeStampService s = new MyTrustedTimeStampService();
   string strVerifiedTimeStamp = s.AddTimeStamp(oNodeSigValue.Value);

   // Add the value returned from the timestamp service to the 
   // unsigned part of the signature block.
   XPathNavigator oNodeObj = 
      oNodeSig.SelectSingleNode(".//*[local-name(.)='Object']");
   XPathNavigator oNode = oNodeObj.Clone();
   oNode.SetValue(strVerifiedTimeStamp);
   oNodeObj.MoveToParent();
   oNodeObj.AppendChild(oNode);

   e.SignatureWizard = false;
}
Public Sub FormEvents_Sign(ByVal sender As Object, _
   ByVal e As SignEventArgs)
   ' Add a new Signature object to the SignedDataBlockCollection.
   Dim thisSignature As Signature = 
      e.SignedDataBlock.Signatures.CreateSignature

   ' Write the XML digital signature block and compute hash
   ' for signed data.
   thisSignature.Sign()

   ' Countersign the signature with a trusted timestamp.

   ' Get the XML node storing the signature block
   Dim oNodeSig As XPathNavigator  = _
      thisSignature.SignatureBlockXmlNode
   Dim oNodeSigValue As XPathNavigator  = _
      oNodeSig.SelectSingleNode(_
      ".//*[local-name(.)='signatureValue']")

   ' Get timestamp from a trusted timestamp service (fictitious).
   Dim s As MyTrustedTimeStampService = New MyTrustedTimeStampService()
   Dim strVerifiedTimeStamp As String  = _
      s.AddTimeStamp(oNodeSigValue.Value)

   ' Add the value returned from the timestamp service to the 
   ' unsigned part of the signature block.
   Dim oNodeObj As XPathNavigator  = 
      oNodeSig.SelectSingleNode(".//*[local-name(.)='Object']")
   Dim oNode As XPathNavigator  = oNodeObj.Clone()
   oNode.SetValue(strVerifiedTimeStamp)
   oNodeObj.MoveToParent()
   oNodeObj.AppendChild(oNode)

   e.SignatureWizard = False