- 所有已实现的接口:
-
Serializable
,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
- 参见:
-
Nested Class Summary
Nested classes/interfaces declared in class java.security.cert.Certificate
Certificate.CertificateRep
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionabstract void
检查证书当前是否有效。abstract void
checkValidity
(Date date) 检查给定日期是否在证书的有效期内。abstract int
从关键的BasicConstraints
扩展(OID = 2.5.29.19)中获取证书约束路径长度。获取表示扩展密钥用途扩展的ExtKeyUsageSyntax
字段的对象标识符的不可修改字符串列表。Collection
<List<?>> 从IssuerAltName
扩展(OID = 2.5.29.18)中获取发行者替代名称的不可变集合。abstract Principal
已弃用。abstract boolean[]
从证书中获取issuerUniqueID
值。将证书的发行者(发行者可分辨名称)值作为X500Principal
返回。abstract boolean[]
获取表示KeyUsage
扩展(OID = 2.5.29.15)位的布尔数组。abstract Date
从证书的有效期中获取notAfter
日期。abstract Date
从证书的有效期中获取notBefore
日期。abstract BigInteger
从证书中获取serialNumber
值。abstract String
获取证书签名算法的签名算法名称。abstract String
从证书中获取证书签名算法的签名算法OID字符串。abstract byte[]
从此证书的签名算法获取DER编码的签名算法参数。abstract byte[]
从证书中获取signature
值(原始签名位)。Collection
<List<?>> 从SubjectAltName
扩展(OID = 2.5.29.17)中获取主体替代名称的不可变集合。abstract Principal
已弃用。abstract boolean[]
从证书中获取subjectUniqueID
值。将证书的主体(主体可分辨名称)值作为X500Principal
返回。abstract byte[]
获取此证书的DER编码证书信息,即tbsCertificate
。abstract int
从证书中获取version
(版本号)值。void
验证此证书是否使用与指定公钥对应的私钥签名。Methods declared in class java.security.cert.Certificate
equals, getEncoded, getPublicKey, getType, hashCode, toString, verify, verify, writeReplace
Methods declared in class java.lang.Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
Methods declared in interface java.security.cert.X509Extension
getCriticalExtensionOIDs, getExtensionValue, getNonCriticalExtensionOIDs, hasUnsupportedCriticalExtension
-
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
从证书中获取serialNumber
值。序列号是由认证机构分配给每个证书的整数。对于由特定CA签发的每个证书,它必须是唯一的(即,发行者名称和序列号标识唯一证书)。此项的ASN.1定义如下:serialNumber CertificateSerialNumber CertificateSerialNumber ::= INTEGER
- 返回:
- 序列号。
-
getIssuerDN
Deprecated.UsegetIssuerX500Principal()
instead. This method returns theissuer
as an implementation specificPrincipal
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
确定;通常它将是directoryString
。directoryString
通常是PrintableString
、TeletexString
或UniversalString
之一。- 返回:
- 名称为发行者可分辨名称的主体。
-
getIssuerX500Principal
将证书的发行者(发行者可分辨名称)值作为X500Principal
返回。建议子类重写此方法。
- 返回:
-
代表发行者可分辨名称的
X500Principal
- 自 JDK 版本:
- 1.4
-
getSubjectDN
Deprecated.UsegetSubjectX500Principal()
instead. This method returns thesubject
as an implementation specificPrincipal
object, which should not be relied upon by portable code.从证书中获取subject
(主体可分辨名称)值。如果subject
值为空,则返回的Principal
对象的getName()
方法返回空字符串("")。此项的ASN.1定义如下:
subject Name
有关
Name
和其他相关定义,请参见getIssuerDN()
。- 返回:
- 名称为主体名称的主体。
-
getSubjectX500Principal
将证书的主体(主体可分辨名称)值作为X500Principal
返回。如果主体值为空,则返回的X500Principal
对象的getName()
方法返回空字符串("")。建议子类重写此方法。
- 返回:
-
代表主题可分辨名称的
X500Principal
- 自:
- 1.4
-
getNotBefore
从证书有效期获取notBefore
日期。相关的ASN.1定义如下:validity 有效期 Validity ::= SEQUENCE { notBefore CertificateValidityDate, notAfter CertificateValidityDate } CertificateValidityDate ::= CHOICE { utcTime UTCTime, generalTime GeneralizedTime }
- 返回:
- 有效期的开始日期。
- 另请参见:
-
getNotAfter
从证书有效期获取notAfter
日期。有关ASN.1定义,请参见getNotBefore
。- 返回:
- 有效期的结束日期。
- 另请参见:
-
getTBSCertificate
获取此证书的DER编码证书信息,即tbsCertificate
。这可用于独立验证签名。- 返回:
- DER编码的证书信息。
- 抛出:
-
CertificateEncodingException
- 如果发生编码错误。
-
getSignature
public abstract byte[] getSignature()从证书获取signature
值(原始签名位)。此项的ASN.1定义如下:signature BIT STRING
- 返回:
- 签名。
-
getSigAlgName
获取证书签名算法名称。例如,字符串"SHA256withRSA"。此项的ASN.1定义如下:signatureAlgorithm AlgorithmIdentifier AlgorithmIdentifier ::= SEQUENCE { algorithm OBJECT IDENTIFIER, parameters ANY DEFINED BY algorithm OPTIONAL } -- 包含与算法对象标识符值一起使用的类型的值
算法名称由
algorithm
OID字符串确定。- 返回:
- 签名算法名称。
-
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
获取表示扩展密钥用途扩展(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
获取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
获取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
public void verify(PublicKey key, Provider sigProvider) throws CertificateException, NoSuchAlgorithmException, InvalidKeyException, SignatureException 验证此证书是否使用与指定公钥对应的私钥签名。此方法使用指定提供程序提供的签名验证引擎。请注意,指定的Provider对象不必在提供程序列表中注册。此方法已添加到Java平台标准版的1.8版本中。为了与现有服务提供程序保持向后兼容性,此方法不是abstract
,而是提供了默认实现。- 覆盖:
-
verify
在类Certificate
中 - 参数:
-
key
- 用于执行验证的PublicKey。 -
sigProvider
- 签名提供程序。 - 抛出:
-
NoSuchAlgorithmException
- 不支持的签名算法。 -
InvalidKeyException
- 键不正确。 -
SignatureException
- 签名错误。 -
CertificateException
- 编码错误。 -
UnsupportedOperationException
- 如果不支持该方法 - 自:
- 1.8
-
getIssuerX500Principal()
。