java.lang.Object java.security.cert.X509CertSelector
public class X509CertSelector
选择与所有指定标准匹配的 X509Certificates
的 CertSelector
。从 CertStore
中选择证书以构建一个符合 PKIX 的证书路径时,此类特别有用。
最初构造 X509CertSelector
时,它没有启用任何标准,并且每个 get
方法都返回一个默认值(null
,对于 getBasicConstraints
方法,则返回 -1
)。因此,对于任意 X509Certificate
而言,match
方法都将返回 true
。通常,启用多种标准(例如通过调用 setIssuer
或 setKeyUsage
),然后将 X509CertSelector
传递到 CertStore.getCertificates
或某个类似方法。
可以启用多种标准(例如通过调用 setIssuer
和 setSerialNumber
),这样通常 match
方法会唯一地匹配单个 X509Certificate
。我们在此说“通常”,是因为两个发布证书的 CA 可能具有相同的标识名,并且这两个 CA 发布了具有相同序列号的证书。其他独特的组合包含 issuer、subject、subjectKeyIdentifier 和/或 subjectPublicKey 标准。
有关下面所述各个 X.509 证书扩展的定义,请参阅 RFC 2459。
并发访问
除非另行指定,否则此类中所定义的方法不是线程安全的。需要并发访问单个对象的多个线程应该在它们之间实现同步并提供所需的锁定。对于每个线程都操作一个不同对象的多个线程而言,无需实现同步。
CertSelector
,
X509Certificate
构造方法摘要 | |
---|---|
X509CertSelector() 创建一个 X509CertSelector 。 |
方法摘要 | |
---|---|
void |
addPathToName(int type, byte[] name) 向 pathToNames 标准中添加一个名称。 |
void |
addPathToName(int type, String name) 向 pathToNames 标准中添加一个名称。 |
void |
addSubjectAlternativeName(int type, byte[] name) 向 subjectAlternativeNames 标准中添加一个名称。 |
void |
addSubjectAlternativeName(int type, String name) 向 subjectAlternativeNames 标准中添加一个名称。 |
Object |
clone() 返回此对象的副本。 |
byte[] |
getAuthorityKeyIdentifier() 返回 authorityKeyIdentifier 标准。 |
int |
getBasicConstraints() 返回 BasicConstraints 限制。 |
X509Certificate |
getCertificate() 返回 certificateEquals 标准。 |
Date |
getCertificateValid() 返回 certificateValid 标准。 |
Set<String> |
getExtendedKeyUsage() 返回 extendedKeyUsage 标准。 |
X500Principal |
getIssuer() 以 X500Principal 的形式返回 issuer 标准。 |
byte[] |
getIssuerAsBytes() 返回以 byte 数组表示的 issuer 标准。 |
String |
getIssuerAsString() 已过时,使用 getIssuer() 或 getIssuerAsBytes() 替代。 |
boolean[] |
getKeyUsage() 返回 keyUsage 标准。 |
boolean |
getMatchAllSubjectAltNames() 指示 X509Certificate 是否必须包含 setSubjectAlternativeNames 或 addSubjectAlternativeName 方法中所指定的所有或至少某个 subjectAlternativeNames。 |
byte[] |
getNameConstraints() 返回 NameConstraints 标准。 |
Collection<List<?>> |
getPathToNames() 返回 pathToNames 标准的一个副本。 |
Set<String> |
getPolicy() 返回策略标准。 |
Date |
getPrivateKeyValid() 返回 privateKeyValid 标准。 |
BigInteger |
getSerialNumber() 返回 serialNumber 标准。 |
X500Principal |
getSubject() 以 X500Principal 的形式返回 subject 标准。 |
Collection<List<?>> |
getSubjectAlternativeNames() 返回 subjectAlternativeNames 标准的一个副本。 |
byte[] |
getSubjectAsBytes() 以 byte 数组的形式返回 subject 标准。 |
String |
getSubjectAsString() 已过时,使用 getSubject() 或 getSubjectAsBytes() 替代。 |
byte[] |
getSubjectKeyIdentifier() 返回 subjectKeyIdentifier 标准。 |
PublicKey |
getSubjectPublicKey() 返回 subjectPublicKey 标准。 |
String |
getSubjectPublicKeyAlgID() 返回 subjectPublicKeyAlgID 标准。 |
boolean |
match(Certificate cert) 决定是否应该选择某个 Certificate 。 |
void |
setAuthorityKeyIdentifier(byte[] authorityKeyID) 设置 authorityKeyIdentifier 扩展。 |
void |
setBasicConstraints(int minMaxPathLen) 设置 basicConstraints 限制。 |
void |
setCertificate(X509Certificate cert) 设置 certificateEquals 标准。 |
void |
setCertificateValid(Date certValid) 设置 certificateValid 标准。 |
void |
setExtendedKeyUsage(Set<String> keyPurposeSet) 设置 extendedKeyUsage 标准。 |
void |
setIssuer(byte[] issuerDN) 设置 issuer 标准。 |
void |
setIssuer(String issuerDN) 已过时,使用 setIssuer(X500Principal) 或 setIssuer(byte[]) 替代。 |
void |
setIssuer(X500Principal issuer) 设置 issuer 标准。 |
void |
setKeyUsage(boolean[] keyUsage) 设置 keyUsage 标准。 |
void |
setMatchAllSubjectAltNames(boolean matchAllNames) 允许/禁止匹配 setSubjectAlternativeNames 或 addSubjectAlternativeName 方法中所指定的所有 subjectAlternativeNames。 |
void |
setNameConstraints(byte[] bytes) 设置 NameConstraints 标准。 |
void |
setPathToNames(Collection<List<?>> names) 设置 pathToNames 标准。 |
void |
setPolicy(Set<String> certPolicySet) 设置策略限制。 |
void |
setPrivateKeyValid(Date privateKeyValid) 设置 privateKeyValid 标准。 |
void |
setSerialNumber(BigInteger serial) 设置 serialNumber 标准。 |
void |
setSubject(byte[] subjectDN) 设置 subject 标准。 |
void |
setSubject(String subjectDN) 已过时,使用 setSubject(X500Principal) 或 setSubject(byte[]) 替代。 |
void |
setSubject(X500Principal subject) 设置 subject 标准。 |
void |
setSubjectAlternativeNames(Collection<List<?>> names) 设置 subjectAlternativeNames 标准。 |
void |
setSubjectKeyIdentifier(byte[] subjectKeyID) 设置 subjectKeyIdentifier 标准。 |
void |
setSubjectPublicKey(byte[] key) 设置 subjectPublicKey 标准。 |
void |
setSubjectPublicKey(PublicKey key) 设置 subjectPublicKey 标准。 |
void |
setSubjectPublicKeyAlgID(String oid) 设置 subjectPublicKeyAlgID 标准。 |
String |
toString() 返回该 CertSelector 的可打印表示形式。 |
从类 java.lang.Object 继承的方法 |
---|
equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait |
构造方法详细信息 |
---|
public X509CertSelector()
X509CertSelector
。最初未设置任何标准,所以任何
X509Certificate
都匹配。
方法详细信息 |
---|
public void setCertificate(X509Certificate cert)
X509Certificate
必须等于传入到
match
方法的
X509Certificate
。如果它为
null
,则不进行此项检查。
必需与单个证书匹配时,此方法特别有用。虽然可以与 certificateEquals 标准一起指定其他标准,但这样做通常不实用或不必要。
cert
- 要匹配的
X509Certificate
(或者为
null
)
getCertificate()
public void setSerialNumber(BigInteger serial)
X509Certificate
中的证书 serialNumber 匹配。如果该 serialNumber 为
null
,则与任何证书 serialNumber 匹配都可以。
serial
- 要匹配的证书 serialNumber(或者为
null
)
getSerialNumber()
public void setIssuer(X500Principal issuer)
X509Certificate
中的发布方标识名匹配。如果该发布方标识名为
null
,则与任何发布方 标识名匹配都可以。
issuer
- X500Principal 形式的标识名(或者为
null
)
public void setIssuer(String issuerDN) throws IOException
设置 issuer 标准。指定的标识名必须与 X509Certificate
中的发布方标识名匹配。如果该发布方标识名为 null
,则与任何发布方标识名匹配都可以。
如果 issuerDN
不为 null
,则应该包含一个 RFC 2253 格式的标识名。
issuerDN
- RFC 2253 格式的标识名(或者为
null
)
IOException
- 如果出现解析错误(错误的 DN 形式)
public void setIssuer(byte[] issuerDN) throws IOException
X509Certificate
中的发布方标识名匹配。如果指定了
null
,则禁用 issuer 标准,且与任何发布方标识名匹配都可以。
如果 issuerDN
不为 null
,则应该包含单个 DER 编码形式的标识名,正如 X.501 中定义的一样。此结构的 ASN.1 表示如下:
Name ::= CHOICE {
RDNSequence }
RDNSequence ::= SEQUENCE OF RelativeDistinguishedName
RelativeDistinguishedName ::=
SET SIZE (1 .. MAX) OF AttributeTypeAndValue
AttributeTypeAndValue ::= SEQUENCE {
type AttributeType,
value AttributeValue }
AttributeType ::= OBJECT IDENTIFIER
AttributeValue ::= ANY DEFINED BY AttributeType
....
DirectoryString ::= CHOICE {
teletexString TeletexString (SIZE (1..MAX)),
printableString PrintableString (SIZE (1..MAX)),
universalString UniversalString (SIZE (1..MAX)),
utf8String UTF8String (SIZE (1.. MAX)),
bmpString BMPString (SIZE (1..MAX)) }
注意,要复制此处指定的 byte 数组以防后续修改。
issuerDN
- 一个 byte 数组,包含 ASN.1 DER 编码形式的标识名(或者为
null
)
IOException
- 如果出现编码错误(错误的 DN 形式)
public void setSubject(X500Principal subject)
X509Certificate
中的主体标识名匹配。如果该主体标识名为
null
,则与任何主体标识名匹配都可以。
subject
- X500Principal 形式的标识名(或者为
null
)
public void setSubject(String subjectDN) throws IOException
设置 subject 标准。指定的标识名必须与 X509Certificate
中的 主体标识名匹配。如果该主体标识名为 null
,则与任何主体标识名匹配都可以。
如果 subjectDN
不为 null
,则应该包含一个 RFC 2253 格式的标识名。
subjectDN
- RFC 2253 格式的标识名(或者为
null
)
IOException
- 如果出现解析错误(错误的 DN 形式)
public void setSubject(byte[] subjectDN) throws IOException
X509Certificate
中的主体标识名匹配。如果该主体标识名为
null
,则与任何主体标识名匹配都可以。
如果 subjectDN
不为 null
,则应该包含单个 DER 编码形式的标识名,正如 X.501 中定义的一样。有关此结构的 ASN.1 表示,请参阅 setIssuer(byte [] issuerDN)
。
subjectDN
- 一个 byte 数组,包含 ASN.1 DER 格式的标识名(或者为
null
)
IOException
- 如果出现编码错误(错误的 DN 形式)
public void setSubjectKeyIdentifier(byte[] subjectKeyID)
X509Certificate
必须包含一个 SubjectKeyIdentifier 扩展,且该扩展的内容与指定的标准值匹配。如果该标准值为
null
,则不执行 subjectKeyIdentifier 检查。
如果 subjectKeyID
不为 null
,则应该包含与 SubjectKeyIdentifier 扩展的扩展值内容(不包括对象标识符、关键性设置和封装 OCTET STRING)相对应的 DER 编码形式的值。此结构的 ASN.1 表示如下:
SubjectKeyIdentifier ::= KeyIdentifier
KeyIdentifier ::= OCTET STRING
由于任何标准都没有要求 SubjectKeyIdentifier 的格式,所以 X509CertSelector
不解析 SubjectKeyIdentifier。相反,使用逐字节比较的方式来比较该值。
注意,要复制此处提供的 byte 数组以防后续修改。
subjectKeyID
- SubjectKeyIdentifier(或者为
null
)
getSubjectKeyIdentifier()
public void setAuthorityKeyIdentifier(byte[] authorityKeyID)
X509Certificate
必须包含一个 AuthorityKeyIdentifier 扩展,且该扩展值的内容与指定的标准值匹配。如果该标准值为
null
,则不执行 authorityKeyIdentifier 检查。
如果 authorityKeyID
不为 null
,则应该包含单个与 AuthorityKeyIdentifier 扩展的扩展值内容(不包括对象标识符、关键性设置和封装 OCTET STRING)相对应的 DER 编码形式的值。此结构的 ASN.1 表示如下:
AuthorityKeyIdentifier ::= SEQUENCE {
keyIdentifier [0] KeyIdentifier OPTIONAL,
authorityCertIssuer [1] GeneralNames OPTIONAL,
authorityCertSerialNumber [2] CertificateSerialNumber OPTIONAL }
KeyIdentifier ::= OCTET STRING
X509CertSelector
不解析 AuthorityKeyIdentifier。相反,使用逐字节比较的方式来比较该值。
生成 AuthorityKeyIdentifier
的 keyIdentifier
字段时,通常从发布方证书中的 SubjectKeyIdentifier
扩展中获取该值。但是要注意,在发布方的证书上执行 X509Certificate.getExtensionValue(<SubjectKeyIdentifier Object Identifier>)
所得到的结果可能无法直接用作 setAuthorityKeyIdentifier
的输入。这是因为 SubjectKeyIdentifier 只包含一个 KeyIdentifier OCTET STRING(八位字节字符串),而不是 KeyIdentifier、GeneralNames 和 CertificateSerialNumber 的 SEQUENCE。为了使用发布方证书的 SubjectKeyIdentifier
扩展的扩展值,必需提取嵌入的 KeyIdentifier
OCTET STRING 值,然后将此 OCTET STRING 以 DER 编码方式放入一个 SEQUENCE 中。有关 SubjectKeyIdentifier 的更多详细信息,请参见 setSubjectKeyIdentifier(byte[] subjectKeyID)
。
还要注意,要复制此处提供的 byte 数组以防后续修改。
authorityKeyID
- AuthorityKeyIdentifier(或者为
null
)
getAuthorityKeyIdentifier()
public void setCertificateValid(Date certValid)
X509Certificate
的证书有效期内。如果其值为
null
,则不执行 certificateValid 检查。
注意,要复制此处提供的 Date
以防后续修改。
certValid
- 要检查的
Date
(或者为
null
)
getCertificateValid()
public void setPrivateKeyValid(Date privateKeyValid)
X509Certificate
的私钥有效期内。如果为
null
,则不执行 privateKeyValid 检查。
注意,要复制此处提供的 Date
以防后续修改。
privateKeyValid
- 要检查的
Date
(或者为
null
)
getPrivateKeyValid()
public void setSubjectPublicKeyAlgID(String oid) throws IOException
X509Certificate
必须包含一个具有指定算法的主体公钥。如果其值为
null
,则不执行 subjectPublicKeyAlgID 检查。
oid
- 用于检查的算法的对象标识符 (OID)(或者为
null
)。OID 由一组句点分隔的非负整数来表示。
IOException
- 如果该 OID 无效,例如其第一部分不是 0、1 或 2,或第二部分大于 39。
getSubjectPublicKeyAlgID()
public void setSubjectPublicKey(PublicKey key)
X509Certificate
必须包含指定的主体公钥。如果其值为
null
,则不执行 subjectPublicKey 检查。
key
- 用于检查的 subjectPublicKey(或者为
null
)
getSubjectPublicKey()
public void setSubjectPublicKey(byte[] key) throws IOException
X509Certificate
必须包含指定的主体公钥。如果其值为
null
,则不执行 subjectPublicKey 检查。
因为此方法允许以 byte 数组的方式指定公钥,所以可将其用于未知的密钥类型。
如果 key
不为 null
,则它应该包含单个 DER 编码形式的 SubjectPublicKeyInfo 结构,正如 X.509 中定义的一样。此结构的 ASN.1 表示如下:
SubjectPublicKeyInfo ::= SEQUENCE {
algorithm AlgorithmIdentifier,
subjectPublicKey BIT STRING }
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
注意,要复制此处提供的 byte 数组以防后续修改。
key
- 一个 byte 数组,包含 ASN.1 DER 编码形式的 subjectPublicKey(或者为
null
)
IOException
- 如果出现编码错误(subjectPublicKey 形式不正确)
getSubjectPublicKey()
public void setKeyUsage(boolean[] keyUsage)
X509Certificate
必须允许使用指定的 keyUsage 值。如果其值为
null
,则不执行 keyUsage 检查。注意,没有 keyUsage 扩展的
X509Certificate
隐式地允许使用所有 keyUsage 值。
注意,要复制此处提供的 boolean 数组以防后续修改。
keyUsage
- 一个 boolean 数组,其格式与
X509Certificate.getKeyUsage()
返回的 boolean 数组格式相同。或者为
null
。
getKeyUsage()
public void setExtendedKeyUsage(Set<String> keyPurposeSet) throws IOException
X509Certificate
必须允许其 extendedKeyUsage 扩展中的指定 keyPurpose。如果
keyPurposeSet
为空或为
null
,则不执行 extendedKeyUsage 检查。注意,没有 extendedKeyUsage 扩展的
X509Certificate
隐式地允许所有 keyPurpose。
注意,要复制该 Set
以防后续修改。
keyPurposeSet
- string 格式的 keyPurpose OID 的
Set
(或者为
null
)。每个 OID 都由一组句点分隔的非负整数来表示。
IOException
- 如果该 OID 无效,例如其第一部分不是 0、1 或 2,或第二部分大于 39。
getExtendedKeyUsage()
public void setMatchAllSubjectAltNames(boolean matchAllNames)
setSubjectAlternativeNames
或
addSubjectAlternativeName
方法中所指定的所有 subjectAlternativeNames。如果允许匹配,则
X509Certificate
必须包含所有指定的 subjectAlternativeNames。如果禁止匹配,则
X509Certificate
至少必须包含某个指定的 subjectAlternativeName。
默认情况下,matchAllNames 标志为 true
。
matchAllNames
- 如果为
true
,则启用该标志;如果为
false
,则禁用该标志。
getMatchAllSubjectAltNames()
public void setSubjectAlternativeNames(Collection<List<?>> names) throws IOException
X509Certificate
必须包含所有或至少某个指定的 subjectAlternativeNames,这取决于 matchAllNames 标志的值(参见
setMatchAllSubjectAltNames
)。
此方法允许调用方(使用单个方法调用)为 subjectAlternativeNames 标准指定完整的 subjectAlternativeNames 集。指定的值会替换 subjectAlternativeNames 标准以前的值。
names
参数(如果不为 null
)是一个 Collection
,subjectAlternativeNames 标准中所包括的每个名称都对应该集合中的一项。每一项都是一个 List
,该 List 的第一项是一个 Integer
(0-8,表示名称类型),第二项是一个 String
或 byte 数组(分别为 string 或 ASN.1 DER 编码形式,表示名称)。相同类型可以有多个名称。如果为此参数提供的值为 null
,则不执行 subjectAlternativeNames 检查。
Collection
中的每个 subjectAlternativeNames 都可以指定为一个 String
或 一个 ASN.1 编码的 byte 数组。有关所用格式的更多详细信息,请参阅 addSubjectAlternativeName(int type, String name)
和 addSubjectAlternativeName(int type, byte [] name)
。
注:对于标识名,应指定为 byte 数组,而不是 String。有关更多信息,请参阅 addSubjectAlternativeName(int, String)
中的注视。
注意,names
参数可以包含重复的名称(相同的名称和名称类型),但是可能从 getSubjectAlternativeNames
方法返回的名称 Collection
中将这些名称移除。
注意,要对该 Collection
执行深层复制以防后续修改。
names
- 一个名称
Collection
(或者为
null
)
IOException
- 如果出现解析错误
getSubjectAlternativeNames()
public void addSubjectAlternativeName(int type, String name) throws IOException
X509Certificate
必须包含所有或至少某个指定的 subjectAlternativeNames,这取决于 matchAllNames 标志的值(参见
setMatchAllSubjectAltNames
)。
此方法允许调用方向 subjectAlternativeNames 集中添加一个名称。将指定的名称添加到 subjectAlternativeNames 标准的以前值中。如果指定的名称是重复的,则忽略它。
以 string 格式提供该名称。RFC 822、DNS 和 URI 名称使用这些类型(受 RFC 2459 中所包括的限制的影响)的 string 格式。使用四点表示法(dotted quad notation)提供 IPv4 地址名。OID 地址名用一系列句点分隔的非负整数来表示。以 RFC 2253 格式提供目录名(标识名)。对于 otherNames、X.400 名、EDI 方的名