Compartir a través de


Mensaje SignedCms

CMS/PKCS #7 proporciona la clase SignedCms para firmar mensajes digitalmente.

La firma digital de un mensaje lo protege mediante la aplicación de servicios de seguridad conocidos como autenticación e integridad de los datos. La autenticación de entidades aumenta las probabilidades de que una entidad que afirma ser autora o remitente de un mensaje lo sea efectivamente. La entidad puede ser una persona, una aplicación de software o cualquier otro origen que tenga una identidad única.

La integridad de los datos aumenta considerablemente las posibilidades de que el mensaje no haya sido alterado de ningún modo, lo que incluye su eliminación o duplicación.

Utilice la clase SignedCms para aplicar uno de estos servicios de seguridad, o ambos, a un mensaje. Utilice esta clase si el objetivo consiste en comprobar con muchas probabilidades la autenticidad del remitente o autor de un mensaje, o bien que el mensaje no se ha modificado durante el almacenamiento o el tránsito, o en ambas etapas.

El correo electrónico, con el estándar de seguridad S/MIME, ofrece un ejemplo de cómo se puede utilizar la clase SignedCms para proporcionar seguridad. Además de otros servicios de seguridad, S/MIME especifica la capacidad de comprobar la autenticidad del remitente de un mensaje de correo electrónico, así como la integridad del propio mensaje.

Es posible aplicar varias firmas a un mensaje. Un ejemplo de aplicación en la que se puede necesitar esta capacidad sería una aplicación de creación y lectura de documentos. Dado que CMS/PKCS #7 admite varias firmas, la aplicación puede permitir que varios autores firmen un documento en cuya redacción han participado También puede permitir al lector del documento comprobar que quienes dicen ser autores de un documento lo son realmente y que el documento no se ha modificado desde que se firmó.

Utilice uno de los métodos ComputeSignature de la clase SignedCms para calcular una firma de un mensaje. El método System.Security.Cryptography.Pkcs.SignedCms.ComputeSignature(System.Security.Cryptography.Pkcs.CmsSigner) requiere que la aplicación configure primero las características del firmante del mensaje mediante la construcción de un objeto CmsSigner. La clase CmsSigner almacena el certificado X509 del firmante, además de otras propiedades. El método System.Security.Cryptography.Pkcs.SignedCms.ComputeSignature presenta un cuadro de diálogo, con el fin de que el usuario pueda seleccionar el certificado del firmante apropiado.

En la propiedad System.Security.Cryptography.Pkcs.CmsSigner.Certificates se puede incluir total o parcialmente una cadena de certificados de un firmante. Establezca la propiedad System.Security.Cryptography.Pkcs.CmsSigner.IncludeOption para determinar qué parte de la cadena de certificados se incluye.

Un mensaje SignedCms puede ser no desasociado o desasociado. La propiedad booleana System.Security.Cryptography.Pkcs.SignedCms.Detached determina si el mensaje es desasociado. Un mensaje SignedCms no desasociado contiene el mensaje que se firmó. Un mensaje SignedCms desasociado no contiene el mensaje que se firmó, aunque sí las restantes propiedades del mensaje, como las firmas y los atributos. Un ejemplo de aplicación en la que podría utilizarse un mensaje SignedCms desasociado sería una aplicación de lectura de documentos. En este caso, podría no ser deseable duplicar el almacenamiento de un documento firmado de gran tamaño almacenándolo en el mensaje SignedCms, además de hacerlo en la ubicación de almacenamiento principal. Las aplicaciones que firman contenido de gran tamaño es más probable que utilicen mensajes SignedCms desasociados.

CMS/PKCS #7 admite contrafirmas, una firma digital de otra firma digital. Como tal, sólo proporciona autenticidad de la firma, no del contenido del mensaje. Una firma digital puede ser contrafirmada por varios contrafirmantes. Sin embargo, CMS/PKCS #7 sólo admite un nivel de contrafirma. No se puede contrafirmar una contrafirma. Un ejemplo de aplicación en la que se podrían utilizar contrafirmas sería un servicio de notaría digital.

Para calcular una contrafirma, utilice uno de los métodos ComputeCounterSignature de la clase SignerInfo. La propiedad System.Security.Cryptography.Pkcs.SignedCms.SignerInfos es una colección de objetos SignerInfo resultantes de la firma de un mensaje. Los métodos ComputeCounterSignature funcionan de forma similar a los métodos ComputeSignature de la clase SignedCms.

Un mensaje SignedCms puede tener asociados atributos específicos de firma, que pueden estar firmados o sin firmar.

Los atributos firmados se colocan en el mensaje estableciéndolos en la propiedad System.Security.Cryptography.Pkcs.CmsSigner.SignedAttributes del firmante apropiado. Cuando se calcula una firma para ese firmante, los atributos firmados se firman junto con el contenido interno de la propiedad System.Security.Cryptography.Pkcs.SignedCms.ContentInfo. Los atributos firmados están disponibles después de que el mensaje haya sido firmado en la propiedad System.Security.Cryptography.Pkcs.SignerInfo.SignedAttributes para el firmante aplicable de la propiedad System.Security.Cryptography.Pkcs.SignedCms.SignerInfos. Un ejemplo de atributo firmado que podría resultar de utilidad es el atributo de hora de firma Pkcs9SigningTime. Este atributo contiene la hora a la que se firmó el mensaje.

Para colocar atributos no firmados en el mensaje, se establecen en la propiedad System.Security.Cryptography.Pkcs.CmsSigner.UnsignedAttributes del firmante apropiado. Al no estar firmados, no se puede asumir la autenticidad o integridad de estos atributos. Los atributos no firmados están disponibles después de que el mensaje haya sido firmado en la propiedad System.Security.Cryptography.Pkcs.SignerInfo.UnsignedAttributes para el firmante aplicable de la propiedad System.Security.Cryptography.Pkcs.SignedCms.SignerInfos. Un ejemplo de atributo no firmado que CMS/PKCS #7 utiliza internamente es una contrafirma Dado que ya es un tipo de firma, no es necesario que se firme de nuevo Otro ejemplo de atributo que podría quedar sin firmar es una descripción de documento, disponible en la clase Pkcs9DocumentDescription.

Utilice uno de los métodos CheckSignature de la clase SignedCms para comprobar las firmas y las contrafirmas de los mensajes, así como los atributos firmados. El mensaje SignedCms contiene los certificados de los firmantes necesarios para la comprobación. La comprobación de la firma puede validar o no los certificados de los firmantes, según determine el valor del parámetro verifySignatureOnly para estos métodos.

Para comprobar un mensaje SignedCms desasociado, asocie primero el contenido del mensaje con el mensaje SignedCms. Para ello, cree un objeto ContentInfo con el contenido del mensaje. Utilícelo para crear un objeto SignedCms mediante el constructor SignedCms, por ejemplo. Establezca el segundo parámetro en true para indicar que el mensaje es desasociado. Descodifique el mensaje SignedCms codificado para que se compruebe con el método Decode. Por último, compruebe la firma según se ha descrito anteriormente.

Para ver varios ejemplos de código que utilizan mensajes SignedCms, vea Uso de System.Security.Cryptography.Pkcs.

Consulte también

Tareas

Cómo firmar mensajes con un firmante
Cómo firmar un mensaje con varios firmantes
Cómo contrafirmar un mensaje

Referencia

CmsSigner
SignedCms
SignerInfo

Conceptos

Cómo firmar y envolver mensajes
Tipos de mensajes CMS/PKCS #7

Copyright © 2007 Microsoft Corporation. Reservados todos los derechos.