SignedCms 邮件

CMS/PKCS #7 提供 SignedCms 类来为邮件进行数字签名。

通过为邮件进行数字签名,可以应用称为实体“身份验证”**和数据“完整性”**的安全服务来保护邮件。通过实体身份验证可提高声明是邮件作者或发件人的实体的真实性概率。实体可以是个人、软件应用程序或其他任何具有唯一标识的源。

通过数据完整性可高度确保邮件本身未通过任何方式(包括删除或复制)进行更改。

使用 SignedCms 类可以将这两种安全服务的任意一种或全部两种应用于邮件。如果目标是可高度验证邮件发件人或作者的真实性,或确定邮件在存储或传输时未被修改,或同时为这两者,请使用此类。

使用 S/MIME 安全标准的电子邮件是一个说明如何使用 SignedCms 类提供安全性的示例。除了其他安全服务之外,S/MIME 还指定验证电子邮件发件人的真实性以及检查邮件本身的完整性的能力。

可以将多个签名应用于一封邮件。文档创作和读取应用程序就是可能需要此功能的应用程序的示例。由于 CMS/PKCS #7 支持多个签名,因此,应用程序可以允许多个文档作者均对他们参与撰写的文档进行签名。还可以允许文档读者验证声称的作者是不是文档的真正作者,以及文档在签名后是否未被修改。

可以使用 SignedCms 类的 ComputeSignature 方法之一计算邮件签名。System.Security.Cryptography.Pkcs.SignedCms.ComputeSignature(System.Security.Cryptography.Pkcs.CmsSigner) 方法要求应用程序先通过构造 CmsSigner 对象来设置邮件签名者的特征。CmsSigner 类存储签名者的 X509 证书以及其他属性。System.Security.Cryptography.Pkcs.SignedCms.ComputeSignature 方法提供一个对话框,使用户可以选择相应签名者的证书。

签名者的证书链可以全部或部分包含在 System.Security.Cryptography.Pkcs.CmsSigner.Certificates 属性中。通过设置 System.Security.Cryptography.Pkcs.CmsSigner.IncludeOption 属性来影响包含证书链的多少内容。

SignedCms 邮件可以是“非分离式”,也可以是“分离式”。布尔属性 System.Security.Cryptography.Pkcs.SignedCms.Detached 确定是否分离邮件。非分离式 SignedCms 邮件包含已签名的邮件。分离式 SignedCms 邮件不包含已签名的邮件,但是包含邮件的所有其他属性,例如签名和特性。文档读取应用程序就是可能使用分离式 SignedCms 邮件的应用程序的示例。在这种情况下,可能不希望大的签名文档除了存储在主要存储位置之外,还重复存储在 SignedCms 邮件中。为较大的内容签名的应用程序最有可能使用分离式 SignedCms 邮件。

CMS/PKCS #7 支持“副署”**。副署是另一个数字签名的数字签名。在这种情况下,只提供签名的真实性,而不提供邮件内容的真实性。数字签名可以由多个副签署者进行副署。但是,CMS/PKCS #7 只支持一个副署级别。不能对副署本身进行副署。数字公证人服务就是可能使用副署的应用程序示例。

可以使用 SignerInfo 类的 ComputeCounterSignature 方法之一计算副署。System.Security.Cryptography.Pkcs.SignedCms.SignerInfos 属性是为邮件签名所生成的 SignerInfo 对象的集合。ComputeCounterSignature 方法的用法类似于 SignedCms 类的 ComputeSignature 方法。

SignedCms 邮件可以具有关联的签名特定的属性。这些属性可以签名,也可以不签名。

通过在相应签名者的 System.Security.Cryptography.Pkcs.CmsSigner.SignedAttributes 属性中进行设置,可以将签名特性放置在邮件中。在计算该签名者的签名时,签名特性与 System.Security.Cryptography.Pkcs.SignedCms.ContentInfo 属性中的内部内容一同进行签名。邮件在 System.Security.Cryptography.Pkcs.SignerInfo.SignedAttributes 属性中的相应签名者的 System.Security.Cryptography.Pkcs.SignedCms.SignerInfos 属性中进行签名后,签名特性即可用。Pkcs9SigningTime 签名时间属性就是可能使用的签名属性的示例。此属性包含邮件的签名时间。

通过在相应签名者的 System.Security.Cryptography.Pkcs.CmsSigner.UnsignedAttributes 属性中进行设置,可以将未签名特性放置在邮件中。这些属性未签名,因此不能假定它们具有真实性或完整性。邮件在 System.Security.Cryptography.Pkcs.SignerInfo.UnsignedAttributes 属性中的相应签名者的 System.Security.Cryptography.Pkcs.SignedCms.SignerInfos 属性中进行签名后,未签名特性即可用。副署就是 CMS/PKCS #7 在内部使用的未签名属性的示例。由于副署已是一种签名,因此不需要再次签名。Pkcs9DocumentDescription 类中的文档说明是可能保持不签名属性的另一个示例。

可以使用 SignedCms 类的 CheckSignature 方法之一验证邮件签名、副署和签名属性。SignedCms 邮件包含验证所需的签名者证书。签名验证可否验证签名者证书,取决于这些方法的 verifySignatureOnly 参数的值。

要验证分离式 SignedCms 邮件,请先将邮件的内容与 SignedCms 邮件相关联。通过构造包含邮件内容的 ContentInfo 对象可以实现此目的。使用该方法构造一个 SignedCms 对象,例如通过使用 SignedCms 构造函数。将第二个参数设置为 true,指示该邮件为分离式邮件。使用 Decode 方法对要验证的编码 SignedCms 邮件进行解码。最后,按照前面所述检查签名。

有关使用 SignedCms 邮件的一些代码示例,请参阅使用 System.Security.Cryptography.Pkcs

请参见

任务

如何:由一个签名者为邮件签名
如何:由多个签名者为邮件签名
如何:对邮件进行副署

参考

CmsSigner
SignedCms
SignerInfo

概念

如何:签名和封装邮件
CMS/PKCS #7 邮件的类型

Footer image

版权所有 (C) 2007 Microsoft Corporation。保留所有权利。