(仅限 AIR)
flash.security
public class XMLSignatureValidator
继承XMLSignatureValidator Inheritance EventDispatcher Inheritance Object

语言版本: ActionScript 3.0
运行时版本: AIR 1.0

XMLSignatureValidator 类验证 XML 签名文件是否格式正确且未修改,以及它是否使用链接到受信任数字证书的密钥进行签名(可选)。

XMLSignatureValidator 针对 XML 签名语法和处理实现 W3C 建议的子集,不应将其视为符合该建议的实现。该建议支持的子集包括:

必须提供 IURIDereferencer 实现才能验证 XML 签名。此实现类负责解析签名文件的 SignedInfo 元素中指定的 URI 并返回实现 IDataInput 接口的对象(如 ByteArray)中引用的数据。

为了验证签名证书是否链接到受信任的证书,XML 签名必须包含构建 X509Certificate 元素之间的链接所需的证书,或必须使用 addCertificate() 方法提供构建该链接所需的证书。

验证 XMLSignature:

  1. 创建 XMLSignatureValidator 类的实例。
  2. 将该实例的 uriDereferencer 属性设置为 IURIDereferencer 实现类的实例。
  3. 如果需要,使用 addCertificate() 方法提供 DER 编码的证书以便构建证书信任链。
  4. 调用 XMLSignatureValidator verify 方法,传入要验证的签名。
  5. XMLSignatureValidator 对象调度 complete 事件后,检查 validityStatus 属性。

关于签名状态:

XML 签名的有效性可以为 valid、invalid 或 unknown。整体状态取决于签名文件各个组件的验证状态:

validityStatus 属性报告的签名有效性可以为:

规范化限制:

AIR 中的 XML 引擎对 XML 文档进行规范化时,并不总是能生成预期的 XML 字符串。因此,建议避免在已包封或已分离的签名文档中放置元素间空白,且不要重新定义签名文档内的命名空间。在这两种情况下,AIR 都可能无法重新创建具有相同字符序列的文档,进而导致验证失败。

查看示例

另请参见

IURIDereferencer
XML 签名语法和处理
正则 XML
PKCS #1


公共属性
 属性定义方
 Inheritedconstructor : Object
对类对象或给定对象实例的构造函数的引用。
Object
  AIR-only digestStatus : String
[只读 (read-only)] 通过 SignedInfo 元素计算的加密签名的有效性状态。
XMLSignatureValidator
  AIR-only identityStatus : String
[只读 (read-only)] 签名证书的有效性状态。
XMLSignatureValidator
 Inheritedprototype : Object
[静态] 对类或函数对象的原型对象的引用。
Object
  AIR-only referencesStatus : String
[只读 (read-only)] SignedInfo 元素中引用的数据的有效性状态。
XMLSignatureValidator
  AIR-only referencesValidationSetting : String
指定检查引用时所处的条件。
XMLSignatureValidator
  AIR-only revocationCheckSetting : String
指定如何检查证书吊销。
XMLSignatureValidator
  AIR-only signerCN : String
[只读 (read-only)] 签名证书的“公共名称”字段。
XMLSignatureValidator
  AIR-only signerDN : String
[只读 (read-only)] 签名证书的“识别名称”字段。
XMLSignatureValidator
  AIR-only signerExtendedKeyUsages : Array
[只读 (read-only)] 包含签名证书中列出的扩展密钥用法 OID 的数组。
XMLSignatureValidator
  AIR-only signerTrustSettings : Array
[只读 (read-only)] 包含签名证书的信任设置的数组。
XMLSignatureValidator
  AIR-only uriDereferencer : IURIDereferencer
IURIDereferencer 实现。
XMLSignatureValidator
  AIR-only useSystemTrustStore : Boolean
指定使用系统信任存储中的证书来构建链。
XMLSignatureValidator
  AIR-only validityStatus : String
[只读 (read-only)] 经过验证的 XML 签名的有效性状态。
XMLSignatureValidator
公共方法
 方法定义方
  
创建 XMLSignatureValidator 对象。
XMLSignatureValidator
  
添加 x509 证书以构建链。
XMLSignatureValidator
 Inherited
addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
使用 EventDispatcher 对象注册事件侦听器对象,以使侦听器能够接收事件通知。
EventDispatcher
 Inherited
将事件调度到事件流中。
EventDispatcher
 Inherited
检查 EventDispatcher 对象是否为特定事件类型注册了任何侦听器。
EventDispatcher
 Inherited
指示对象是否已经定义了指定的属性。
Object
 Inherited
指示 Object 类的实例是否在指定为参数的对象的原型链中。
Object
 Inherited
指示指定的属性是否存在、是否可枚举。
Object
 Inherited
removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void
从 EventDispatcher 对象中删除侦听器。
EventDispatcher
 Inherited
设置循环操作动态属性的可用性。
Object
 Inherited
返回指定对象的字符串表示形式。
Object
 Inherited
返回指定对象的原始值。
Object
  
AIR-only verify(signature:XML):void
验证指定的签名。
XMLSignatureValidator
 Inherited
检查是否用此 EventDispatcher 对象或其任何始祖为指定事件类型注册了事件侦听器。
EventDispatcher
事件
 事件 摘要 定义方
 Inherited[广播事件] Flash Player 或 AIR 应用程序获得操作系统焦点并变为活动状态时将调度此事件。EventDispatcher
  在完成验证时调度。XMLSignatureValidator
 Inherited[广播事件] Flash Player 或 AIR 应用程序失去操作系统焦点并变为非活动状态时将调度此事件。EventDispatcher
  由于错误而无法完成验证时调度。XMLSignatureValidator
属性详细信息
AIR-only digestStatus属性
digestStatus:String  [只读 (read-only)]

运行时版本: AIR 1.0

通过 SignedInfo 元素计算的加密签名的有效性状态。

此状态是:

注意:如果 digestStatus 无效,则不检查 identityStatusreferencesStatus,并会将其报告为 unknown



实现
    public function get digestStatus():String

引发
IllegalOperationError — 如果在正在验证签名时访问。
AIR-only identityStatus属性 
identityStatus:String  [只读 (read-only)]

运行时版本: AIR 1.0

签名证书的有效性状态。

该状态可以是:

无论证书是否被视为有效,使用 addCertificate() 方法添加的证书以及 revocationCheckSettinguseSystemTrustStore 属性的设置都可以进行更改。

注意:如果 identityStatus 无效,则不检查 referencesStatus,并会将其报告为 unknown。此外,当 identityStatus 为 unknown 时,不检查引用,除非 referencesValidationSettingvalidOrUnknownIdentity



实现
    public function get identityStatus():String

引发
IllegalOperationError — 如果在正在验证签名时访问。

另请参见


示例
下例得到对签名证书进行验证后的结果(已验证签名之后):
import flash.security.XMLSignatureValidator;
 
 
 var verifier:XMLSignatureValidator = new XMLSignatureValidator();
 //validate a signature...
  
 var identityResult:String = verifier.identityStatus;
AIR-only referencesStatus属性 
referencesStatus:String  [只读 (read-only)]

运行时版本: AIR 1.0

SignedInfo 元素中引用的数据的有效性状态。

该状态可以是:

重要说明:不验证外部资源,除非在签名文档内的 SignedInfo 元素中直接引用这些外部资源。不验证辅助引用所指的外部资源。例如,如果 XML 签名签署了一个 manifest 元素,则仅验证 manifest 元素自身的完整性。不检查 manifest 中列出的文件。



实现
    public function get referencesStatus():String

引发
IllegalOperationError — 如果在正在验证签名时访问。

另请参见


示例
下例得到对签名中的引用进行验证后的结果(已验证签名之后):
import flash.security.XMLSignatureValidator;
 
 var verifier:XMLSignatureValidator = new XMLSignatureValidator();
 //validate a signature...
  
 var dataResult:String = verifier.referencesStatus;
AIR-only referencesValidationSetting属性 
referencesValidationSetting:String  [读写]

运行时版本: AIR 1.5

指定检查引用时所处的条件。

使用 ReferencesValidationSetting 类中定义的常量来设置此属性。这些设置包括:

对于以商业证书签署的签名,或当您以 addCertificate() 方法提供自己的证书作为受信任的锚记时,将使用默认设置 validIdentity。在已签名文档无论如何都会被拒绝时,此设置避免了检查引用有效性的开销。

对于以自签名证书签署的签名,将使用 validOrUnknownIdentity 设置。此设置使您可以验证已签名的数据未被更改,但无法确定签名者的身份。

此类验证对您的应用程序并不重要时,使用 never 设置可避免验证引用的开销。



实现
    public function get referencesValidationSetting():String
    public function set referencesValidationSetting(value:String):void

引发
IllegalOperationError — 如果在正在验证签名时设置。
 
ArgumentError — 如果 setting 参数包含 ReferencesValidationSetting 类中未定义的值。

另请参见


示例
下例将 XMLSignatureValidator 对象设置为仅在签名证书与受信任的锚记有联系时检查引用:
import flash.security.ReferencesValidationSetting;
 
 var verifier:XMLSignatureValidator = new XMLSignatureValidator(); 
 verifier.referencesValidationSetting = ReferencesValidationSetting.VALID_OR_UNKNOWN_IDENTITY;
AIR-only revocationCheckSetting属性 
revocationCheckSetting:String  [读写]

运行时版本: AIR 1.0

指定如何检查证书吊销。

使用 RevocationSettings 类中定义的常量来设置此属性。这些设置包括:



实现
    public function get revocationCheckSetting():String
    public function set revocationCheckSetting(value:String):void

引发
IllegalOperationError — 如果在正在验证签名时设置。

另请参见

AIR-only signerCN属性 
signerCN:String  [只读 (read-only)]

运行时版本: AIR 1.0

签名证书的“公共名称”字段。



实现
    public function get signerCN():String

示例
下例读取签名证书的公用名称(已验证签名之后):
var verifier:XMLSignatureValidator = new XMLSignatureValidator();
 //validate a signature...
  
 var commonName:String = verifier.signerCN;
AIR-only signerDN属性 
signerDN:String  [只读 (read-only)]

运行时版本: AIR 1.0

签名证书的“识别名称”字段。



实现
    public function get signerDN():String

示例
下例读取签名证书的可分辨名称(已验证签名之后):
var verifier:XMLSignatureValidator = new XMLSignatureValidator();
 //validate a signature...
  
 var distinguishedName:String = verifier.signerDN;
AIR-only signerExtendedKeyUsages属性 
signerExtendedKeyUsages:Array  [只读 (read-only)]

运行时版本: AIR 1.0

包含签名证书中列出的扩展密钥用法 OID 的数组。

每种扩展密钥用法均以数字 OID 形式进行报告。



实现
    public function get signerExtendedKeyUsages():Array

引发
IllegalOperationError — 如果在正在验证签名时访问。

示例
下例读取签名证书的扩展密钥 OID(已验证签名之后):
import flash.security.XMLSignatureValidator;
 
 var verifier:XMLSignatureValidator = new XMLSignatureValidator();
 //validate a signature...
  
 var extendedKeyOIDs:Array = verifier.signerExtendedKeyUsages;
AIR-only signerTrustSettings属性 
signerTrustSettings:Array  [只读 (read-only)]

运行时版本: AIR 1.0

包含签名证书的信任设置的数组。

信任设置是从系统和证书中嵌入的密钥用法 OID 中派生的。用作表示已识别的信任设置的字符串的常量在 SignerTrustSettings 类中定义。

unknowninvalid 证书的 signerTrustSettings 数组为空数组。

修改该数组不会更改证书信任设置。



实现
    public function get signerTrustSettings():Array

引发
IllegalOperationError — 如果在正在验证签名时访问。

另请参见


示例
下例读取签名证书的信任设置(已验证签名之后):
import flash.security.XMLSignatureValidator;
 
 var verifier:XMLSignatureValidator = new XMLSignatureValidator();
 //validate a signature...
  
 var certificateTrustedFor:Array = verifier.signerTrustSettings;
AIR-only uriDereferencer属性 
uriDereferencer:IURIDereferencer  [读写]

运行时版本: AIR 1.0

IURIDereferencer 实现。

尝试验证签名之前必须提供 IURIDereferencer 实现。



实现
    public function get uriDereferencer():IURIDereferencer
    public function set uriDereferencer(value:IURIDereferencer):void

引发
IllegalOperationError — 如果在正在验证签名时设置。

另请参见


示例
下例创建 SignedMessageDereferencer 的一个实例(它实现了 IURIDereferencer 接口),并将其设置为用于签名验证的去引用器:
import com.example.SignedMessageDereferencer; //A custom class implementing IURIDereferencer
 
 var verifier:XMLSignatureValidator = new XMLSignatureValidator(); 
 verifier.uriDereferencer = new SignedMessageDereferencer();
AIR-only useSystemTrustStore属性 
useSystemTrustStore:Boolean  [读写]

运行时版本: AIR 1.0

指定使用系统信任存储中的证书来构建链。

如果为 true,则使用系统信任存储中的信任锚记作为受信任的根。默认情况下不使用系统信任存储。



实现
    public function get useSystemTrustStore():Boolean
    public function set useSystemTrustStore(value:Boolean):void

引发
IllegalOperationError — 如果在正在验证签名时设置。

示例
下例创建一个 XMLSignatureValidator 实例,并将其设置为在验证 XML 签名时使用受信任证书的系统存储库:
var verifier:XMLSignatureValidator = new XMLSignatureValidator(); 
 verifier.useSystemTrustStore = true;
AIR-only validityStatus属性 
validityStatus:String  [只读 (read-only)]

运行时版本: AIR 1.0

经过验证的 XML 签名的有效性状态。

验证 XML 签名的途径是验证 SignedInfo 元素的加密签名、签名证书以及 SignedInfo 元素中引用所指的数据。这些元素中每个元素的有效性分别由 digestStatusidentityStatus()referencesStatus 属性进行报告。

XML 签名的有效性可以为 valid、invalid 或 unknown。整体状态取决于签名文件各个组件的验证状态:

validityStatus 属性报告的签名有效性可以为:



实现
    public function get validityStatus():String

引发
IllegalOperationError — 如果在正在验证签名时访问。

另请参见


示例
下例得到验证 XML 签名的结果
import flash.security.XMLSignatureValidator;
 
 var verifier:XMLSignatureValidator = new XMLSignatureValidator();
 //validate the signature...
  
 var validationResult:String = verifier.validityStatus;
构造函数详细信息
AIR-only XMLSignatureValidator()构造函数
public function XMLSignatureValidator()

运行时版本: AIR 1.0

创建 XMLSignatureValidator 对象。

在调用新对象的 verify() 方法之前必须设置 uriDereferencer 属性。

另请参见


示例

下例创建并设置一个新的 XMLSignatureValidator 对象:
import com.example.EnvelopedDereferencer; //Your custom IURIDereferencer implementation

//Create the object
var verifier:XMLSignatureValidator = new XMLSignatureValidator();

//Provide the IURIDerferencer
verifier.uriDereferencer = new EnvelopedDereferencer(xmlDoc);

//Set validation options
verifier.referencesValidationSetting = ReferencesValidationSetting.VALID_OR_UNKNOWN_IDENTITY;
verifier.revocationCheckSetting = RevocationCheckSettings.NEVER;
verifier.useSystemTrustStore = true;

//Add listeners to handle results
verifier.addEventListener(Event.COMPLETE, verificationComplete);
verifier.addEventListener(ErrorEvent.ERROR, verificationError);
方法详细信息
AIR-only addCertificate()方法
public function addCertificate(cert:ByteArray, trusted:Boolean):*

运行时版本: AIR 1.0

添加 x509 证书以构建链。

添加的证书必须是 DER 编码的 x509 证书。

如果 trusted 参数为 true,则将证书视为信任锚记。

注意:XML 签名可能包括用于构建签名者的证书链的证书。XMLSignatureValidator 类使用这些证书构建链,但不作为受信任的根(默认情况下)。

参数

cert:ByteArray — 包含 DER 编码的 x509 数字证书的 ByteArray 对象。
 
trusted:Boolean — 设置为 true 可将此证书指定为信任锚记。

返回
*

引发
IllegalOperationError — 如果在正在验证签名时调用。

示例

下例从文件系统加载一个证书,并将其添加为受信任的锚记。
import flash.utils.ByteArray;
 
 var verifier:XMLSignatureValidator = new XMLSignatureValidator();
 var certificate:ByteArray = new ByteArray();
 
 var certFile:File = new File("certificate.cer");
 var certFileStream:FileStream = new FileStream();
 certFileStream.open(certFile, FileMode.READ);
 certFileStream.readBytes(certificate, 0, certFileStream.bytesAvailable);

 verifier.addCertificate(certificate, true);
AIR-only verify()方法 
public function verify(signature:XML):void

语言版本: ActionScript 3.0
运行时版本: AIR 1.0

验证指定的签名。

验证是异步进行的。验证成功完成时,XMLSignatureValidator 对象将调度 complete 事件,或者由于错误无法完成验证时将调用 error 事件。

无法取消验证过程。当验证过程正在进行时,对 verify() 方法的后续调用将失败。在当前验证检查完成后,可以再次调用 verify() 方法。

注意:由于 XMLSignatureValidator 只能实现 XML 签名语法和处理 W3C 建议的一个子集,因此无法验证所有有效的 XML 签名。

参数

signature:XML — 要验证的 XML 签名。


事件
complete:Event — 在成功完成验证时调度。
 
error:ErrorEvent — 验证引用遇到错误时调度。

引发
IllegalOperationError — 如果在正在验证签名时调用。
 
Error — 遇到其它错误时,如格式不正确的 XML 或签名文件中不支持的元素。

示例

下例读取一个包含 XML 签名的文件,并通过调用 verify() 方法验证该签名。(此示例假定该 IURIDereferencer 实现适合于该签名。)
import flash.filesystem.File;
import flash.filesystem.FileStream;
import com.example.SignedMessageDereferencer; //Your IURIDereferencer implementation
 
const xmlSignatureNS:Namespace = new Namespace( "http://www.w3.org/2000/09/xmldsig#" );

var verifier:XMLSignatureValidator = new XMLSignatureValidator();
verifier.uriDereferencer = new SignedMessageDereferencer();

var signatureFile:File = new File( "path/to/XMLSignatureDocument.xml" );
var sigFileStream:FileStream = new FileStream();
sigFileStream.open( signatureFile, FileMode.READ );

var xmlDoc:XML = XML( sigFileStream.readUTFBytes(sigFileStream.bytesAvailable) );
var xmlSig:XML = XML( xmlDoc..xmlSignatureNS::Signature );

verifier.verify( xmlSig );
事件详细信息
AIR-only complete 事件
事件对象类型: flash.events.Event
属性 Event.type = flash.events.Event.COMPLETE

语言版本: ActionScript 3.0
运行时版本: AIR 1.0

在完成验证时调度。

complete 事件并不意味着签名有效。检查 XMLSignatureValidator 对象的 validityStatus 属性来确定签名验证的结果。

Event.COMPLETE 常量定义 complete 事件对象的 type 属性值。

此事件具有以下属性:

属性
bubbles false
cancelable false;没有要取消的默认行为。
currentTarget 当前正在使用某个事件侦听器处理 Event 对象的对象。
target 已完成加载的网络对象。

示例

下例侦听由 XMLSignatureValidator 对象调度的 complete 事件,并跟踪验证结果:
private function verificationComplete(event:Event):void{
    var validator:XMLSignatureValidator = event.target as XMLSignatureValidator;
    trace("Digest status: " + validator.digestStatus);
    trace("Identity status: " + validator.identityStatus);
    trace("Reference status: " + validator.referencesStatus);
    trace("Signature status: " + validator.validityStatus);    
}

另请参见

AIR-only error 事件  
事件对象类型: flash.events.ErrorEvent
属性 ErrorEvent.type = flash.events.ErrorEvent.ERROR

语言版本: ActionScript 3.0
运行时版本: AIR 1.0

由于错误而无法完成验证时调度。

定义 error 事件对象的 type 属性值。

此事件具有以下属性:

属性
bubbles false
cancelable false;没有要取消的默认行为。
currentTarget 当前正在使用某个事件侦听器处理 Event 对象的对象。
target 发生网络操作失败的对象。
text 要显示为错误消息的文本。

示例

下例侦听由 XMLSignatureValidator 对象调度的 error 事件,并跟踪错误消息:
private function verificationError(event:ErrorEvent):void{
    trace("Verification error: " + event.text);                
}
示例 如何使用示例
XMLSignatureValidatorExample.as

下例加载并验证一个包含 XML 签名的文件。若要使用此示例,必须实现一个适合于要验证的签名的 IURIDereferencer(替代示例中所使用的 SignedMessageDereferencer 类)。通过调用 SignatureValidatorExample.validateSignature( signatureFile ) 来运行示例,同时传入引用要验证的 XML 签名文档的文件。
import flash.events.Event;
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.security.ReferencesValidationSetting;
import flash.security.XMLSignatureValidator; 

import com.example.SignedMessageDereferencer; //A custom class implementing IURIDereferencer

public class SignatureValidatorExample{ 
    private var xmlSig:XML;
    private const signatureNS:Namespace = new Namespace( "http://www.w3.org/2000/09/xmldsig#" );
    
    public static function validateSignature( signatureFile:File ):void{
        try{
            //Set up the XMLSignatureValidator
            var verifier:XMLSignatureValidator = new XMLSignatureValidator();
            verifier.addEventListener( Event.COMPLETE, verificationComplete );
            verifier.uriDereferencer = new SignedMessageDereferencer();
            verifier.referencesValidationSetting = ReferencesValidationSetting.VALID_OR_UNKNOWN_IDENTITY;
    
            //Load the signed document
            var sigFileStream:FileStream = new FileStream();
            sigFileStream.open( signatureFile, FileMode.READ );
            var xmlDoc:XML = XML( sigFileStream.readUTFBytes(sigFileStream.bytesAvailable) );
            
            //Get the last Signature element in the document
            if( xmlDoc.name().localName != "Signature" ){
                var signatureList:XMLList = xmlDoc..signatureNS::Signature;
                xmlSig = XML( signatureList[ signatureList.length()-1 ] );
            } else{
                xmlSig = xmlDoc;
            }
    
            //Validate the signature
            verifier.verify( xmlSig );
            
        }catch (e:Error){
            statusDisplay.text = "Verification error.\n" + e;
        }
    }
    
    private static function verificationComplete(event:Event):void{
        trace( "Signature Validity: " + verifier.validityStatus );
        trace( "Digest validity: " + verifier.digestStatus );
        trace( "Certificate validity: " + verifier.identityStatus );
        trace( "Data validity: " + verifier.referencesStatus );
    }
}