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 3280: Internet X.509 Public Key Infrastructure Certificate and CRL Profile找到。
tbsCertificate的ASN.1 tbsCertificate
是:
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);
}
Certificate
, CertificateFactory
, X509Extension
, Serialized Form
Certificate.CertificateRep
Modifier | Constructor and Description |
---|---|
protected |
X509Certificate()
X.509证书的构造方法。
|
Modifier and Type | Method and Description |
---|---|
abstract void |
checkValidity()
检查证书当前是否有效。
|
abstract void |
checkValidity(Date date)
检查给定日期是否在证书的有效期内。
|
abstract int |
getBasicConstraints()
从关键的
BasicConstraints 扩展名(OID = 2.5.29.19)获取证书约束路径长度。
|
List<String> |
getExtendedKeyUsage()
获取表示扩展密钥使用扩展的
ExtKeyUsageSyntax 字段的对象标识符(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 的有效期获取
notAfter 日期。
|
abstract Date |
getNotBefore()
从
notBefore 的有效期获取
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 获取
version (版本号)值。
|
void |
verify(PublicKey key, Provider sigProvider)
使用与指定公钥对应的私钥验证此证书是否已经签名。
|
equals, getEncoded, getPublicKey, getType, hashCode, toString, verify, verify, writeReplace
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
getCriticalExtensionOIDs, getExtensionValue, getNonCriticalExtensionOIDs, hasUnsupportedCriticalExtension
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
- 如果证书尚未生效。
public abstract void checkValidity(Date date) throws CertificateExpiredException, CertificateNotYetValidException
date
- 在该日期/时间内检查此证书是否有效的日期。
CertificateExpiredException
- 如果证书已经到期提供的
date
。
CertificateNotYetValidException
- 如果证书不符合提供的
date
有效。
checkValidity()
public abstract int getVersion()
version
获取version
(版本号)值。
ASN.1的定义是:
version [0] EXPLICIT Version DEFAULT v1
Version ::= INTEGER { v1(0), v2(1), v3(2) }
public abstract BigInteger getSerialNumber()
serialNumber
值。
序列号是由证书颁发机构分配给每个证书的整数。
对于由给定CA颁发的每个证书(即,发行者名称和序列号标识唯一证书),它必须是唯一的。
ASN.1的定义是:
serialNumber CertificateSerialNumber
CertificateSerialNumber ::= INTEGER
public abstract Principal getIssuerDN()
issuer
作为一个实现特定的Principal对象,不应该由便携式代码依赖。
从issuer
获取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
。
public X500Principal getIssuerX500Principal()
X500Principal
。
建议子类覆盖此方法。
X500Principal
代表发行人的辨别名称
public abstract Principal getSubjectDN()
subject
作为实现特定的Principal对象,不应该由便携式代码依赖。
从subject
获取subject
(主题可分辨名称)值。 如果subject
值为空,则返回的Principal
对象的getName()
方法返回一个空字符串(“”)。
ASN.1的定义是:
subject Name
见getIssuerDN
为Name
和其他相关定义。
public X500Principal getSubjectX500Principal()
X500Principal
。
如果主题值为空,则返回的X500Principal
对象的getName()
方法返回一个空字符串(“”)。
建议子类覆盖此方法。
X500Principal
主题识别名称的X500Principal
public abstract Date getNotBefore()
notBefore
的有效期获取notBefore
日期。
相关的ASN.1定义是:
validity Validity
Validity ::= SEQUENCE {
notBefore CertificateValidityDate,
notAfter CertificateValidityDate }
CertificateValidityDate ::= CHOICE {
utcTime UTCTime,
generalTime GeneralizedTime }
checkValidity()
public abstract Date getNotAfter()
notAfter
的有效期获取notAfter
日期。
见getNotBefore
对相关的ASN.1定义。
checkValidity()
public abstract byte[] getTBSCertificate() throws CertificateEncodingException
tbsCertificate
从此证书。
这可以独立地用于验证签名。
CertificateEncodingException
- 如果发生编码错误。
public abstract byte[] getSignature()
signature
值(原始签名位)。
ASN.1的定义是:
signature BIT STRING
public abstract String getSigAlgName()
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字符串确定。
public abstract String getSigAlgOID()
见getSigAlgName
对相关的ASN.1定义。
public abstract byte[] getSigAlgParams()
AlgorithmParameters
并使用getSigAlgName
返回的名称实例化 。
见getSigAlgName
对相关的ASN.1定义。
public abstract boolean[] getIssuerUniqueID()
issuerUniqueID
值。
颁发者唯一标识符存在于证书中以处理随时间重用发行者名称的可能性。
RFC 3280建议不重复使用该名称,并且符合性证书不会使用唯一标识符。
符合该配置文件的应用程序应能够解析唯一标识符并进行比较。
ASN.1的定义是:
issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL
UniqueIdentifier ::= BIT STRING
public abstract boolean[] getSubjectUniqueID()
subjectUniqueID
值。
ASN.1的定义是:
subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL
UniqueIdentifier ::= BIT STRING
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 3280建议在使用时将其标记为关键扩展。
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
,它提供了默认实现。 子类应该使用正确的实现来覆盖此方法。
CertificateParsingException
- 如果扩展名无法解码
public abstract int getBasicConstraints()
BasicConstraints
扩展名(OID = 2.5.29.19)获取证书约束路径长度。
基本约束扩展标识证书的主体是证书颁发机构(CA),以及证书路径可能通过该CA可能存在多深。 pathLenConstraint
字段(见下文)仅在cA
设置为TRUE时cA
。 在这种情况下,它会给出证书路径中可能遵循此证书的CA证书的最大数量。 值为零表示只有终端实体证书可能在路径中。
ASN.1的定义是:
BasicConstraints ::= SEQUENCE {
cA BOOLEAN DEFAULT FALSE,
pathLenConstraint INTEGER (0..MAX) OPTIONAL }
pathLenConstraint
如果basicConstraints扩展出现在证书和证书的主题中是CA,否则返回-1。
如果该证书的主体是CA和pathLenConstraint
没有出现, Integer.MAX_VALUE
返回,表明没有限制的认证路径的允许长度。
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 3280中的限制)。 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
- 如果扩展名无法解码
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
- 如果扩展名无法解码
public void verify(PublicKey key, Provider sigProvider) throws CertificateException, NoSuchAlgorithmException, InvalidKeyException, SignatureException
abstract
,它提供了默认的实现。
verify
在
Certificate
key
- 用于执行验证的PublicKey。
sigProvider
- 签名提供者。
NoSuchAlgorithmException
- 不支持的签名算法。
InvalidKeyException
- 错误键。
SignatureException
- 签名错误。
CertificateException
- 编码错误。
UnsupportedOperationException
- 如果不支持该方法