Module java.xml.crypto

Class KeyInfoFactory

java.lang.Object
javax.xml.crypto.dsig.keyinfo.KeyInfoFactory

public abstract class KeyInfoFactory extends Object
从头开始创建KeyInfo对象或从相应的XML表示中解组装一个KeyInfo对象的工厂。

KeyInfoFactory的每个实例支持特定的XML机制类型。要创建一个KeyInfoFactory,请调用其中一个静态的getInstance方法,传入所需的XML机制类型,例如:

KeyInfoFactory factory = KeyInfoFactory.getInstance("DOM");

此工厂生成的对象将基于DOM,并遵守在DOM机制要求中定义的DOM互操作性要求。请参阅Java安全标准算法名称规范中的KeyInfoFactory部分,了解标准机制类型的列表。

KeyInfoFactory实现是通过Provider机制进行注册和加载的。例如,支持DOM机制的服务提供者将在Provider子类中指定为:

     put("KeyInfoFactory.DOM", "org.example.DOMKeyInfoFactory");
 

此外,此工厂创建的XMLStructure可能包含特定于KeyInfo的状态,并且不打算重复使用。

实现必须至少支持默认机制类型:DOM。

请注意,调用者必须使用相同的KeyInfoFactory实例来创建特定KeyInfo对象的XMLStructure。如果使用来自不同提供者或不同机制类型的XMLStructure一起使用,则行为是未定义的。

并发访问

此类的静态方法保证是线程安全的。多个线程可以同时调用此类中定义的静态方法而不会产生任何不良影响。

但是,对于此类定义的非静态方法,情况并非如此。除非特定提供者另有说明,需要同时访问单个KeyInfoFactory实例的线程应在彼此之间同步并提供必要的锁定。每个操作不同KeyInfoFactory实例的多个线程不需要同步。

自版本:
1.6
  • Constructor Details

    • KeyInfoFactory

      protected KeyInfoFactory()
      默认构造函数,供子类调用。
  • Method Details

    • getInstance

      public static KeyInfoFactory getInstance(String mechanismType)
      返回一个支持指定的XML处理机制和表示类型(例如:“DOM”)的KeyInfoFactory

      此方法使用标准的JCA提供者查找机制来定位和实例化所需机制类型的KeyInfoFactory实现。它遍历注册的安全Provider列表,从最优先的Provider开始。将返回第一个支持指定机制的Provider的新KeyInfoFactory对象。

      请注意,注册的提供者列表可以通过Security.getProviders()方法检索。

      实现说明:
      JDK参考实现另外使用jdk.security.provider.preferred Security属性来确定指定算法的首选提供者顺序。这可能与Security.getProviders()返回的提供者顺序不同。
      参数:
      mechanismType - XML处理机制和表示类型。请参阅Java安全标准算法名称规范中的KeyInfoFactory部分,了解标准机制类型的列表。
      返回:
      一个新的KeyInfoFactory
      抛出:
      NullPointerException - 如果mechanismTypenull
      NoSuchMechanismException - 如果没有Provider支持指定机制的KeyInfoFactory实现
      参见:
    • getInstance

      public static KeyInfoFactory getInstance(String mechanismType, Provider provider)
      返回一个支持请求的XML处理机制和表示类型(例如:“DOM”)的KeyInfoFactory,由指定的提供者提供。请注意,指定的Provider对象不必在提供者列表中注册。
      参数:
      mechanismType - XML处理机制和表示类型。请参阅Java安全标准算法名称规范中的KeyInfoFactory部分,了解标准机制类型的列表。
      provider - Provider对象
      返回:
      一个新的KeyInfoFactory
      抛出:
      NullPointerException - 如果mechanismTypeprovidernull
      NoSuchMechanismException - 如果指定的Provider对象中没有可用于指定机制的KeyInfoFactory实现
      参见:
    • getInstance

      public static KeyInfoFactory getInstance(String mechanismType, String provider) throws NoSuchProviderException
      返回一个支持请求的XML处理机制和表示类型(例如:“DOM”)的KeyInfoFactory,由指定的提供者提供。指定的提供者必须在安全提供者列表中注册。

      请注意,注册的提供者列表可以通过Security.getProviders()方法检索。

      参数:
      mechanismType - XML处理机制和表示类型。请参阅Java安全标准算法名称规范中的KeyInfoFactory部分,获取标准机制类型列表。
      provider - 提供者的字符串名称
      返回:
      一个新的KeyInfoFactory
      抛出:
      NoSuchProviderException - 如果指定的提供者未在安全提供者列表中注册
      NullPointerException - 如果mechanismTypeprovidernull
      NoSuchMechanismException - 如果指定机制的KeyInfoFactory实现不可从指定提供者获取
      参见:
    • getInstance

      public static KeyInfoFactory getInstance()
      返回支持默认XML处理机制和表示类型(“DOM”)的KeyInfoFactory

      此方法使用标准JCA提供者查找机制来定位和实例化默认机制类型的KeyInfoFactory实现。它遍历已注册的安全Provider列表,从最首选的Provider开始。返回来自支持DOM机制的第一个Provider的新KeyInfoFactory对象。

      请注意,已注册提供者列表可以通过Security.getProviders()方法检索。

      实现注意:
      JDK参考实现还使用jdk.security.provider.preferred Security属性来确定指定算法的首选提供者顺序。这可能与Security.getProviders()返回的提供者顺序不同。
      返回:
      一个新的KeyInfoFactory
      抛出:
      NoSuchMechanismException - 如果没有Provider支持DOM机制的KeyInfoFactory实现
      参见:
    • getMechanismType

      public final String getMechanismType()
      返回此KeyInfoFactory支持的XML处理机制和表示类型(例如:"DOM")
      返回:
      KeyInfoFactory支持的XML处理机制类型
    • getProvider

      public final Provider getProvider()
      返回此KeyInfoFactory的提供者。
      返回:
      KeyInfoFactory的提供者
    • newKeyInfo

      public abstract KeyInfo newKeyInfo(List<? extends XMLStructure> content)
      创建包含指定密钥信息类型列表的KeyInfo
      参数:
      content - 代表密钥信息类型的一个或多个XMLStructure列表。列表进行防御性复制,以防止后续修改。
      返回:
      一个KeyInfo
      抛出:
      NullPointerException - 如果contentnull
      IllegalArgumentException - 如果content为空
      ClassCastException - 如果content包含任何不属于XMLStructure类型的条目
    • newKeyInfo

      public abstract KeyInfo newKeyInfo(List<? extends XMLStructure> content, String id)
      创建包含指定密钥信息类型列表和可选ID的KeyInfoid参数表示XML ID属性的值,可用于从其他XML结构引用KeyInfo
      参数:
      content - 代表密钥信息类型的一个或多个XMLStructure列表。列表进行防御性复制,以防止后续修改。
      id - XML ID的值(可能为null
      返回:
      一个KeyInfo
      抛出:
      NullPointerException - 如果contentnull
      IllegalArgumentException - 如果content为空
      ClassCastException - 如果content包含任何不属于XMLStructure类型的条目
    • newKeyName

      public abstract KeyName newKeyName(String name)
      从指定名称创建一个KeyName
      参数:
      name - 标识密钥的名称
      返回:
      一个KeyName
      抛出:
      NullPointerException - 如果namenull
    • newKeyValue

      public abstract KeyValue newKeyValue(PublicKey key) throws KeyException
      从指定的公钥创建一个KeyValue
      参数:
      key - 公钥
      返回:
      一个KeyValue
      抛出:
      KeyException - 如果key的算法未被此KeyInfoFactory识别或支持
      NullPointerException - 如果keynull
    • newPGPData

      public abstract PGPData newPGPData(byte[] keyId)
      从指定的PGP公钥标识符创建一个PGPData
      参数:
      keyId - 在RFC 2440第11.2节中定义的PGP公钥标识符。数组进行克隆以防止后续修改。
      返回:
      一个PGPData
      抛出:
      NullPointerException - 如果keyIdnull
      IllegalArgumentException - 如果密钥ID格式不正确
    • newPGPData

      public abstract PGPData newPGPData(byte[] keyId, byte[] keyPacket, List<? extends XMLStructure> other)
      从指定的PGP公钥标识符、可选密钥材料数据包和外部元素列表创建一个PGPData
      参数:
      keyId - 在RFC 2440第11.2节中定义的PGP公钥标识符。数组进行克隆以防止后续修改。
      keyPacket - 在RFC 2440第5.5节中定义的PGP密钥材料数据包。数组进行克隆以防止后续修改。可能为null
      other - 代表来自外部命名空间的元素的XMLStructure列表。列表进行防御性复制,以防止后续修改。可能为null或空。
      返回:
      一个PGPData
      抛出:
      NullPointerException - 如果keyIdnull
      IllegalArgumentException - 如果keyIdkeyPacket格式不正确。对于keyPacket,检查数据包头的格式并验证标签是否为密钥材料类型。不检查数据包主体的内容和格式。
      ClassCastException - 如果other包含任何不属于XMLStructure类型的条目
    • newPGPData

      public abstract PGPData newPGPData(byte[] keyPacket, List<? extends XMLStructure> other)
      从指定的PGP密钥材料数据包和可选外部元素列表创建一个PGPData
      参数:
      keyPacket - 在RFC 2440第5.5节中定义的PGP密钥材料数据包。数组会被克隆以防止后续修改。
      other - 代表来自外部命名空间的元素的XMLStructure列表。列表会被防御性地复制以防止后续修改。可能为null或空。
      返回:
      一个PGPData
      抛出:
      NullPointerException - 如果keyPacketnull
      IllegalArgumentException - 如果keyPacket不符合正确的格式。对于keyPacket,会检查数据包头的格式并验证标签是否为密钥材料类型。不会检查数据包主体的内容和格式。
      ClassCastException - 如果other包含任何不属于XMLStructure类型的条目
    • newRetrievalMethod

      public abstract RetrievalMethod newRetrievalMethod(String uri)
      从指定的URI创建一个RetrievalMethod
      参数:
      uri - 标识要检索的KeyInfo信息的URI
      返回:
      一个RetrievalMethod
      抛出:
      NullPointerException - 如果urinull
      IllegalArgumentException - 如果uri不符合RFC 2396标准
    • newRetrievalMethod

      public abstract RetrievalMethod newRetrievalMethod(String uri, String type, List<? extends Transform> transforms)
      从指定参数创建一个RetrievalMethod
      参数:
      uri - 标识要检索的KeyInfo信息的URI
      type - 标识要检索的KeyInfo信息类型的URI(可能为null
      transforms - 一个Transform列表。列表会被防御性地复制以防止后续修改。可能为null或空。
      返回:
      一个RetrievalMethod
      抛出:
      NullPointerException - 如果urinull
      IllegalArgumentException - 如果uri不符合RFC 2396标准
      ClassCastException - 如果transforms包含任何不属于Transform类型的条目
    • newX509Data

      public abstract X509Data newX509Data(List<?> content)
      包含指定X.509内容列表的X509Data
      参数:
      content - 一个或多个X.509内容类型的列表。有效类型包括String(主题名称)、byte[](主题密钥标识)、X509CertificateX509CRLXMLStructureX509IssuerSerial对象或来自外部命名空间的元素)。主题名称是RFC 2253字符串格式的可分辨名称。实现必须支持RFC 2253中定义的属性类型关键字(CN、L、ST、O、OU、C、STREET、DC和UID)。实现可以支持额外的关键字。列表会被防御性地复制以防止后续修改。
      返回:
      一个X509Data
      抛出:
      NullPointerException - 如果contentnull
      IllegalArgumentException - 如果content为空,或者主题名称不符合RFC 2253标准或其中一个属性类型关键字不被识别。
      ClassCastException - 如果content包含任何不属于上述有效类型的条目
    • newX509IssuerSerial

      public abstract X509IssuerSerial newX509IssuerSerial(String issuerName, BigInteger serialNumber)
      从指定的X.500颁发者可分辨名称和序列号创建一个X509IssuerSerial
      参数:
      issuerName - 颁发者的RFC 2253字符串格式的可分辨名称。实现必须支持RFC 2253中定义的属性类型关键字(CN、L、ST、O、OU、C、STREET、DC和UID)。实现可以支持额外的关键字。
      serialNumber - 序列号
      返回:
      一个X509IssuerSerial
      抛出:
      NullPointerException - 如果issuerNameserialNumbernull
      IllegalArgumentException - 如果颁发者名称不符合RFC 2253标准或其中一个属性类型关键字不被识别。
    • isFeatureSupported

      public abstract boolean isFeatureSupported(String feature)
      指示是否支持指定的特性。
      参数:
      feature - 特性名称(作为绝对URI)
      返回:
      如果支持指定的特性则返回true,否则返回false
      抛出:
      NullPointerException - 如果featurenull
    • getURIDereferencer

      public abstract URIDereferencer getURIDereferencer()
      返回默认用于解除RetrievalMethod对象中URI引用的URIDereferencer的引用。
      返回:
      默认URIDereferencer的引用
    • unmarshalKeyInfo

      public abstract KeyInfo unmarshalKeyInfo(XMLStructure xmlStructure) throws MarshalException
      从特定机制的XMLStructure(例如:DOMStructure)实例中解组一个新的KeyInfo实例。
      参数:
      xmlStructure - 从中解组密钥信息的特定机制的XML结构
      返回:
      KeyInfo
      抛出:
      NullPointerException - 如果xmlStructurenull
      ClassCastException - 如果xmlStructure的类型不适合此工厂
      MarshalException - 如果在解组过程中发生不可恢复的异常