Module java.base

Class X509Certificate

java.lang.Object
java.security.cert.Certificate
java.security.cert.X509Certificate
所有已实现的接口:
Serializable, X509Extension

public abstract class X509Certificate extends Certificate implements X509Extension

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

1996年6月,ISO/IEC和ANSI X9完成了基本的X.509 v3格式,下面是在ASN.1中描述的:

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

这些证书被广泛用于支持互联网安全系统中的认证和其他功能。常见的应用包括隐私增强邮件(PEM)、传输层安全(SSL)、用于受信任软件分发的代码签名以及安全电子交易(SET)。

这些证书由证书颁发机构(CAs)管理和担保。CA是通过将数据放置在X.509标准格式中,然后对该数据进行数字签名来创建证书的服务。CA充当受信任的第三方,介绍彼此没有直接了解的主体。CA证书要么由它们自己签名,要么由其他CA(如“根”CA)签名。

更多信息可以在RFC 5280: 互联网X.509公钥基础设施证书和CRL配置文件中找到。

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,
                          -- 如果存在,版本必须是v2或v3
     subjectUniqueID [2]  IMPLICIT UniqueIdentifier OPTIONAL,
                          -- 如果存在,版本必须是v2或v3
     extensions      [3]  EXPLICIT Extensions OPTIONAL
                          -- 如果存在,版本必须是v3
     }
 

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

 try (InputStream inStream = new FileInputStream("fileName-of-cert")) {
     CertificateFactory cf = CertificateFactory.getInstance("X.509");
     X509Certificate cert = (X509Certificate)cf.generateCertificate(inStream);
 }
 
自 JDK 版本:
1.2
参见:
  • Constructor Details

    • X509Certificate

      protected X509Certificate()
      X.509证书的构造函数。
  • Method Details

    • 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 - 如果证书尚未生效。
    • checkValidity

      public abstract void checkValidity(Date date) throws CertificateExpiredException, CertificateNotYetValidException
      检查给定日期是否在证书的有效期内。换句话说,这确定证书在给定日期/时间是否有效。
      参数:
      date - 要检查的日期,以查看证书在该日期/时间是否有效。
      抛出:
      CertificateExpiredException - 如果证书相对于提供的date已过期。
      CertificateNotYetValidException - 如果证书相对于提供的date尚未生效。
      参见:
    • getVersion

      public abstract int getVersion()
      从证书中获取version(版本号)值。此项的ASN.1定义如下:
       version  [0] EXPLICIT Version DEFAULT v1
      
       Version ::=  INTEGER  {  v1(0), v2(1), v3(2)  }
       
      返回:
      版本号,即1、2或3。
    • getSerialNumber

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

      @Deprecated(since="16") public abstract Principal getIssuerDN()
      Deprecated.
      Use getIssuerX500Principal() instead. This method returns the issuer as an implementation specific Principal object, which should not be relied upon by portable code.
      从证书中获取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确定;通常它将是directoryStringdirectoryString通常是PrintableStringTeletexStringUniversalString之一。
      返回:
      名称为发行者可分辨名称的主体。
    • getIssuerX500Principal

      public X500Principal getIssuerX500Principal()
      将证书的发行者(发行者可分辨名称)值作为X500Principal返回。

      建议子类重写此方法。

      返回:
      代表发行者可分辨名称的X500Principal
      自 JDK 版本:
      1.4
    • getSubjectDN

      @Deprecated(since="16") public abstract Principal getSubjectDN()
      Deprecated.
      Use getSubjectX500Principal() instead. This method returns the subject as an implementation specific Principal object, which should not be relied upon by portable code.
      从证书中获取subject(主体可分辨名称)值。如果subject值为空,则返回的Principal对象的getName()方法返回空字符串("")。

      此项的ASN.1定义如下:

       subject    Name
       

      有关Name和其他相关定义,请参见getIssuerDN()

      返回:
      名称为主体名称的主体。
    • getSubjectX500Principal

      public X500Principal getSubjectX500Principal()
      将证书的主体(主体可分辨名称)值作为X500Principal返回。如果主体值为空,则返回的X500Principal对象的getName()方法返回空字符串("")。

      建议子类重写此方法。

      返回:
      代表主题可分辨名称的X500Principal
      自:
      1.4
    • getNotBefore

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

      public abstract Date getNotAfter()
      从证书有效期获取notAfter日期。有关ASN.1定义,请参见getNotBefore
      返回:
      有效期的结束日期。
      另请参见:
    • 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  }
                                   -- 包含与算法对象标识符值一起使用的类型的值
       

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

      返回:
      签名算法名称。
    • getSigAlgOID

      public abstract String getSigAlgOID()
      从证书获取签名算法OID字符串。OID由一组用句点分隔的非负整数表示。例如,字符串"1.2.840.10040.4.3"标识了在RFC 3279: Algorithms and Identifiers for the Internet X.509 Public Key Infrastructure Certificate and CRL Profile中定义的SHA-1与DSA签名算法。

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

      返回:
      签名算法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
      获取表示扩展密钥用途扩展(OID = 2.5.29.37)的ExtKeyUsageSyntax字段的对象标识符的不可修改字符串列表。它指示可用于认证公钥的一个或多个目的,除了或代替密钥用途扩展字段中指示的基本目的。此项的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可能存在的认证路径有多深。只有在cA设置为TRUE时,pathLenConstraint字段(见下文)才有意义。在这种情况下,它指定可以在认证路径中跟随此证书的CA证书的最大数量。值为零表示路径中只能跟随终端实体证书。

      此项的ASN.1定义如下:

       BasicConstraints ::= SEQUENCE {
           cA                  BOOLEAN DEFAULT FALSE,
           pathLenConstraint   INTEGER (0..MAX) OPTIONAL }
       
      返回:
      如果证书中存在BasicConstraints扩展且证书的主体是CA,则返回pathLenConstraint的值;否则返回-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}
      
       OtherName ::= SEQUENCE {
            type-id    OBJECT IDENTIFIER,
            value      [0] EXPLICIT ANY DEFINED BY type-id }
       

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

      RFC 822,DNS和URI名称以String形式返回,使用这些类型的已知字符串格式(受RFC 5280中包含的限制)。IPv4地址名称使用点分十进制表示法返回。IPv6地址名称以"a1:a2:...:a8"形式返回,其中a1-a8是表示地址的八个16位部分的十六进制值。OID名称以由点分隔的一系列非负整数形式的String返回。目录名称(可分辨名称)以RFC 2253字符串格式返回。X.400名称或EDI方名称没有定义标准字符串格式。它们作为包含名称的ASN.1 DER编码形式的字节数组返回。otherNames也作为包含名称的ASN.1 DER编码形式的字节数组返回。列表中还可能存在第三个条目,其中包含otherName的type-id的字符串形式,以及第四个条目,其中包含其value,可以是字符串(如果值是有效支持的字符字符串)或包含值的ASN.1 DER编码形式的字节数组,不包含带有数字0的上下文特定构造标签。

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

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

      实现注意事项:
      JDK SUN提供程序支持第三和第四个otherName条目。
      返回:
      一个不可变的主体替代名称的Collection(或null
      抛出:
      CertificateParsingException - 如果无法解码扩展
      自:
      1.4
    • getIssuerAlternativeNames

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

      IssuerAltName扩展的ASN.1定义如下:

       IssuerAltName ::= GeneralNames
       
      GeneralNames的ASN.1定义在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
    • verify

      验证此证书是否使用与指定公钥对应的私钥签名。此方法使用指定提供程序提供的签名验证引擎。请注意,指定的Provider对象不必在提供程序列表中注册。此方法已添加到Java平台标准版的1.8版本中。为了与现有服务提供程序保持向后兼容性,此方法不是abstract,而是提供了默认实现。
      覆盖:
      verify 在类 Certificate
      参数:
      key - 用于执行验证的PublicKey。
      sigProvider - 签名提供程序。
      抛出:
      NoSuchAlgorithmException - 不支持的签名算法。
      InvalidKeyException - 键不正确。
      SignatureException - 签名错误。
      CertificateException - 编码错误。
      UnsupportedOperationException - 如果不支持该方法
      自:
      1.8