Digital Signing Framework of the Open Packing Conventions (Open Packing Conventions的数字签名框架)
大家好..
这一遍文章是介绍在OPC中的数字签名框架的,我们都知道 microsoft现在文档标准有两个,一个是office2007上用的Open XML Format,和 XML Paper Specification 而XPS是使用的Open Packing Conventions做为约定的, Open Packaging Conventions 的规范基于 ZIP 文件,在该文件之上是部件/关系抽象,然后是使您可以访问 ZIP 文件的服务,这个协议还规定包可以由任何应用程序使用,并且目前有多个实现,Open Packaging Convention API是在 System.IO.Packaging 命名空间中,大家可以通过这调用API实现很多服务,其中就有数字签名,数字签名提供一种验证签名用于识别用户保证内容在被签名后未发生更改但并不是给文档加密或完全锁定,终段用户可以查看签名并支持最终用户的拒绝需要。它可以用于所有 Open Packaging Convention 格式的文档,而Digital Signing Framework主要是在OPC下为创建数字签名和验证数字签名而服务,在这里我们也只讨论在Digital Signing Framework先的方式.(这里有数字签名和安全性更多的 内容)下面让我们进入这篇文章:
小小的翻译约定:
1 Signing:签署(并不是注册,但和注册差不多一个意思,也是为文章通顺)
2 signing policies:签署策略.
3 Signing Parts与XXXXX part: 都不翻译(因为文章中很多翻译后容易混淆.在这里part也就是大家熟悉的"部件")
4 Relationships:不翻译,它是制和Singing part一起出现描述签署策略.
5带红线:是我写的注释,就是自己的一理解。
还有就是翻译中有什么问题,请指正.谢谢...
Digital Signing Framework of the Open Packing Conventions (Open Packing Conventions的数字签名框架)
David Meltzer and Andrey Shur
Microsoft Corporation
September 2006
Applies to:
OPC Digital Signing Framework
W3C XML Digital Signature standard
Microsoft .NET 3.0 Framework
Summary: 讨论OPC的数字签名框架,提供一个包的组件和支持服务的一览,和签名策略事例.
Contents
Introduction(介绍)
Components of the OPC Digital Signing Framework(OPC的数字签署框架的组件)
The XML Digital Signature Standard(基于XML的数字签名标准)
Representing Digital Signatures in Packages(在包中表示数字签名)
Signing Parts and Relationships(Signing Parts与Relationships)
Programming Support for Package Signatures(编程支持包中签名)
Signing Package Parts and Relationships(Signing Package Parts与Relationships)
Verifying Certificates and Signatures(效验证书和签名)
Application Signing Policy(应用程序签署策略)
XPS Documents
Programming Support for XPS Signatures(编程支持XPS Signatures)
References(参考)
一 Introduction
包的模型就是用Open Packaging Conventions (OPC) 描述packages,parts(Signing part..等) 和relationships.包中有多个部件(part),部件中是内容(content)和资源(resources).Relationships是被定义用来连接包中多个不同部件的关系.
本文章讨论OPC Digital Signing Framework,提供一个包的组件和支持的服务的一览,和签署策略事例和它的实现.
Signing Framework包括一个为描绘数字签名的底层结构,和为创建和验证签名而服务. Signing Framework允许W3C XML 数字签名的标准应用于包中部件和relationships.
使用Signing Framework,包含有自己的package-based formats的定义和执行"signing policies"时明确指出他们的格式,本(policies)策略是指怎样签署和验证完整的内容格式.并具体表达签名使用在不同的工作流程中,实际上,一个单独的格式有可能在一个文档生命周期不同场景中被多个政策(policies)所定义.
签署策略是为 在package-based format上根据signing parts和relationships,和有可能用在其文档的特有的特征(这里主要是用于他们两上)(就像去验证:显示设计,颜色深度,或应用程序版样)来表达这个文档。一个签署策略详细在 一个文档组件中有注册签名和不注册签名(注意"和").例如一个签名策略能被允许执行新签名部件和relationships被添加到包中,或如果新的签名部件或签名被添加进一个包中时使用另一种签名策略就会引起签名无效.(关键上面那句话)
This article assumes familiarity with the Open Packaging Conventions Specification and the W3C Recommendation XML-Signature Syntax and Processing.
二 Components of the OPC Digital Signing Framework (OPC的数字签名框架的组件)
1:The XML Digital Signature Standard(基于XML的数字签名标准)
Signing Framework 的包使用基于XML的数字签名标准;这个标准是定义在XML-Signature Syntax and Processing(以这为标准)推存指定使用XML 语法和处理规则来提供和存储数字签名.
这个标准为任何一种数字资源签署和验证.定义一个XML签名元素类型,schema并为签署和验证任何一个数字签名资源提供有一致的需求,这个schema还为引用资源和与数字签名有关的算方定义元素.
2:Features of digital signatures(数字签名的新特性)
一个数字签名能否使用决定于已经被签署的内容是否改变,数字签名包含一个内容列表(manifest),这个内容列表是"hash",hash在创建数字签名时是依照"hash" 众所周知的算法和来存储.如果内容已经改变,这个"hash"会比较之前存储的数字签名并重新创建这个数字签名"hash".
一个数字签名使用还要能识别本内容的签署者,这个签名者的标识是用一个关于数字签名的证书来识别.这个证书能嵌入在数字签名中,或放在别处(之后会谈到).
一个数字签名不能锁定(lock)文档或引起文档变成加密文档(尽管文档已经被加密).文档内容在被签名后是不会变化的,数字签名没有预防被签署的内容被消费者查看.
3:Representing Digital Signatures in Packages(在包中表示数字签名)
应用程序合并数字签名在包中使用一个指定的配置来配置part(因为在包中很多part) 和 relationships.
这个Signing Framework使用元素和attribute都来于包的命名空间,包的命名空间是按照 XML Digital Signature 标准.而数字签名元素被定义于在支持包详细规格新特性下包的命名空间中(package- specific features),扩充标准并没有使他们矛盾,另外的详细的可以的看 "Modifications to the XML Digital Signature Specification" of the OPC Specification.
package parts定义在Signing Framework 是Origin Part 中,XML Signature Part,和Certificate Part,各自有一个明确定义的内容类型.明确定义关联类型被用来为连接在包中的签名parts.指定一个附带"H",OPC Specification的标准命名空间和内容类型 ("StandardNamespaces and Content Types," of the OPC Specification.).
4:Digital Signature Origin Part (数字签名源部件)
Digital Signature Origin Part 是整个数字签名包的最初点,Digital Signature Origin Part的目标接点是包的父接点使用的 Digital Signature Origin relationship. Multiple Signature parts 也来于 Origin part.如果包中没有签名那也就没有Origin part.
5: Digital Signature XML Signature Part(数字签名XML签名部分)
Digital Signature XML Signature Part 内容标签被定义在W3C数字签名标准又在包命名空间中,这个Parts是来于Digital Signature Origin part XML关于 Digital Signature relationship(关联).
6:Digital Signature Certificate Part(数字签名证书部件)
X.509 证书须要识别签名者,如果将证书放置在包中,可以嵌入到XML数字签名part的内部,或被存储在个别的 Certificate part中,可选 Certificate part被标识于XML Signature part与Digital Signature Certificate关联. Certificate part可被多个Signature part共享.
7:Custom Signature Parts(自定义数字签名部件)
自定义(application-specific)签名部件被提供许可,但 SigningFramework不提供句柄(but not handled, by the Signing Framework),一个签名部件是持有一个其他的被一个自定义内容类型定义的XML signatrue,另为relationship一个自定义ralationship类型必须使用来于Digital Signature Orign part.
三 Signing Parts and Relationship(签署部件和Relationship)
XML Digital Signature 标准允许为一个包多个部件设置签名资源地址,只Signing Framework中受权多个部件的签署. relationship在包中的,也被保存在一个 relationship part中,能立刻被签名或一个relationships的子集能被指定签名.
一个部件的内容类型被签署, 连同部件内容一起被确保在一个正确的被签署包下使用或返回,因为内容类型没有一个设置地址资源,package- specific的方式是带上一个签名内容类型的值,当包被签名时,每一个签名的内容类型部件被存储在一个能通过URL中,并引入到被签名部件的查询组件中,当包被消除时候,OPC Digital Signing Framework 使用内容类型的值来确保部件的内容类型在这个部件被签名前不会改变.
当ralatonship part 被签署,所有的relationships被定义在被签署后的ralatonship part中,支持的签署策略是允许一个没有无效签名包中的一些内容改换,在 Sigining Framework 提供一个机制为签署指定一个.签署被指定一个relationships关联后, Signing Framework 使用专门的转换,Relationships Transform,关于 Relationships Transform可以看(Transform Algorithms)
Relationships Transform 创建一个 relationships part包含指定relationships的关系,为在签名时和在签名验证时,获得使用一个relaionships part.
四: Programming Support for Package Signature(编程支持包中签名)
签署和验证数字签名,应用程序能使用.NET 3.0 类 PackageDigitalSignatureManager,包的特性类被定义在System.IO.Packaging命名空间中,构件一个在 Microsoft .NET 3.0 Framework的数字签名类被定义在System.Security.Cryptography.Xml命名空间中.
PackageDigitalSigntureManager 类被使用为创建和验证签名,和在包中显示(placing)签名下部结构.而签名被一个对象PackageDigitalSignature类所描述.
五: Signing Package Parts and Relationships(Signing Parts与Relationships)
一个应用程序定义一个parts的列表和relationship去按照它的签署策略来签署,这个应用程序于是调用 PackageDigitalSignatureManager.Sign()方法创建签名和添加签名结构进入包中.
这个事例代码示范在包中签署所有的部件,除 relationships parts,签署当前全部relationships都是起源于包的根接点,和嵌入证书被使用于标记在XML签名部件中.这个实例代码是假设一开始没有签名存在在包中,并且只有一个签名被应用于在之前被确认.
1 :Beginning the Signing Process(开始签署进程)
开始工作在签名在包中,首先创建一个PackageDigitalSignatureManager,如下面代码:
Package package = Package.Open(filename);
![](/Images/OutliningIndicators/None.gif)
// Create the PackageDigitalSignatureManager
PackageDigitalSignatureManager dsm =
new PackageDigitalSignatureManager(package);
2:证书嵌入选项
一个证书可以就像任一个字符串嵌入在自己的签名中,就像包中的separate part样,或在包以外的资源.如果证书是被放置在包的内部,一个应用程序为证书使用嵌入 PackageDigitalSignature.CertificateOption的属性的选项.之后创建 PackageDigitalSignatureManager类,为证书设置嵌入式选项.代码如下:
//Specify that the certificate is embedded in the signature held
//in the XML Signature part.
![](/Images/OutliningIndicators/None.gif)
//Certificate embedding options include:
// InSignaturePart – Certificate is embedded in the signature.
// InCertificatePart – Certificate is embedded in a
// separate certificate part
![](/Images/OutliningIndicators/None.gif)
dsm.CertificateOption =
CertificateEmbeddingOption.InSignaturePart;
3:Signed Parts List(签署部件列表)
签署部件清单是指使用URIs 地址的部件.在这个事例中,所有部件在包中除非relationshops part 外都被签署,被过滤出是使用 PackUriHelper.IsRelationshipPartUri()方法:
System.Collections.Generic.List<Uri> partsToSign =
new System.Collections.Generic.List<Uri>();
![](/Images/OutliningIndicators/None.gif)
//Add each part to the list, except relationships parts.
foreach (PackagePart packagePart in package.GetParts())
{
if (!PackUriHelper.IsRelationshipPartUri(packagePart.Uri))
partsToSign.Add(packagePart.Uri);
}
4:Signed Relationships List(被签署的关联列表)
个别的relationships 被签署时可使用Relationships Transform.签署relationships时,这个方法允许新的relationships添加进入没有无效签名的包中.
Relationships 被选中和签署相互关联时,一个PackageRelationshipSelector对象的列表将创建并被使用来和签署关联. PackageRelationshipSelector对象能被relationship类型中被创建在一个组中 (as defined in section "Standard Namespaces and Content Types" of the Open Packaging Conventions), 或被指定的relationship id创建,如下代码:
//Create list of selectors for the list of relationships
![](/Images/OutliningIndicators/None.gif)
List<PackageRelationshipSelector> relationshipSelectors =
new List<PackageRelationshipSelector>();
![](/Images/OutliningIndicators/None.gif)
//Create one selector for each package-level relationship, based on id
![](/Images/OutliningIndicators/None.gif)
foreach (PackageRelationship relationship in package.GetRelationships())
{
relationshipSelectors.Add(new
PackageRelationshipSelector(relationship.sourceUri,
PackageRelationshipSelectorType.Id, relationship.Id));
}
当创建一个PackageRelationshipSelector关于PackageRelationshipSelectorType.Id时,这一个 relationship就已经有标识id指定被选中的签名.当创建一个选者器 PackageRelationshipSelectorType.Type时,所有的 relationship的类型就是选者器所指向的签名.如果同一类型的relationships被添加到同一包中,对签名无效.
5:Creating the Certificate Object(创建数字证书对象)
之前谈的是签名,一个有效X.509 证书的是被System.Security.Cryptography.X509Certificates.X509Certificate2对象初试化后才能获得,这个对象在签署时候传递给PackageDigitalSignatureManager.Sign()方法,创建数字证书对象的更多信息请看System.Security.Cryptography.X509Certificates命名空间.
6:Applying the Signature(申请签名)
创建一个部件清单和relationships和签署关联,和获得数字证书对象后,现在来创建 PackageDigitalSignatureManager.Sign() 方法.
//Sign package using components created above
![](/Images/OutliningIndicators/None.gif)
PackageDigitalSignature signature = dsm.Sign(partsToSign,
x509Certificate, relationshipSelectors);
![](/Images/OutliningIndicators/None.gif)
//After signing, close the package.
//The signature will be persisted in the package.
package.Close();
当调用Sign()方法时, "hash"被产生和存储在签名清单中,并signature part被创建.如果签名结构已经存在当前包中,一个新的 signature part将被添加(如果允许添加的情况),如果下部结构没有已经存在包中,Sign()方法创建签名结构和放置签名在包中.
7:Verifying Certificates and Signatures(核实证书和签名)
应用程序能验证一个证书和签名时,之前是验证签名,证书也要验证,描述签名的对象是在包中的PackageDigitalSignature,已经一个属性 "Signer"这个属性返回为签名所创建的证书,如果证书没被嵌入包中,应用程序获得证书就要知道应用程序的位置.
PackageDigitalSignatureManager.VerifyCertificate()方法是用来验证已获得的证书,效验证书的结构,终止日期和一系列状态.还要更多的关于这一系列状态可以看在.net Framework 类库中的X509ChainStatusFlag Enumeration.
应用程序开发者能使用证书状态来支持他们签署政策.事例是一个应用程序能指定在确定日期是合适后就将证书被发行.
PackageDigitalSignatureManager.VerifySignatures()方法使用来验证所有在包中的签名的.这个方法只验证签名,不验证和签名关联的证书.
在下面事例代码是用来验证在被放置在包中的证书和签名.这些代码是假设没有其他签名已经被添加到包中的情形.
// Open the package.
![](/Images/OutliningIndicators/None.gif)
Package package = Package.Open(filename);
![](/Images/OutliningIndicators/None.gif)
// Create the PackageDigitalSignatureManager
![](/Images/OutliningIndicators/None.gif)
PackageDigitalSignatureManager dsm =
new PackageDigitalSignatureManager(package);
![](/Images/OutliningIndicators/None.gif)
// Verify the collection of certificates in the package (one, in this case)
![](/Images/OutliningIndicators/None.gif)
foreach(PackageDigitalSignature signature in pdsm.Signatures)
{
if(PackageDigitalSignatureManager.VerifyCertificate(signature.Signer)
!= X509ChainStatusFlags.NoError)
{
// Application-specific code for error handling
// or certificate validation
}
}
// For this example, if all certificates are valid,
// verify all signatures in the package.
VerifyResult vResult = dsm.VerifySignatures(false);
Console.WriteLine("Result " + vResult.ToString());
![](/Images/OutliningIndicators/None.gif)
// Close the package.
![](/Images/OutliningIndicators/None.gif)
package.Close();
六 Application Signing Policy(应用程序签署策略)
应用程序可以使用package-based formats 定义他们自己的像 Signing Framework中部件(像签名部件)样的策略.这个策略是被元素类型和 格式的工作流程需要所决定的.在上面的部分中签署策略 (signing policy这里只的是应用程序的签名策略)是描述的都是一个格式Microsoft package-based format: the XPS Document format.
七 XPS Documents
XPS Document format 是基于Open Packaging Conventions的,详细描述在 XML Paper Specification.XML Paper Specification是为签署 XPS Doucment定义策略,在策略内有签署选项可以于支持应用程序新特性或工作流.
1:Signing Policy for XPS Document Packages(签署策略为XPS Document 包)
XPS Document 签署策略描述多个部件的设置和relationships因为都被签名后所以内容都要被验证,这是本策略的一个部件,一个应用程序可能创建一个可以包含的多个细小部件的混合的签名附加到内容中,例如CoreProperties part,签署这些部件将预防它们变换成无效的签名,另外,应用程序可能可以签署relationships部件并放进在包中的Digital Signature Origin part中,禁止新的签名被添加到文档,免产生无效的签名.
为一个签名被验证,这个XPS Document签署策略需要在签名中确定部件和relationships.当校验一个签名,不可能有未被承认的部件和被签署的relationships,所以一个应用程序必须确定所需要的部件和relationships被注册.
2:XPS Document Parts to Sign(XPS Document Parts的签署)
下面是一个表,表主要内容是,在XPS Document中必须被注册的部件和可选注册部件清单,在relationships方面,XPS注册策略指定注册relationships必须是按照OPC-defined Relationships的形式,如果一个本部件被注册,relationships 必须被注册.
Part Type Policy
FixedDocumentSequence part Must be signed
FixedDocument part Must be signed
DocumentStructure parts Must be signed
SignatureDefinitions part Must be signed
FixedPage parts Must be signed
Required resource parts (such as fonts, images) Must be signed
StoryFragments parts Must be signed
Thumbnail parts Must be signed
CoreProperties part Optionally signed
Digital Signature Origin part Optionally signed
Digital Signature Certificate part Optionally signed
PrintTicket parts Optionally signed
DiscardControl parts Optionally signed
关于更多XPS签署政策,看在XML Paper Specification中的"XPS Document Package Features: Digital Signatures: Signing Rules".
3:Markup Compatibility Signing Policy(标记兼容签署策略)
XML Paper Specification 描述在XPS Document中包含是一个交替的内容:标记兼容性.交替的内容是被放入标记(Markup)兼容性命名空间的元素中.按照这个策略, XPS Documents 中已有的标记兼容性元素和属性不能被正当的签署,除非注册程序承认所有交替项内容相等.只有这样XPS Document包含的元素和属性被承认能被注册或被验证.
1:Countersignatures(多签名)
一个文档的内容能适用一个或多个签名.例如内容表现是一个合法契约,可能会有几个人申请他们的签名,指示内容被签署和签署者的标识.
添加一个新的签名总要创建一个新的relationships在relationships part内并将relationships part放入在 Digital Signature Origin part中,为了添加新标签到一个XPSDocument中的XPSDocument中的当前签名将无效,这个relatioinships part必须保持非签署(尽管是子集的relationships可能被签署).如果 relationships part被包含在一个数字签名,数字签名将会被随后追加的签名使之无效.
2:Validating XPS Signatures(验证XPS签名)
除定义一个签名外,XPS签署政策还指定怎样校验一个有效签名,本策略为一个签名定义有效状态,包含incompliant, broken, questionable, and valid,如下表:
======================================================================================
========================================================================================================
XPS Viewer会显示questionable和 broken状态的XPS 签名,还有valid XPS signatures. 而Incompliant signatures是不能列举的.
八:Programming Support for XPS Signatures(编程支持XPS Signatures)
当一个XPS Document正在工作时,应用程序能使用XpsDigitalSignature类中的方法.这个类的基于是PackageDigitalSignature;类和包括遵循在XPS Digital Signature Specification中的需求和算法的方法.签署和验证方法校验必须部分和XPS Document被签署的relationships.
1 Signing an XPS Document(在一个XPS Document签署签名)
XpsDocument.SignDigitally()方法被使用来在一个XPS Document签署签名.在调用的方法之前, 一个应用程序必须有一个X.509 certificate,要使用这个证书就要使用System.Security.Cryptography.X509Certificates.X509Certificate2的对象.
// Open the XPS Document
![](/Images/OutliningIndicators/None.gif)
XpsDocument document = new XpsDocument(dstContainer,
FileAccess.ReadWrite);
![](/Images/OutliningIndicators/None.gif)
// Obtain the certificate object from a file
![](/Images/OutliningIndicators/None.gif)
X509Certificate certificate =
509Certificate.CreateFromCertFile(certFilename);
![](/Images/OutliningIndicators/None.gif)
// Create the signature and add it to the document using
// the OPC Signing Framework
![](/Images/OutliningIndicators/None.gif)
document.SignDigitally(certificate, true,
XpsDigSigPartAlteringRestrictions.None);
XpsDigSigPartAlteringRestrictions 能被使用来限制签名,基于一个签署策略的.这个参数指是否排斥CoreMetadata或签名中的SignatureOrigin parts.排斥这两部分能让签名无效果.例如排斥 CoreMetadata部件,应用程序改变文档的签名为无效.
能使用签名被创造时的SignDigitally()方法来排斥PrintTicket和DiscardControl两部分.尽管这些部分在构件应用程序签名时是可选的.
2:Verifying an XPS Document Signature(校验一个XPS Document 签名)
一个或多个签名能被保存在一个XPS Document中,能从 XpsDocument.Signatures属性获得这些签名.签名被XpsDigitalSignature对象的实例所表现.
在下列事例中,只有在集合中的第一个签名的验证.
foreach (XpsDigitalSignature digitalSignature in
document.Signatures)
{
// Verify the signature object, if present.
![](/Images/OutliningIndicators/InBlock.gif)
if (digitalSignature.Verify() ==
System.IO.Packaging.PackageDigitalSignature.VerifyResult.Success)
{
//Signature is valid
}
}
九:参考
* Open Packaging Conventions Specification
* W3C Recommendation, XML-Signature Syntax and Processing
* XML Paper Specification
--------------------------------------worksguo(翻译)----------------------------
这一遍文章是介绍在OPC中的数字签名框架的,我们都知道 microsoft现在文档标准有两个,一个是office2007上用的Open XML Format,和 XML Paper Specification 而XPS是使用的Open Packing Conventions做为约定的, Open Packaging Conventions 的规范基于 ZIP 文件,在该文件之上是部件/关系抽象,然后是使您可以访问 ZIP 文件的服务,这个协议还规定包可以由任何应用程序使用,并且目前有多个实现,Open Packaging Convention API是在 System.IO.Packaging 命名空间中,大家可以通过这调用API实现很多服务,其中就有数字签名,数字签名提供一种验证签名用于识别用户保证内容在被签名后未发生更改但并不是给文档加密或完全锁定,终段用户可以查看签名并支持最终用户的拒绝需要。它可以用于所有 Open Packaging Convention 格式的文档,而Digital Signing Framework主要是在OPC下为创建数字签名和验证数字签名而服务,在这里我们也只讨论在Digital Signing Framework先的方式.(这里有数字签名和安全性更多的 内容)下面让我们进入这篇文章:
小小的翻译约定:
1 Signing:签署(并不是注册,但和注册差不多一个意思,也是为文章通顺)
2 signing policies:签署策略.
3 Signing Parts与XXXXX part: 都不翻译(因为文章中很多翻译后容易混淆.在这里part也就是大家熟悉的"部件")
4 Relationships:不翻译,它是制和Singing part一起出现描述签署策略.
5带红线:是我写的注释,就是自己的一理解。
还有就是翻译中有什么问题,请指正.谢谢...
Digital Signing Framework of the Open Packing Conventions (Open Packing Conventions的数字签名框架)
David Meltzer and Andrey Shur
Microsoft Corporation
September 2006
Applies to:
OPC Digital Signing Framework
W3C XML Digital Signature standard
Microsoft .NET 3.0 Framework
Summary: 讨论OPC的数字签名框架,提供一个包的组件和支持服务的一览,和签名策略事例.
Contents
Introduction(介绍)
Components of the OPC Digital Signing Framework(OPC的数字签署框架的组件)
The XML Digital Signature Standard(基于XML的数字签名标准)
Representing Digital Signatures in Packages(在包中表示数字签名)
Signing Parts and Relationships(Signing Parts与Relationships)
Programming Support for Package Signatures(编程支持包中签名)
Signing Package Parts and Relationships(Signing Package Parts与Relationships)
Verifying Certificates and Signatures(效验证书和签名)
Application Signing Policy(应用程序签署策略)
XPS Documents
Programming Support for XPS Signatures(编程支持XPS Signatures)
References(参考)
一 Introduction
包的模型就是用Open Packaging Conventions (OPC) 描述packages,parts(Signing part..等) 和relationships.包中有多个部件(part),部件中是内容(content)和资源(resources).Relationships是被定义用来连接包中多个不同部件的关系.
本文章讨论OPC Digital Signing Framework,提供一个包的组件和支持的服务的一览,和签署策略事例和它的实现.
Signing Framework包括一个为描绘数字签名的底层结构,和为创建和验证签名而服务. Signing Framework允许W3C XML 数字签名的标准应用于包中部件和relationships.
使用Signing Framework,包含有自己的package-based formats的定义和执行"signing policies"时明确指出他们的格式,本(policies)策略是指怎样签署和验证完整的内容格式.并具体表达签名使用在不同的工作流程中,实际上,一个单独的格式有可能在一个文档生命周期不同场景中被多个政策(policies)所定义.
签署策略是为 在package-based format上根据signing parts和relationships,和有可能用在其文档的特有的特征(这里主要是用于他们两上)(就像去验证:显示设计,颜色深度,或应用程序版样)来表达这个文档。一个签署策略详细在 一个文档组件中有注册签名和不注册签名(注意"和").例如一个签名策略能被允许执行新签名部件和relationships被添加到包中,或如果新的签名部件或签名被添加进一个包中时使用另一种签名策略就会引起签名无效.(关键上面那句话)
This article assumes familiarity with the Open Packaging Conventions Specification and the W3C Recommendation XML-Signature Syntax and Processing.
二 Components of the OPC Digital Signing Framework (OPC的数字签名框架的组件)
1:The XML Digital Signature Standard(基于XML的数字签名标准)
Signing Framework 的包使用基于XML的数字签名标准;这个标准是定义在XML-Signature Syntax and Processing(以这为标准)推存指定使用XML 语法和处理规则来提供和存储数字签名.
这个标准为任何一种数字资源签署和验证.定义一个XML签名元素类型,schema并为签署和验证任何一个数字签名资源提供有一致的需求,这个schema还为引用资源和与数字签名有关的算方定义元素.
2:Features of digital signatures(数字签名的新特性)
一个数字签名能否使用决定于已经被签署的内容是否改变,数字签名包含一个内容列表(manifest),这个内容列表是"hash",hash在创建数字签名时是依照"hash" 众所周知的算法和来存储.如果内容已经改变,这个"hash"会比较之前存储的数字签名并重新创建这个数字签名"hash".
一个数字签名使用还要能识别本内容的签署者,这个签名者的标识是用一个关于数字签名的证书来识别.这个证书能嵌入在数字签名中,或放在别处(之后会谈到).
一个数字签名不能锁定(lock)文档或引起文档变成加密文档(尽管文档已经被加密).文档内容在被签名后是不会变化的,数字签名没有预防被签署的内容被消费者查看.
3:Representing Digital Signatures in Packages(在包中表示数字签名)
应用程序合并数字签名在包中使用一个指定的配置来配置part(因为在包中很多part) 和 relationships.
这个Signing Framework使用元素和attribute都来于包的命名空间,包的命名空间是按照 XML Digital Signature 标准.而数字签名元素被定义于在支持包详细规格新特性下包的命名空间中(package- specific features),扩充标准并没有使他们矛盾,另外的详细的可以的看 "Modifications to the XML Digital Signature Specification" of the OPC Specification.
package parts定义在Signing Framework 是Origin Part 中,XML Signature Part,和Certificate Part,各自有一个明确定义的内容类型.明确定义关联类型被用来为连接在包中的签名parts.指定一个附带"H",OPC Specification的标准命名空间和内容类型 ("StandardNamespaces and Content Types," of the OPC Specification.).
4:Digital Signature Origin Part (数字签名源部件)
Digital Signature Origin Part 是整个数字签名包的最初点,Digital Signature Origin Part的目标接点是包的父接点使用的 Digital Signature Origin relationship. Multiple Signature parts 也来于 Origin part.如果包中没有签名那也就没有Origin part.
5: Digital Signature XML Signature Part(数字签名XML签名部分)
Digital Signature XML Signature Part 内容标签被定义在W3C数字签名标准又在包命名空间中,这个Parts是来于Digital Signature Origin part XML关于 Digital Signature relationship(关联).
6:Digital Signature Certificate Part(数字签名证书部件)
X.509 证书须要识别签名者,如果将证书放置在包中,可以嵌入到XML数字签名part的内部,或被存储在个别的 Certificate part中,可选 Certificate part被标识于XML Signature part与Digital Signature Certificate关联. Certificate part可被多个Signature part共享.
7:Custom Signature Parts(自定义数字签名部件)
自定义(application-specific)签名部件被提供许可,但 SigningFramework不提供句柄(but not handled, by the Signing Framework),一个签名部件是持有一个其他的被一个自定义内容类型定义的XML signatrue,另为relationship一个自定义ralationship类型必须使用来于Digital Signature Orign part.
三 Signing Parts and Relationship(签署部件和Relationship)
XML Digital Signature 标准允许为一个包多个部件设置签名资源地址,只Signing Framework中受权多个部件的签署. relationship在包中的,也被保存在一个 relationship part中,能立刻被签名或一个relationships的子集能被指定签名.
一个部件的内容类型被签署, 连同部件内容一起被确保在一个正确的被签署包下使用或返回,因为内容类型没有一个设置地址资源,package- specific的方式是带上一个签名内容类型的值,当包被签名时,每一个签名的内容类型部件被存储在一个能通过URL中,并引入到被签名部件的查询组件中,当包被消除时候,OPC Digital Signing Framework 使用内容类型的值来确保部件的内容类型在这个部件被签名前不会改变.
当ralatonship part 被签署,所有的relationships被定义在被签署后的ralatonship part中,支持的签署策略是允许一个没有无效签名包中的一些内容改换,在 Sigining Framework 提供一个机制为签署指定一个.签署被指定一个relationships关联后, Signing Framework 使用专门的转换,Relationships Transform,关于 Relationships Transform可以看(Transform Algorithms)
Relationships Transform 创建一个 relationships part包含指定relationships的关系,为在签名时和在签名验证时,获得使用一个relaionships part.
四: Programming Support for Package Signature(编程支持包中签名)
签署和验证数字签名,应用程序能使用.NET 3.0 类 PackageDigitalSignatureManager,包的特性类被定义在System.IO.Packaging命名空间中,构件一个在 Microsoft .NET 3.0 Framework的数字签名类被定义在System.Security.Cryptography.Xml命名空间中.
PackageDigitalSigntureManager 类被使用为创建和验证签名,和在包中显示(placing)签名下部结构.而签名被一个对象PackageDigitalSignature类所描述.
五: Signing Package Parts and Relationships(Signing Parts与Relationships)
一个应用程序定义一个parts的列表和relationship去按照它的签署策略来签署,这个应用程序于是调用 PackageDigitalSignatureManager.Sign()方法创建签名和添加签名结构进入包中.
这个事例代码示范在包中签署所有的部件,除 relationships parts,签署当前全部relationships都是起源于包的根接点,和嵌入证书被使用于标记在XML签名部件中.这个实例代码是假设一开始没有签名存在在包中,并且只有一个签名被应用于在之前被确认.
1 :Beginning the Signing Process(开始签署进程)
开始工作在签名在包中,首先创建一个PackageDigitalSignatureManager,如下面代码:
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
2:证书嵌入选项
一个证书可以就像任一个字符串嵌入在自己的签名中,就像包中的separate part样,或在包以外的资源.如果证书是被放置在包的内部,一个应用程序为证书使用嵌入 PackageDigitalSignature.CertificateOption的属性的选项.之后创建 PackageDigitalSignatureManager类,为证书设置嵌入式选项.代码如下:
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
3:Signed Parts List(签署部件列表)
签署部件清单是指使用URIs 地址的部件.在这个事例中,所有部件在包中除非relationshops part 外都被签署,被过滤出是使用 PackUriHelper.IsRelationshipPartUri()方法:
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
4:Signed Relationships List(被签署的关联列表)
个别的relationships 被签署时可使用Relationships Transform.签署relationships时,这个方法允许新的relationships添加进入没有无效签名的包中.
Relationships 被选中和签署相互关联时,一个PackageRelationshipSelector对象的列表将创建并被使用来和签署关联. PackageRelationshipSelector对象能被relationship类型中被创建在一个组中 (as defined in section "Standard Namespaces and Content Types" of the Open Packaging Conventions), 或被指定的relationship id创建,如下代码:
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
当创建一个PackageRelationshipSelector关于PackageRelationshipSelectorType.Id时,这一个 relationship就已经有标识id指定被选中的签名.当创建一个选者器 PackageRelationshipSelectorType.Type时,所有的 relationship的类型就是选者器所指向的签名.如果同一类型的relationships被添加到同一包中,对签名无效.
5:Creating the Certificate Object(创建数字证书对象)
之前谈的是签名,一个有效X.509 证书的是被System.Security.Cryptography.X509Certificates.X509Certificate2对象初试化后才能获得,这个对象在签署时候传递给PackageDigitalSignatureManager.Sign()方法,创建数字证书对象的更多信息请看System.Security.Cryptography.X509Certificates命名空间.
6:Applying the Signature(申请签名)
创建一个部件清单和relationships和签署关联,和获得数字证书对象后,现在来创建 PackageDigitalSignatureManager.Sign() 方法.
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
当调用Sign()方法时, "hash"被产生和存储在签名清单中,并signature part被创建.如果签名结构已经存在当前包中,一个新的 signature part将被添加(如果允许添加的情况),如果下部结构没有已经存在包中,Sign()方法创建签名结构和放置签名在包中.
7:Verifying Certificates and Signatures(核实证书和签名)
应用程序能验证一个证书和签名时,之前是验证签名,证书也要验证,描述签名的对象是在包中的PackageDigitalSignature,已经一个属性 "Signer"这个属性返回为签名所创建的证书,如果证书没被嵌入包中,应用程序获得证书就要知道应用程序的位置.
PackageDigitalSignatureManager.VerifyCertificate()方法是用来验证已获得的证书,效验证书的结构,终止日期和一系列状态.还要更多的关于这一系列状态可以看在.net Framework 类库中的X509ChainStatusFlag Enumeration.
应用程序开发者能使用证书状态来支持他们签署政策.事例是一个应用程序能指定在确定日期是合适后就将证书被发行.
PackageDigitalSignatureManager.VerifySignatures()方法使用来验证所有在包中的签名的.这个方法只验证签名,不验证和签名关联的证书.
在下面事例代码是用来验证在被放置在包中的证书和签名.这些代码是假设没有其他签名已经被添加到包中的情形.
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
六 Application Signing Policy(应用程序签署策略)
应用程序可以使用package-based formats 定义他们自己的像 Signing Framework中部件(像签名部件)样的策略.这个策略是被元素类型和 格式的工作流程需要所决定的.在上面的部分中签署策略 (signing policy这里只的是应用程序的签名策略)是描述的都是一个格式Microsoft package-based format: the XPS Document format.
七 XPS Documents
XPS Document format 是基于Open Packaging Conventions的,详细描述在 XML Paper Specification.XML Paper Specification是为签署 XPS Doucment定义策略,在策略内有签署选项可以于支持应用程序新特性或工作流.
1:Signing Policy for XPS Document Packages(签署策略为XPS Document 包)
XPS Document 签署策略描述多个部件的设置和relationships因为都被签名后所以内容都要被验证,这是本策略的一个部件,一个应用程序可能创建一个可以包含的多个细小部件的混合的签名附加到内容中,例如CoreProperties part,签署这些部件将预防它们变换成无效的签名,另外,应用程序可能可以签署relationships部件并放进在包中的Digital Signature Origin part中,禁止新的签名被添加到文档,免产生无效的签名.
为一个签名被验证,这个XPS Document签署策略需要在签名中确定部件和relationships.当校验一个签名,不可能有未被承认的部件和被签署的relationships,所以一个应用程序必须确定所需要的部件和relationships被注册.
2:XPS Document Parts to Sign(XPS Document Parts的签署)
下面是一个表,表主要内容是,在XPS Document中必须被注册的部件和可选注册部件清单,在relationships方面,XPS注册策略指定注册relationships必须是按照OPC-defined Relationships的形式,如果一个本部件被注册,relationships 必须被注册.
Part Type Policy
FixedDocumentSequence part Must be signed
FixedDocument part Must be signed
DocumentStructure parts Must be signed
SignatureDefinitions part Must be signed
FixedPage parts Must be signed
Required resource parts (such as fonts, images) Must be signed
StoryFragments parts Must be signed
Thumbnail parts Must be signed
CoreProperties part Optionally signed
Digital Signature Origin part Optionally signed
Digital Signature Certificate part Optionally signed
PrintTicket parts Optionally signed
DiscardControl parts Optionally signed
关于更多XPS签署政策,看在XML Paper Specification中的"XPS Document Package Features: Digital Signatures: Signing Rules".
3:Markup Compatibility Signing Policy(标记兼容签署策略)
XML Paper Specification 描述在XPS Document中包含是一个交替的内容:标记兼容性.交替的内容是被放入标记(Markup)兼容性命名空间的元素中.按照这个策略, XPS Documents 中已有的标记兼容性元素和属性不能被正当的签署,除非注册程序承认所有交替项内容相等.只有这样XPS Document包含的元素和属性被承认能被注册或被验证.
1:Countersignatures(多签名)
一个文档的内容能适用一个或多个签名.例如内容表现是一个合法契约,可能会有几个人申请他们的签名,指示内容被签署和签署者的标识.
添加一个新的签名总要创建一个新的relationships在relationships part内并将relationships part放入在 Digital Signature Origin part中,为了添加新标签到一个XPSDocument中的XPSDocument中的当前签名将无效,这个relatioinships part必须保持非签署(尽管是子集的relationships可能被签署).如果 relationships part被包含在一个数字签名,数字签名将会被随后追加的签名使之无效.
2:Validating XPS Signatures(验证XPS签名)
除定义一个签名外,XPS签署政策还指定怎样校验一个有效签名,本策略为一个签名定义有效状态,包含incompliant, broken, questionable, and valid,如下表:
======================================================================================
Signature Status | All required parts and relationships are signed? | Signature includes only recognized content? | Hash of signed content is verified? | Signed Markup Compatibility content is recognized? | Certificate is valid? |
Incompliant | NO
YES |
n/a
NO |
n/a
n/a |
n/a
n/a |
n/a
n/a |
Broken | YES | YES | NO | n/a | n/a |
Questionable | YES
YES |
YES
YES |
YES
YES |
NO
YES |
n/a
NO |
Valid | YES | YES | YES | YES | YES |
XPS Viewer会显示questionable和 broken状态的XPS 签名,还有valid XPS signatures. 而Incompliant signatures是不能列举的.
八:Programming Support for XPS Signatures(编程支持XPS Signatures)
当一个XPS Document正在工作时,应用程序能使用XpsDigitalSignature类中的方法.这个类的基于是PackageDigitalSignature;类和包括遵循在XPS Digital Signature Specification中的需求和算法的方法.签署和验证方法校验必须部分和XPS Document被签署的relationships.
1 Signing an XPS Document(在一个XPS Document签署签名)
XpsDocument.SignDigitally()方法被使用来在一个XPS Document签署签名.在调用的方法之前, 一个应用程序必须有一个X.509 certificate,要使用这个证书就要使用System.Security.Cryptography.X509Certificates.X509Certificate2的对象.
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
XpsDigSigPartAlteringRestrictions 能被使用来限制签名,基于一个签署策略的.这个参数指是否排斥CoreMetadata或签名中的SignatureOrigin parts.排斥这两部分能让签名无效果.例如排斥 CoreMetadata部件,应用程序改变文档的签名为无效.
能使用签名被创造时的SignDigitally()方法来排斥PrintTicket和DiscardControl两部分.尽管这些部分在构件应用程序签名时是可选的.
2:Verifying an XPS Document Signature(校验一个XPS Document 签名)
一个或多个签名能被保存在一个XPS Document中,能从 XpsDocument.Signatures属性获得这些签名.签名被XpsDigitalSignature对象的实例所表现.
在下列事例中,只有在集合中的第一个签名的验证.
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
九:参考
* Open Packaging Conventions Specification
* W3C Recommendation, XML-Signature Syntax and Processing
* XML Paper Specification
--------------------------------------worksguo(翻译)----------------------------