- java.lang.Object
-
- java.security.cert.Certificate
-
- java.security.cert.X509Certificate
-
- All Implemented Interfaces:
-
Serializable
,X509Extension
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
- 另请参见:
-
Certificate
,CertificateFactory
,X509Extension
, Serialized Form
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from class java.security.cert.Certificate
Certificate.CertificateRep
-
-
构造方法摘要
构造方法 Modifier Constructor 描述 protected
X509Certificate()
X.509证书的构造方法。
-
方法摘要
所有方法 接口方法 抽象方法 具体的方法 Modifier and Type 方法 描述 abstract void
checkValidity()
检查证书当前是否有效。abstract void
checkValidity(Date date)
检查给定日期是否在证书的有效期内。abstract int
getBasicConstraints()
从关键的BasicConstraints
扩展名(OID = 2.5.29.19)获取证书约束路径长度。List<String>
getExtendedKeyUsage()
获取表示扩展密钥使用扩展(OID = 2.5.29.37)的ExtKeyUsageSyntax
字段的OBJECT IDENTIFIER的字符串的不可修改列表。Collection<List<?>>
getIssuerAlternativeNames()
从IssuerAltName
扩展名(OID = 2.5.29.18)获取不可变的发行人替代名称集合。abstract Principal
getIssuerDN()
诋毁 ,取而代之的是 getIssuerX500Principal() 。abstract boolean[]
getIssuerUniqueID()
从证书获取issuerUniqueID
价值。X500Principal
getIssuerX500Principal()
从证书中返回发行人(发行人可分辨名称)值为X500Principal
。abstract boolean[]
getKeyUsage()
获取表示KeyUsage
扩展名(OID = 2.5.29.15)的位的布尔数组。abstract Date
getNotAfter()
从证书的有效期获取notAfter
日期。abstract Date
getNotBefore()
从证书的有效期获取notBefore
日期。abstract BigInteger
getSerialNumber()
获取证书中的serialNumber
值。abstract String
getSigAlgName()
获取证书签名算法的签名算法名称。abstract String
getSigAlgOID()
从证书获取签名算法OID字符串。abstract byte[]
getSigAlgParams()
从该证书的签名算法获取DER编码的签名算法参数。abstract byte[]
getSignature()
获取signature
中的signature
值(原始签名位)。Collection<List<?>>
getSubjectAlternativeNames()
从SubjectAltName
扩展名(OID = 2.5.29.17)获取不可变的主题替代名称集合。abstract Principal
getSubjectDN()
诋毁 ,取而代之的是 getSubjectX500Principal() 。abstract boolean[]
getSubjectUniqueID()
从证书获取subjectUniqueID
价值。X500Principal
getSubjectX500Principal()
从证书返回主题(主体可分辨名称)值作为X500Principal
。abstract byte[]
getTBSCertificate()
从该证书获取DER编码的证书信息,tbsCertificate
。abstract int
getVersion()
从证书获取version
(版本号)值。void
verify(PublicKey key, Provider sigProvider)
使用与指定公钥对应的私钥验证此证书是否已经签名。-
Methods inherited from class java.security.cert.Certificate
equals, getEncoded, getPublicKey, getType, hashCode, toString, verify, verify, writeReplace
-
Methods inherited from class java.lang.Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
-
Methods inherited from interface java.security.cert.X509Extension
getCriticalExtensionOIDs, getExtensionValue, getNonCriticalExtensionOIDs, hasUnsupportedCriticalExtension
-
-
-
-
方法详细信息
-
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
有效。 - 另请参见:
-
checkValidity()
-
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
通常之一PrintableString
,TeletexString
或UniversalString
。- 结果
- 一位姓名为发行人名称的校长。
-
getIssuerX500Principal
public X500Principal getIssuerX500Principal()
从证书中返回发行人(发行人可分辨名称)值作为X500Principal
。建议子类覆盖此方法。
- 结果
-
一个
X500Principal
代表发行人的可分辨名称 - 从以下版本开始:
- 1.4
-
getSubjectDN
public abstract Principal getSubjectDN()
诋毁 ,取而代之的是getSubjectX500Principal() 。 该方法返回subject
作为实现特定的Principal对象,不应该由便携式代码依赖。从证书中获取
subject
(主题可分辨名称)值。 如果subject
值为空,则返回的Principal
对象的getName()
方法返回一个空字符串(“”)。ASN.1的定义是:
subject Name
参见
getIssuerDN
和Name
等相关定义。- 结果
- 名称为主题名称的校长。
-
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字符串确定。- 结果
- 签名算法名称。
-
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中定义的具有DSA签名算法的SHA-1。有关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
获取表示扩展密钥使用扩展的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
-
verify
public void verify(PublicKey key, Provider sigProvider) throws CertificateException, NoSuchAlgorithmException, InvalidKeyException, SignatureException
使用与指定公钥对应的私钥验证此证书是否已经签名。 此方法使用指定提供商提供的签名验证引擎。 请注意,指定的Provider对象不必在提供者列表中注册。 该方法被添加到Java Platform Standard Edition的1.8版本。 为了保持与现有服务提供商的向后兼容性,此方法不是abstract
,它提供了默认的实现。- 重写:
-
verify
在Certificate
- 参数
-
key
- 用于执行验证的PublicKey。 -
sigProvider
- 签名提供者。 - 异常
-
NoSuchAlgorithmException
- 不支持的签名算法。 -
InvalidKeyException
- 键错误。 -
SignatureException
- 签名错误。 -
CertificateException
- 编码错误。 -
UnsupportedOperationException
- 如果不支持该方法 - 从以下版本开始:
- 1.8
-
-