Поделиться через


Практическое руководство. Работа с цифровыми подписями

Объектная модель пространства имен Microsoft.Office.InfoPath предоставляет функции для программной работы с цифровыми подписями.

Функции цифровых подписей

Предоставляемые в InfoPath функции цифровых подписей позволяют:

  • Применять цифровые подписи ко всей форме или к определенным наборам данных в форме, которые можно подписывать отдельно.

  • Указывать каждый набор данных, который можно подписать, а также разрешается ли использовать только одну подпись или возможно использование нескольких подписей с установлением определенных соотношений между ними. Например, можно задать, являются ли все подписи параллельными или каждая подпись отменяет действие предыдущих.

  • Указывать сообщение, которое будет отображаться пользователям при подписании формы.

  • Вставлять и просматривать подпись документа.

  • Просматривать утверждаемые неотрекаемые сведения, добавленные к каждой подписи для повышения безопасности. Эти дополнительные сведения, которые включают представление формы для каждого подписывающегося лица, являются составным элементом подписи, и их нельзя удалить до тех пор, пока подпись действительна. Эти сведения можно вызвать в любой момент, щелкнув подпись в форме для отображения диалогового окна Проверка цифровой подписи.

  • Пользоваться преимуществами объектной модели для работы с цифровыми подписями. Добавляйте настраиваемые сведения в блок подписи форм с полным доверием, используя объектную модель цифровой подписи.

Обзор объектной модели цифровой подписи

Событие Sign

Объектная модель для цифровых подписей предоставляет следующее событие.

Имя Описание

Sign

Возникает после выбора для подписания определенного набора подписываемых данных.

Это событие можно использовать для управления данными, хранящимися внутри цифровой подписи. Например, можно добавить данные с надежного сервера метки времени или добавить серверную подпись других сторон для транзакции. Также можно использовать это событие для блокирования подписания, если текущий пользователь не входит в состав определенной группы.

Объект SignEventArgs

Обработчик событий Sign может работать с объектом событий SignEventArgs, предоставляющим следующие свойства.

Имя Описание

SignedDataBlock

Возвращает набор подписываемых данных, вызвавших событие Sign.

SignatureWizard

Возвращает или задает факт отображения диалогового окна Цифровые подписи.

ЗаметкаЗаметка

В объектной модели с управляемым кодом Microsoft.Office.Interop.InfoPath.SemiTrust, предоставляемой в InfoPath 2003, объект событий SignEvent для события OnSign предоставляет свойство XDocument для доступа к объекту XDocument формы, связанной с событием. Это необязательно для шаблонов форм, созданных в InfoPath 2007 с использованием объектной модели Microsoft.Office.InfoPath, поскольку доступ к элементам объектной модели класса XmlForm можно получить в коде формы с помощью ключевого слова this (C#) или Me (Visual Basic). Например, для доступа к свойству Signed класса XmlForm с целью определения наличия подписи для формы можно ввести this.Signed или Me.Signed.

Семейства и объекты

Объектная модель для цифровых подписей предоставляет следующие семейства.

Имя Описание

SignedDataBlockCollection

Семейство объектов SignedDataBlock в шаблоне формы, определенное во время разработки в режиме конструирования InfoPath.

Семейство SignedDataBlockCollection реализует свойства, которые могут использоваться для доступа к объектам SignedDataBlock, связанным с формой. Объект SignedDataBlockCollection, связанный с формой, доступен через свойство SignedDataBlocks класса XmlForm.

SignatureCollection

Содержит семейство объектов Signature для каждого объекта SignedDataBlock в форме.

Класс SignatureCollection реализует метод и свойства, которые можно использовать для доступа к объектам Signature, связанным с формой, а также для создания подписи. Объект SignatureCollection, связанный с SignedDataBlock, доступен через свойство Signatures.

При использовании метода CreateSignature класса SignatureCollection учитывайте, что подпись не записывается до вызова метода Sign для объекта Signature. Эти методы можно вызывать только из обработчика событий Sign в шаблоне формы с полным доверием.

Объектная модель для цифровых подписей предоставляет следующие объекты.

Имя Описание

SignedDataBlockObject

Представляет набор подписываемых данных в форме. Объект SignedDataBlock предоставляет набор свойств и один метод для программного взаимодействия с набором подписываемых данных.

SignatureObject

Представляет цифровую подпись, добавленную в форму, или набор подписываемых данных в форме. Семейство SignatureObject внедряет свойства, которые можно использовать для получения сведений о цифровой подписи, а также метод Sign для записи блока цифровой подписи XML и расчета его криптографической хеш-функции.

CertificateObject

Представляет цифровой сертификат X.509, использованный для создания подписи.

Программная работа с цифровыми подписями

Объектная модель пространства имен Microsoft.Office.InfoPath предоставляет элементы для программного взаимодействия с цифровыми подписями. В частности, формы с полным доверием могут добавлять настраиваемые сведения в блок подписи до его утверждения, в соответствии со следующей временной шкалой:

  1. Пользователь решает добавить цифровую подпись в форму.

  2. Отображается диалоговое окно Цифровые подписи, пользователь щелкает Добавить, а затем выбирает данные для подписания.

  3. Событие Sign для выбранных данных представляется созданием объекта SignedDataBlock и выполнением метода Sign семейства SignedDataBlock и метода CreateSignature семейства SignatureCollection.

  4. Все необязательные настраиваемые действия выполнены.

  5. Метод Sign семейства Signature выполнен.

  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