Cómo: Trabajar con firmas digitales
El modelo de objetos del espacio de nombres Microsoft.Office.InfoPath ofrece características para trabajar con firmas digitales mediante programación.
Características de las firmas digitales
Las características de firmas digitales que proporciona InfoPath permiten:
Habilitar las firmas para todo el formulario o para conjuntos específicos de datos del formulario que se puedan firmar por separado.
Especificar, por cada conjunto de datos que se pueda firmar, si se permiten una o varias firmas y la relación que tendrán. Por ejemplo, puede indicar si son cofirmas en paralelo o si cada nueva firma contrafirma todas las anteriores.
Especificar un mensaje que se va a mostrar a los usuarios del formulario cuando lo firmen.
Insertar y ver una firma en el documento.
Ver la información de no incumplimiento comprobable que se ha añadido a cada firma para incrementar la seguridad. Esta información adicional, que incluye una vista del formulario tal como se ha presentado a cada firmante, es una parte de la firma y no se puede quitar sin invalidar ésta. En cualquier momento, puede recuperar estos datos haciendo clic en la firma del formulario para mostrar el cuadro de diálogo Comprobar firma digital.
Sacar partido de un modelo de objetos para trabajar con firmas digitales. Añadir información personalizada al bloque de la firma de los formularios de plena confianza mediante el modelo de objetos de firmas digitales.
Información general sobre el modelo de objetos de firmas digitales
Evento Sign
El modelo de objetos de firmas digitales proporciona el siguiente evento.
Nombre | Descripción |
---|---|
Se produce después de seleccionar un conjunto de datos para firmarlos. Puede utilizar este evento para manipular los datos almacenados en la firma digital. Por ejemplo, se pueden agregar datos de un servidor de marca de hora de confianza o agregar una contrafirma de servidor de la transacción. Asimismo, se puede usar este evento para bloquear la firma si el usuario actual no es integrante de un grupo determinado. |
Objeto SignEventArgs
Un controlador de eventos para el evento Sign puede funcionar con el objeto del evento SignEventArgs, que proporciona las siguientes propiedades.
Nombre | Descripción |
---|---|
Obtiene el conjunto de datos que se puede firmar que provocó el evento Sign. |
|
Obtiene o establece información sobre si se debe mostrar el cuadro de diálogo Firmas digitales. |
Nota: |
---|
En el modelo de objetos de código administrado Microsoft.Office.Interop.InfoPath.SemiTrust que acompañaba a InfoPath 2003, el objeto de evento para el evento SignEventOnSign proporciona una propiedad XDocument para tener acceso al objeto XDocument del formulario asociado con el evento. Esto no es necesario con las plantillas de formulario creadas con el modelo de objetos Microsoft.Office.InfoPath porque puede tener acceso a los miembros del modelo de objetos de la clase XmlForm en el código de formulario usando la palabra clave this (C#) o Me (Visual Basic). Por ejemplo, para tener acceso a la propiedad Signed de la clase XmlForm para determinar si un formulario está firmado, puede escribir |
Colecciones y objetos
El modelo de objetos de firmas digitales proporciona las siguientes colecciones.
Nombre | Descripción |
---|---|
La colección de objetos SignedDataBlock en la plantilla de formulario según se define en tiempo de diseño en el modo de diseño de InfoPath. La colección SignedDataBlockCollection implementa propiedades que se pueden usar para obtener acceso a los objetos SignedDataBlock asociados con un formulario. Se puede obtener acceso al objeto SignedDataBlockCollection asociado con un formulario mediante la propiedad SignedDataBlocks de la clase XmlForm. |
|
Contiene la colección de objetos Signature para cada objeto SignedDataBlock del formulario. La clase SignatureCollection implementa propiedades y un método que se puede usar para tener acceso a los objetos Signature asociados al formulario y para crear una firma. Al objeto SignatureCollection asociado con un SignedDataBlock se tiene acceso usando la propiedad Signatures. Cuando utilice el método CreateSignature de la clase SignatureCollection, tenga en cuenta que la firma no se escribe hasta que se llama al método Sign en el objeto Signature. Sólo se puede llamar a estos métodos desde el controlador de eventos Sign de una plantilla de formulario de plena confianza. |
El modelo de objetos de firmas digitales proporciona los siguientes objetos.
Nombre | Descripción |
---|---|
Representa un conjunto de datos que se pueden firmar en un formulario. El objeto SignedDataBlock proporciona una serie de propiedades y un método que se pueden usar para interactuar mediante programación con un conjunto de datos que se pueden firmar. |
|
Representa una firma digital añadida a un formulario o a un conjunto de datos que se pueden firmar de un formulario. La colección SignatureObject implementa propiedades que se pueden utilizar para recuperar información sobre la firma digital y el método Sign para escribir el bloque de firma digital XML y computar su valor hash digital cifrado. |
|
Representa el certificado digital X.509 utilizado para crear la firma. |
Trabajar con firmas digitales mediante programación
El modelo de objetos del espacio de nombres Microsoft.Office.InfoPath ofrece miembros para interactuar con las firmas digitales mediante programación. Concretamente, los formularios de plena confianza pueden añadir información personalizada al bloque de la firma antes de confirmarlo, de acuerdo con la siguiente escala de tiempo:
El usuario elige añadir una firma digital a un formulario.
Se muestra el cuadro de diálogo Firmas digitales, el usuario hace clic en Agregar y, después, selecciona los datos que se van a firmar.
Se inicia el evento Sign de los datos seleccionados que representa el objeto SignedDataBlock, y se ejecutan los métodos Sign de SignedDataBlock y CreateSignature de SignatureCollection.
Se ejecutan todas las acciones personalizadas opcionales.
Se ejecuta el método Sign de Signature.
El cuadro de diálogo Firmar se muestra para escribir un nombre (o seleccionar una imagen de firma), seleccionar un certificado con el que firmar y escribir comentarios.
Cuando se hace clic en el botón Firmar, la firma se agrega a la colección de firmas del formulario y la información de no incumplimiento se capta y se guarda con la firma (que se puede ver más adelante haciendo clic en Ver formulario firmado en el cuadro de diálogo Firmas digitales y, después, haciendo clic enConsultar la información de firma adicional que se recopiló).
En el ejemplo siguiente, se llama al método Sign cuando un usuario firma los datos seleccionados y se contrafirma la firma con un valor de marca de hora recuperado de un servicio de marca de hora de confianza
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