| 包 | flash.security | 
| 类 | public class XMLSignatureValidator | 
| 继承 | XMLSignatureValidator    EventDispatcher   Object | 
| 语言版本: | ActionScript 3.0 | 
| 运行时版本: | AIR 1.0 | 
XMLSignatureValidator 针对 XML 签名语法和处理实现 W3C 建议的子集,不应将其视为符合该建议的实现。该建议支持的子集包括:
必须提供 IURIDereferencer 实现才能验证 XML 签名。此实现类负责解析签名文件的 SignedInfo 元素中指定的 URI 并返回实现 IDataInput 接口的对象(如 ByteArray)中引用的数据。
          为了验证签名证书是否链接到受信任的证书,XML 签名必须包含构建 X509Certificate 元素之间的链接所需的证书,或必须使用 addCertificate() 方法提供构建该链接所需的证书。
        
验证 XMLSignature:
uriDereferencer 属性设置为 IURIDereferencer 实现类的实例。
          addCertificate() 方法提供 DER 编码的证书以便构建证书信任链。
          verify 方法,传入要验证的签名。
          validityStatus 属性。
          关于签名状态:
XML 签名的有效性可以为 valid、invalid 或 unknown。整体状态取决于签名文件各个组件的验证状态:
digestStatus - 通过 SignedInfo 元素计算的加密签名的有效性。可以是 valid、invalid 或 unknown。
          identityStatus - 签名证书的有效性。如果证书已到期、已吊销或已更改,则该状态为 invalid。如果无法将证书链接到受信任的根证书,则该状态为 unknown。如果摘要无效,则不检查证书。如果不检查证书,状态将报告为 unknown。
          referencesStatus - 签名文件的 SignedInfo 元素中引用所指数据的有效性。可以是 valid、invalid 或 unknown。如果摘要或证书无效,则不检查引用。还可以根据 referencesValidationSetting 属性的设置跳过引用检查。如果不检查证书,状态将报告为 unknown。
          
          由 validityStatus 属性报告的签名有效性可以为:
        
valid - 如果 referencesStatus、digestStatus 和 identityStatus 全部为 valid。
          invalid - 如果其中任何一个状态为 invalid。
          unknown - 如果 referencesStatus、digestStatus 或 identityStatus 为 unknown。
          规范化限制:
AIR 中的 XML 引擎对 XML 文档进行规范化时,并不总是能生成预期的 XML 字符串。因此,建议避免在已包封或已分离的签名文档中放置元素间空白,且不要重新定义签名文档内的命名空间。在这两种情况下,AIR 都可能无法重新创建具有相同字符序列的文档,进而导致验证失败。
另请参见
| 属性 | 定义方 | ||
|---|---|---|---|
![]()  | constructor : Object 
  对类对象或给定对象实例的构造函数的引用。  | Object | |
[只读 (read-only)] 通过 SignedInfo 元素计算的加密签名的有效性状态。  | XMLSignatureValidator | ||
[只读 (read-only)] 签名证书的有效性状态。  | XMLSignatureValidator | ||
![]()  | prototype : Object [静态] 
  对类或函数对象的原型对象的引用。  | Object | |
[只读 (read-only)] SignedInfo 元素中引用的数据的有效性状态。  | XMLSignatureValidator | ||
指定检查引用时所处的条件。  | XMLSignatureValidator | ||
指定如何检查证书吊销。  | XMLSignatureValidator | ||
[只读 (read-only)] 签名证书的“公共名称”字段。  | XMLSignatureValidator | ||
[只读 (read-only)] 签名证书的“识别名称”字段。  | XMLSignatureValidator | ||
[只读 (read-only)] 包含签名证书中列出的扩展密钥用法 OID 的数组。  | XMLSignatureValidator | ||
[只读 (read-only)] 包含签名证书的信任设置的数组。  | XMLSignatureValidator | ||
IURIDereferencer 实现。  | XMLSignatureValidator | ||
指定使用系统信任存储中的证书来构建链。  | XMLSignatureValidator | ||
[只读 (read-only)] 经过验证的 XML 签名的有效性状态。  | XMLSignatureValidator | ||
| 方法 | 定义方 | ||
|---|---|---|---|
创建 XMLSignatureValidator 对象。  | XMLSignatureValidator | ||
添加 x509 证书以构建链。  | XMLSignatureValidator | ||
![]()  | addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void 使用 EventDispatcher 对象注册事件侦听器对象,以使侦听器能够接收事件通知。  | EventDispatcher | |
![]()  | 将事件调度到事件流中。  | EventDispatcher | |
![]()  | 检查 EventDispatcher 对象是否为特定事件类型注册了任何侦听器。  | EventDispatcher | |
![]()  | 
  指示对象是否已经定义了指定的属性。  | Object | |
![]()  | 
  指示 Object 类的实例是否在指定为参数的对象的原型链中。  | Object | |
![]()  | 
  指示指定的属性是否存在、是否可枚举。  | Object | |
![]()  | 从 EventDispatcher 对象中删除侦听器。  | EventDispatcher | |
![]()  | 
     设置循环操作动态属性的可用性。  | Object | |
![]()  | 
  返回指定对象的字符串表示形式。  | Object | |
![]()  | 
  返回指定对象的原始值。  | Object | |
验证指定的签名。  | XMLSignatureValidator | ||
![]()  | 检查是否用此 EventDispatcher 对象或其任何始祖为指定事件类型注册了事件侦听器。  | EventDispatcher | |
| 事件 | 摘要 | 定义方 | ||
|---|---|---|---|---|
![]()  | [广播事件] Flash Player 或 AIR 应用程序获得操作系统焦点并变为活动状态时将调度此事件。 | EventDispatcher | ||
| 在完成验证时调度。 | XMLSignatureValidator | |||
![]()  | [广播事件] Flash Player 或 AIR 应用程序失去操作系统焦点并变为非活动状态时将调度此事件。 | EventDispatcher | ||
| 由于错误而无法完成验证时调度。 | XMLSignatureValidator | |||
| 属性 | 
digestStatus:String  [只读 (read-only)] | 运行时版本: | AIR 1.0 | 
          通过 SignedInfo 元素计算的加密签名的有效性状态。
          
此状态是:
valid — 如果签名是加密有效的。
            invalid — 如果摘要已在签名后更改。
            unknown — 如果尚未调用 verify() 方法。
            
            注意:如果 digestStatus 无效,则不检查 identityStatus 和 referencesStatus,并会将其报告为 unknown。
          
    public function get digestStatus():StringIllegalOperationError  — 如果在正在验证签名时访问。 | 
| 属性 | 
identityStatus:String  [只读 (read-only)] | 运行时版本: | AIR 1.0 | 
签名证书的有效性状态。
该状态可以是:
valid — 证书尚未过期,吊销检查和指向受信任的根证书的链接没有失败。
            unknown — 证书尚未过期,吊销检查没有失败,但没有链接到受信任的根证书。尚未验证状态时也会报告 unknown,不管是因为尚未调用 verify() 方法还是因为 SignedInfo 元素 (digestStatus) 的加密签名无效。
            invalid — 证书已过期或吊销检查失败。
            
            无论证书是否被视为有效,使用 addCertificate() 方法添加的证书以及 revocationCheckSetting 和 useSystemTrustStore 属性的设置都可以进行更改。
          
            注意:如果 identityStatus 无效,则不检查 referencesStatus,并会将其报告为 unknown。此外,当 identityStatus 为 unknown 时,不检查引用,除非 referencesValidationSetting 为 validOrUnknownIdentity
          
    public function get identityStatus():StringIllegalOperationError  — 如果在正在验证签名时访问。 | 
另请参见
import flash.security.XMLSignatureValidator; var verifier:XMLSignatureValidator = new XMLSignatureValidator(); //validate a signature... var identityResult:String = verifier.identityStatus;
| 属性 | 
referencesStatus:String  [只读 (read-only)] | 运行时版本: | AIR 1.0 | 
          SignedInfo 元素中引用的数据的有效性状态。
          
该状态可以是:
valid — 如果所有引用都有效。
            invalid — 如果存在无效的引用。
            unknown - 如果未验证。在以下环境中引用可以保持未验证状态:
              verify() 方法
                digestStatus) 无效。
                identityStatus) 无效
                referencesValidationSetting 为 validIdentity(默认设置),且签名证书的 identityStatus 未知。
                referencesValidationSetting 为 never。
                重要说明:不验证外部资源,除非在签名文档内的 SignedInfo 元素中直接引用这些外部资源。不验证辅助引用所指的外部资源。例如,如果 XML 签名签署了一个 manifest 元素,则仅验证 manifest 元素自身的完整性。不检查 manifest 中列出的文件。
    public function get referencesStatus():StringIllegalOperationError  — 如果在正在验证签名时访问。 | 
另请参见
import flash.security.XMLSignatureValidator; var verifier:XMLSignatureValidator = new XMLSignatureValidator(); //validate a signature... var dataResult:String = verifier.referencesStatus;
| 属性 | 
referencesValidationSetting:String  [读写] | 运行时版本: | AIR 1.5 | 
指定检查引用时所处的条件。
使用 ReferencesValidationSetting 类中定义的常量来设置此属性。这些设置包括:
ReferencesValidationSetting.VALID_IDENTITY - 仅在签名证书有效且与受信任的根有联系时检查引用。这是默认设置。
            ReferencesValidationSetting.VALID_OR_UNKNOWN_IDENTITY - 如果签名证书有效,即使与受信任的根无联系,也会检查引用。
            ReferencesValidationSetting.NEVER - 从不检查引用。
            
            对于以商业证书签署的签名,或当您以 addCertificate() 方法提供自己的证书作为受信任的锚记时,将使用默认设置 validIdentity。在已签名文档无论如何都会被拒绝时,此设置避免了检查引用有效性的开销。
          
            对于以自签名证书签署的签名,将使用 validOrUnknownIdentity 设置。此设置使您可以验证已签名的数据未被更改,但无法确定签名者的身份。
          
            此类验证对您的应用程序并不重要时,使用 never 设置可避免验证引用的开销。
          
    public function get referencesValidationSetting():String    public function set referencesValidationSetting(value:String):voidIllegalOperationError  — 如果在正在验证签名时设置。 | |
ArgumentError  — 
              如果 setting 参数包含 ReferencesValidationSetting 类中未定义的值。
             | 
另请参见
import flash.security.ReferencesValidationSetting; var verifier:XMLSignatureValidator = new XMLSignatureValidator(); verifier.referencesValidationSetting = ReferencesValidationSetting.VALID_OR_UNKNOWN_IDENTITY;
| 属性 | 
revocationCheckSetting:String  [读写] | 运行时版本: | AIR 1.0 | 
指定如何检查证书吊销。
使用 RevocationSettings 类中定义的常量来设置此属性。这些设置包括:
RevocationCheckSettings.NEVER — 不检查证书吊销。
            RevocationCheckSettings.BEST_EFFORT — 如果吊销信息可用且可以获取吊销状态,则检查证书吊销。如果无法明确确定吊销状态,则不拒绝该证书。
            RevocationCheckSettings.REQUIRED_IF_AVAILABLE — 如果证书包括吊销信息,则必须明确确定吊销状态以验证该证书。
            RevocationCheckSettings.ALWAYS_REQUIRED — 始终检查证书吊销。拒绝没有吊销信息的证书。
                public function get revocationCheckSetting():String    public function set revocationCheckSetting(value:String):voidIllegalOperationError  — 如果在正在验证签名时设置。 | 
另请参见
| 属性 | 
signerCN:String  [只读 (read-only)] | 运行时版本: | AIR 1.0 | 
签名证书的“公共名称”字段。
    public function get signerCN():Stringvar verifier:XMLSignatureValidator = new XMLSignatureValidator(); //validate a signature... var commonName:String = verifier.signerCN;
| 属性 | 
signerDN:String  [只读 (read-only)] | 运行时版本: | AIR 1.0 | 
签名证书的“识别名称”字段。
    public function get signerDN():Stringvar verifier:XMLSignatureValidator = new XMLSignatureValidator(); //validate a signature... var distinguishedName:String = verifier.signerDN;
| 属性 | 
signerExtendedKeyUsages:Array  [只读 (read-only)] | 运行时版本: | AIR 1.0 | 
包含签名证书中列出的扩展密钥用法 OID 的数组。
每种扩展密钥用法均以数字 OID 形式进行报告。
    public function get signerExtendedKeyUsages():ArrayIllegalOperationError  — 如果在正在验证签名时访问。 | 
import flash.security.XMLSignatureValidator; var verifier:XMLSignatureValidator = new XMLSignatureValidator(); //validate a signature... var extendedKeyOIDs:Array = verifier.signerExtendedKeyUsages;
| 属性 | 
signerTrustSettings:Array  [只读 (read-only)] | 运行时版本: | AIR 1.0 | 
包含签名证书的信任设置的数组。
信任设置是从系统和证书中嵌入的密钥用法 OID 中派生的。用作表示已识别的信任设置的字符串的常量在 SignerTrustSettings 类中定义。
            unknown 或 invalid 证书的 signerTrustSettings 数组为空数组。
          
修改该数组不会更改证书信任设置。
    public function get signerTrustSettings():ArrayIllegalOperationError  — 如果在正在验证签名时访问。 | 
另请参见
import flash.security.XMLSignatureValidator; var verifier:XMLSignatureValidator = new XMLSignatureValidator(); //validate a signature... var certificateTrustedFor:Array = verifier.signerTrustSettings;
| 属性 | 
uriDereferencer:IURIDereferencer  [读写] | 运行时版本: | AIR 1.0 | 
IURIDereferencer 实现。
尝试验证签名之前必须提供 IURIDereferencer 实现。
    public function get uriDereferencer():IURIDereferencer    public function set uriDereferencer(value:IURIDereferencer):voidIllegalOperationError  — 如果在正在验证签名时设置。 | 
另请参见
import com.example.SignedMessageDereferencer; //A custom class implementing IURIDereferencer var verifier:XMLSignatureValidator = new XMLSignatureValidator(); verifier.uriDereferencer = new SignedMessageDereferencer();
| 属性 | 
useSystemTrustStore:Boolean  [读写] | 运行时版本: | AIR 1.0 | 
指定使用系统信任存储中的证书来构建链。
            如果为 true,则使用系统信任存储中的信任锚记作为受信任的根。默认情况下不使用系统信任存储。
          
    public function get useSystemTrustStore():Boolean    public function set useSystemTrustStore(value:Boolean):voidIllegalOperationError  — 如果在正在验证签名时设置。 | 
var verifier:XMLSignatureValidator = new XMLSignatureValidator(); verifier.useSystemTrustStore = true;
| 属性 | 
validityStatus:String  [只读 (read-only)] | 运行时版本: | AIR 1.0 | 
经过验证的 XML 签名的有效性状态。
            验证 XML 签名的途径是验证 SignedInfo 元素的加密签名、签名证书以及 SignedInfo 元素中引用所指的数据。这些元素中每个元素的有效性分别由 digestStatus、identityStatus() 和 referencesStatus 属性进行报告。
          
XML 签名的有效性可以为 valid、invalid 或 unknown。整体状态取决于签名文件各个组件的验证状态:
digestStatus — 通过 SignedInfo 元素计算的加密签名的有效性。
            identityStatus — 签名证书的有效性。
            referencesStatus - 签名 SignedInfo 元素中引用摘要的有效性。
            
            由 validityStatus 属性报告的签名有效性可以为:
          
valid - 如果 referencesStatus、digestStatus 和 identityStatus 全部为 valid。
            invalid - 如果其中任何一个状态为 invalid。
            unknown - 如果其中任何一个状态为 unknown。
                public function get validityStatus():StringIllegalOperationError  — 如果在正在验证签名时访问。 | 
另请参见
import flash.security.XMLSignatureValidator; var verifier:XMLSignatureValidator = new XMLSignatureValidator(); //validate the signature... var validationResult:String = verifier.validityStatus;
| () | 构造函数 | 
public function XMLSignatureValidator()| 运行时版本: | AIR 1.0 | 
创建 XMLSignatureValidator 对象。
            在调用新对象的 verify() 方法之前必须设置 uriDereferencer 属性。
          
另请参见
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);
| () | 方法 | 
 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);| () | 方法 | 
 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: — 在成功完成验证时调度。 | |
error: — 验证引用遇到错误时调度。 | 
IllegalOperationError  — 如果在正在验证签名时调用。 | |
Error  — 遇到其它错误时,如格式不正确的 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 );
| 事件 | 
flash.events.Eventflash.events.Event.COMPLETE| 语言版本: | ActionScript 3.0 | 
| 运行时版本: | AIR 1.0 | 
在完成验证时调度。
            complete 事件并不意味着签名有效。检查 XMLSignatureValidator 对象的 validityStatus 属性来确定签名验证的结果。
          
Event.COMPLETE 常量定义 complete 事件对象的 type 属性值。
          此事件具有以下属性:
| 属性 | 值 | 
|---|---|
                    bubbles
                   | 
                    false
                   | 
                    cancelable
                   | 
                    false;没有要取消的默认行为。
                   | 
                    currentTarget
                   | 当前正在使用某个事件侦听器处理 Event 对象的对象。 | 
                    target
                   | 已完成加载的网络对象。 | 
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);    
}另请参见
| 事件 | 
flash.events.ErrorEventflash.events.ErrorEvent.ERROR| 语言版本: | ActionScript 3.0 | 
| 运行时版本: | AIR 1.0 | 
由于错误而无法完成验证时调度。
定义error 事件对象的 type 属性值。
          此事件具有以下属性:
| 属性 | 值 | 
|---|---|
                    bubbles
                   | 
                    false
                   | 
                    cancelable
                   | 
                    false;没有要取消的默认行为。
                   | 
                    currentTarget
                   | 当前正在使用某个事件侦听器处理 Event 对象的对象。 | 
                    target
                   | 发生网络操作失败的对象。 | 
                    text
                   | 要显示为错误消息的文本。 | 
private function verificationError(event:ErrorEvent):void{
    trace("Verification error: " + event.text);                
}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 );
    }
}