Module  java.base
软件包  java.security.cert

Class X509Certificate

  • All Implemented Interfaces:
    SerializableX509Extension


    public abstract class X509Certificate
    extends Certificate
    implements X509Extension

    X.509证书的抽象类。 这提供了访问X.509证书的所有属性的标准方法。

    1996年6月,基本的X.509 v3格式由ISO / IEC和ANSI X9完成,下文将在ASN.1中进行说明:

      Certificate  ::=  SEQUENCE  {
         tbsCertificate       TBSCertificate,
         signatureAlgorithm   AlgorithmIdentifier,
         signature            BIT STRING  } 

    这些证书被广泛用于支持Internet安全系统中的身份验证和其他功能。 通用应用包括隐私增强邮件(PEM),传输层安全性(SSL),可靠软件分发的代码签名和安全电子交易(SET)。

    这些证书由证书颁发机构 (CA)进行管理和验证 CA是通过以X.509标准格式放置数据然后对数据进行数字签名来创建证书的服务。 CA作为可信赖的第三方,引导彼此之间没有直接了解的校长之间。 CA证书是由他们自己签名的,或由其他CA(如“root”)CA签名的。

    更多信息,请参见RFC 5280: Internet X.509 Public Key Infrastructure Certificate and CRL Profile

    tbsCertificate的ASN.1定义是:

      TBSCertificate  ::=  SEQUENCE  {
         version         [0]  EXPLICIT Version DEFAULT v1,
         serialNumber         CertificateSerialNumber,
         signature            AlgorithmIdentifier,
         issuer               Name,
         validity             Validity,
         subject              Name,
         subjectPublicKeyInfo SubjectPublicKeyInfo,
         issuerUniqueID  [1]  IMPLICIT UniqueIdentifier OPTIONAL,
                              -- If present, version must be v2 or v3
         subjectUniqueID [2]  IMPLICIT UniqueIdentifier OPTIONAL,
                              -- If present, version must be v2 or v3
         extensions      [3]  EXPLICIT Extensions OPTIONAL
                              -- If present, version must be v3
         } 

    证书使用证书工厂实例化。 以下是如何实例化X.509证书的示例:

      try (InputStream inStream = new FileInputStream("fileName-of-cert")) {
         CertificateFactory cf = CertificateFactory.getInstance("X.509");
         X509Certificate cert = (X509Certificate)cf.generateCertificate(inStream);
     } 
    从以下版本开始:
    1.2
    另请参见:
    CertificateCertificateFactoryX509ExtensionSerialized Form
    • 构造方法详细信息

      • X509Certificate

        protected X509Certificate​()
        X.509证书的构造方法。
    • 方法详细信息

      • checkValidity

        public abstract void checkValidity​()
                                    throws CertificateExpiredException,
                                           CertificateNotYetValidException
        检查证书当前是否有效。 如果当前日期和时间在证书中给出的有效期内。

        有效期由两个日期/时间值组成:证书有效的第一个和最后一个日期(和时间)。 它在ASN.1中定义为:

          validity             Validity
        
         Validity ::= SEQUENCE {
             notBefore      CertificateValidityDate,
             notAfter       CertificateValidityDate }
        
         CertificateValidityDate ::= CHOICE {
             utcTime        UTCTime,
             generalTime    GeneralizedTime } 
        异常
        CertificateExpiredException - 如果证书已过期。
        CertificateNotYetValidException - 如果证书尚未生效。
      • getVersion

        public abstract int getVersion​()
        获取证书中的version (版本号)值。 ASN.1的定义是:
          version  [0] EXPLICIT Version DEFAULT v1
        
         Version ::=  INTEGER  {  v1(0), v2(1), v3(2)  } 
        结果
        版本号,即1或2。
      • getSerialNumber

        public abstract BigInteger getSerialNumber​()
        从证书中获取serialNumber值。 序列号是由证书颁发机构分配给每个证书的整数。 对于由给定CA颁发的每个证书(即,发行者名称和序列号标识唯一证书),它必须是唯一的。 ASN.1的定义是:
          serialNumber     CertificateSerialNumber
        
         CertificateSerialNumber  ::=  INTEGER 
        结果
        序列号。
      • getIssuerDN

        public abstract Principal getIssuerDN​()
        诋毁 ,取而代之的是getIssuerX500Principal() 该方法返回issuer作为实现特定的Principal对象,不应该由便携式代码依赖。

        从证书获取issuer (发行人可分辨名称)值。 发行人名称标识签发(并签发)证书的实体。

        发行人名称字段包含X.500可分辨名称(DN)。 ASN.1的定义是:

          issuer    Name
        
         Name ::= CHOICE { RDNSequence }
         RDNSequence ::= SEQUENCE OF RelativeDistinguishedName
         RelativeDistinguishedName ::=
             SET OF AttributeValueAssertion
        
         AttributeValueAssertion ::= SEQUENCE {
                                       AttributeType,
                                       AttributeValue }
         AttributeType ::= OBJECT IDENTIFIER
         AttributeValue ::= ANY 
        Name描述了由属性组成的分层名称,例如国家名称和相应的值,例如US。 的类型的AttributeValue分量由确定AttributeType ; 一般来说将会是一个directoryString directoryString通常之一PrintableStringTeletexStringUniversalString
        结果
        一位姓名为发行人名称的校长。
      • getIssuerX500Principal

        public X500Principal getIssuerX500Principal​()
        从证书中返回发行人(发行人可分辨名称)值作为X500Principal

        建议子类覆盖此方法。

        结果
        一个 X500Principal代表发行人的可分辨名称
        从以下版本开始:
        1.4
      • getSubjectDN

        public abstract Principal getSubjectDN​()
        诋毁 ,取而代之的是getSubjectX500Principal() 该方法返回subject作为实现特定的Principal对象,不应该由便携式代码依赖。

        从证书中获取subject (主题可分辨名称)值。 如果subject值为空,则返回的Principal对象的getName()方法返回一个空字符串(“”)。

        ASN.1的定义是:

          subject    Name 

        参见getIssuerDNName等相关定义。

        结果
        名称为主题名称的校长。
      • getSubjectX500Principal

        public X500Principal getSubjectX500Principal​()
        从证书中返回主题(主体可分辨名称)值作为X500Principal 如果主题值为空,则返回的X500Principal对象的getName()方法返回一个空字符串(“”)。

        建议子类覆盖此方法。

        结果
        一个 X500Principal代表主题的专有名称
        从以下版本开始:
        1.4
      • getNotBefore

        public abstract Date getNotBefore​()
        从证书的有效期获取notBefore日期。 相关的ASN.1定义是:
          validity             Validity
        
         Validity ::= SEQUENCE {
             notBefore      CertificateValidityDate,
             notAfter       CertificateValidityDate }
        
         CertificateValidityDate ::= CHOICE {
             utcTime        UTCTime,
             generalTime    GeneralizedTime } 
        结果
        有效期的开始日期。
        另请参见:
        checkValidity()
      • getNotAfter

        public abstract Date getNotAfter​()
        从证书的有效期获取notAfter日期。 有关ASN.1定义,请参见getNotBefore
        结果
        有效期结束日期。
        另请参见:
        checkValidity()
      • getTBSCertificate

        public abstract byte[] getTBSCertificate​()
                                          throws CertificateEncodingException
        从该证书获取DER编码的证书信息, tbsCertificate 这可以独立地用于验证签名。
        结果
        DER编码的证书信息。
        异常
        CertificateEncodingException - 如果发生编码错误。
      • getSignature

        public abstract byte[] getSignature​()
        从证书获取signature值(原始签名位)。 ASN.1的定义是:
          signature     BIT STRING 
        结果
        签名。
      • getSigAlgName

        public abstract String getSigAlgName​()
        获取证书签名算法的签名算法名称。 一个例子是字符串“SHA256withRSA”。 ASN.1的定义是:
          signatureAlgorithm   AlgorithmIdentifier
        
         AlgorithmIdentifier  ::=  SEQUENCE  {
             algorithm               OBJECT IDENTIFIER,
             parameters              ANY DEFINED BY algorithm OPTIONAL  }
                                     -- contains a value of the type
                                     -- registered for use with the
                                     -- algorithm object identifier value 

        算法名称由algorithm OID字符串确定。

        结果
        签名算法名称。
      • getSigAlgParams

        public abstract byte[] getSigAlgParams​()
        从该证书的签名算法获取DER编码的签名算法参数。 在大多数情况下,签名算法参数为null; 参数通常随附证书的公钥一起提供。 如果需要访问个别参数值,则使用AlgorithmParameters与返回的名称进行实例化getSigAlgName

        有关ASN.1定义,请参阅getSigAlgName

        结果
        DER编码的签名算法参数,如果没有参数,则为null。
      • getIssuerUniqueID

        public abstract boolean[] getIssuerUniqueID​()
        从证书中获取issuerUniqueID值。 颁发者唯一标识符存在于证书中以处理随时间重用发行者名称的可能性。 RFC 5280建议不再重复使用名称,并且符合规范的证书不会使用唯一的标识符。 符合该配置文件的应用程序应能够解析唯一标识符并进行比较。

        ASN.1的定义是:

          issuerUniqueID  [1]  IMPLICIT UniqueIdentifier OPTIONAL
        
         UniqueIdentifier  ::=  BIT STRING 
        结果
        颁发者唯一标识符,如果证书中不存在则为null。
      • getSubjectUniqueID

        public abstract boolean[] getSubjectUniqueID​()
        从证书获取subjectUniqueID值。

        ASN.1的定义是:

          subjectUniqueID  [2]  IMPLICIT UniqueIdentifier OPTIONAL
        
         UniqueIdentifier  ::=  BIT STRING 
        结果
        主题唯一标识符,如果证书中不存在则为null。
      • getKeyUsage

        public abstract boolean[] getKeyUsage​()
        获取表示KeyUsage扩展名(OID = 2.5.29.15)的位的布尔数组。 密钥使用扩展定义了证书中包含的密钥的目的(例如,加密,签名,证书签名)。 ASN.1的定义是:
          KeyUsage ::= BIT STRING {
             digitalSignature        (0),
             nonRepudiation          (1),
             keyEncipherment         (2),
             dataEncipherment        (3),
             keyAgreement            (4),
             keyCertSign             (5),
             cRLSign                 (6),
             encipherOnly            (7),
             decipherOnly            (8) } 
        RFC 5280建议在使用时将其标记为关键扩展。
        结果
        该证书的KeyUsage扩展名,表示为一组布尔值。 阵列中KeyUsage值的顺序与上述ASN.1定义相同。 该数组将包含上面定义的每个KeyUsage的值。 如果证书中编码的KeyUsage列表长于上述列表,则不会被截断。 如果此证书不包含KeyUsage扩展名,则返回null。
      • getExtendedKeyUsage

        public List<String> getExtendedKeyUsage​()
                                         throws CertificateParsingException
        获取表示扩展密钥使用扩展的ExtKeyUsageSyntax字段的对象标识符(OID = 2.5.29.37)的字符串的不可修改列表。 它指示除了或代替密钥使用扩展字段中指示的基本目的之外,还可以使用认证公钥的一个或多个目的。 ASN.1的定义是:
          ExtKeyUsageSyntax ::= SEQUENCE SIZE (1..MAX) OF KeyPurposeId
        
         KeyPurposeId ::= OBJECT IDENTIFIER 
        任何有需要的组织都可以定义关键用途。 用于识别关键用途的对象标识符应根据IANA或ITU-T Rec。 X.660 | ISO / IEC / ITU 9834-1。

        该方法被添加到Java 2平台标准版的1.4版本。 为了保持与现有服务提供商的向后兼容性,此方法不是abstract ,它提供了默认的实现。 子类应该使用正确的实现来覆盖此方法。

        结果
        该证书的ExtendedKeyUsage扩展名作为表示为字符串的对象标识符的不可修改列表。 如果此证书不包含ExtendedKeyUsage扩展名,则返回null。
        异常
        CertificateParsingException - 如果扩展名无法解码
        从以下版本开始:
        1.4
      • getBasicConstraints

        public abstract int getBasicConstraints​()
        从关键的BasicConstraints扩展名(OID = 2.5.29.19)获取证书约束路径长度。

        基本约束扩展标识证书的主体是证书颁发机构(CA),以及证书路径可能通过该CA可能存在多深。 pathLenConstraint字段(见下文)只有在cA设置为TRUE时才有意义。 在这种情况下,它会给出证书路径中可能遵循此证书的CA证书的最大数量。 值为零表示只有终端实体证书可能在路径中。

        ASN.1的定义是:

          BasicConstraints ::= SEQUENCE {
             cA                  BOOLEAN DEFAULT FALSE,
             pathLenConstraint   INTEGER (0..MAX) OPTIONAL } 
        结果
        如果BasicConstraints扩展存在于证书中,则该值为pathLenConstraint ,并且证书的主题是CA,否则为-1。 如果该证书的主体是CA和pathLenConstraint没有出现, Integer.MAX_VALUE返回,表明没有限制的认证路径的允许长度。
      • getSubjectAlternativeNames

        public Collection<List<?>> getSubjectAlternativeNames​()
                                                       throws CertificateParsingException
        SubjectAltName扩展名(OID = 2.5.29.17)获取不可变的主题替代名称集合。

        SubjectAltName扩展的ASN.1定义是:

          SubjectAltName ::= GeneralNames
        
         GeneralNames :: = SEQUENCE SIZE (1..MAX) OF GeneralName
        
         GeneralName ::= CHOICE {
              otherName                       [0]     OtherName,
              rfc822Name                      [1]     IA5String,
              dNSName                         [2]     IA5String,
              x400Address                     [3]     ORAddress,
              directoryName                   [4]     Name,
              ediPartyName                    [5]     EDIPartyName,
              uniformResourceIdentifier       [6]     IA5String,
              iPAddress                       [7]     OCTET STRING,
              registeredID                    [8]     OBJECT IDENTIFIER} 

        如果此证书不包含SubjectAltName扩展名,则返回null 否则, Collection返回与表示每个条目GeneralName包含在扩展。 每个条目是List其第一个条目是Integer (名称类型,0-8),第二个条目是String或字节数组(名称,分别为字符串或ASN.1 DER编码形式)。

        RFC 822 ,DNS和URI名称返回为String s,使用完善的字符串格式为这些类型(受到包含在RFC 5280中的限制)。 IPv4地址名称使用虚线四舍五入方法返回。 IPv6地址名称以“a1:a2:...:a8”的形式返回,其中a1-a8是十六进制值,表示地址的8位16位。 OID名称返回为String表示为以句点分隔的一系列非负整数。 并且目录名称(可分辨名称)以RFC 2253字符串格式返回。 没有为其他名称,X.400名称,EDI方名称或任何其他类型的名称定义标准字符串格式。 它们作为包含名称的ASN.1 DER编码形式的字节数组返回。

        请注意,返回的Collection可能包含多个相同类型的名称。 另外,请注意,返回的Collection是不可变的,并且克隆任何包含字节数组的条目以防止后续修改。

        该方法被添加到Java 2平台标准版的1.4版本。 为了保持与现有服务提供商的向后兼容性,此方法不是abstract ,它提供了默认的实现。 子类应该使用正确的实现来覆盖此方法。

        结果
        不可变的 Collection主题备选名称(或 null
        异常
        CertificateParsingException - 如果扩展名无法解码
        从以下版本开始:
        1.4
      • getIssuerAlternativeNames

        public Collection<List<?>> getIssuerAlternativeNames​()
                                                      throws CertificateParsingException
        IssuerAltName扩展名(OID = 2.5.29.18)获取不可变的发行人替代名称集合。

        IssuerAltName扩展的ASN.1定义是:

          IssuerAltName ::= GeneralNames 
        的ASN.1定义GeneralNames中定义getSubjectAlternativeNames

        如果此证书不包含IssuerAltName扩展名,则返回null 否则, Collection返回与表示每个条目GeneralName包含在扩展。 每个条目是一个List其第一个条目是Integer (名称类型,0-8),其第二个条目是String或字节数组(名称,分别为字符串或ASN.1 DER编码形式)。 有关每种名称类型使用的格式的详细信息,请参阅getSubjectAlternativeNames方法。

        请注意,返回的Collection可能包含多个相同类型的名称。 另外,请注意,返回的Collection是不可变的,并且克隆了包含字节数组的任何条目以防止后续修改。

        该方法被添加到Java 2平台标准版的1.4版本。 为了保持与现有服务提供商的向后兼容性,此方法不是abstract ,它提供了默认的实现。 子类应该使用正确的实现来覆盖此方法。

        结果
        发行人替代名称不可变 Collection (或 null
        异常
        CertificateParsingException - 如果扩展名无法解码
        从以下版本开始:
        1.4