- 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月,基本的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(例如“根”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
-
-
嵌套类汇总
-
嵌套类/接口声明在类 java.security.cert.Certificate
Certificate.CertificateRep
-
-
构造方法摘要
构造方法 变量 构造器 描述 protected
X509Certificate()
X.509证书的构造函数。
-
方法摘要
所有方法 实例方法 抽象方法 具体的方法 变量和类型 方法 描述 abstract void
checkValidity()
检查证书当前是否有效。abstract void
checkValidity(Date date)
检查给定日期是否在证书的有效期内。abstract int
getBasicConstraints()
从关键的BasicConstraints
扩展(OID = 2.5.29.19)获取证书约束路径长度。List<String>
getExtendedKeyUsage()
获取一个不可修改的字符串列表,表示扩展密钥用法扩展的ExtKeyUsageSyntax
字段的OBJECT IDENTIFIER(OID = 2.5.29.37)。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
值(原始签名位)。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)
验证是否使用与指定公钥对应的私钥对此证书进行了签名。-
声明方法的类 java.security.cert.Certificate
equals, getEncoded, getPublicKey, getType, hashCode, toString, verify, verify, writeReplace
-
声明方法的接口 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
提供的是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或3。
-
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编码的签名算法参数。 在大多数情况下,签名算法参数为空; 参数通常随证书的公钥一起提供。 如果需要访问个别参数值,则使用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
字段的OBJECT IDENTIFIER(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 Platform Standard Edition的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。 如果证书的主题是CApathLenConstraint
显示Integer.MAX_VALUE
则返回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 Platform Standard Edition的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 Platform Standard Edition的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
-
-