JavaTM 2 Platform
Standard Ed. 6

java.security.cert
類別 X509Certificate

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 月,ISO/IEC 和 ANSI X9 完成了基本的 X.509 v3 格式,在 ASN.1 中描述如下:

 Certificate  ::=  SEQUENCE  {
     tbsCertificate       TBSCertificate,
     signatureAlgorithm   AlgorithmIdentifier,
     signature            BIT STRING  }
 

這些證書被廣泛使用以支持 Internet 安全系統中的身份驗證和其他功能。常見的應用包括增強保密郵件 (PEM)、傳輸層安全 (SSL)、用於受信任軟體發佈的程式碼簽章和安全電子交易 (SET)。

證書頒發機構 (CA) 來管理和擔保這些證書。CA 的工作是創建證書,方法是將資料置於 X.509 標準格式,然後以數字方式簽署該資料。CA 充當受信任的第三方,在不能直接通信的主體之間傳遞資訊。CA 證書可由其自身簽章,也可由其他 CA 簽章,如“根”CA。

在 RFC 2459,即 "Internet X.509 Public Key Infrastructure Certificate and CRL Profile"(位於 http://www.ietf.org/rfc/rfc2459.txt )中可找到更多資訊。

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 證書。

 
 InputStream inStream = new FileInputStream("fileName-of-cert");
 CertificateFactory cf = CertificateFactory.getInstance("X.509");
 X509Certificate cert = (X509Certificate)cf.generateCertificate(inStream);
 inStream.close();
 

另請參見:
Certificate, CertificateFactory, X509Extension, 序列化表格

巢狀類別摘要
 
從類別 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()
          獲取一個不可修改的 String 列表,表示已擴展的密鑰使用擴展 (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) 的各個位的 boolean 陣列。
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(版本號)值。
 
從類別 java.security.cert.Certificate 繼承的方法
equals, getEncoded, getPublicKey, getType, hashCode, toString, verify, verify, writeReplace
 
從類別 java.lang.Object 繼承的方法
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
 
從介面 java.security.cert.X509Extension 繼承的方法
getCriticalExtensionOIDs, getExtensionValue, getNonCriticalExtensionOIDs, hasUnsupportedCriticalExtension
 

建構子詳細資訊

X509Certificate

protected X509Certificate()
X.509 證書的建構子。

方法詳細資訊

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 - 要檢查的 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 或 3。

getSerialNumber

public abstract BigInteger getSerialNumber()
獲取證書的 serialNumber 值。序列號是證書頒發機構為每個證書所分派的一個整數。給定的 CA 所發佈的每個證書的序列號必須是唯一的(即發佈方名稱和序列號標識一個唯一的證書)。此內容的 ASN.1 定義如下:
 serialNumber     CertificateSerialNumber

CertificateSerialNumber ::= INTEGER

返回:
序列號。

getIssuerDN

public abstract Principal getIssuerDN()
已過時,由 getIssuerX500Principal() 替代。此方法返回作為特定 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 來確定;一般是 directoryStringdirectoryString 通常是 PrintableStringTeletexStringUniversalString 之一。

返回:
一個 Principal,其名稱是發佈方的標識名。

getIssuerX500Principal

public X500Principal getIssuerX500Principal()
X500Principal 的形式返回證書的發佈方(發佈方標識名)值。

建議子類別覆寫此方法。

返回:
一個表示發佈方標識名的 X500Principal
從以下版本開始:
1.4

getSubjectDN

public abstract Principal getSubjectDN()
已過時,由 getSubjectX500Principal() 替代。此方法返回作為特定 Principal 物件實作的 subject,可移植的程式碼不應依靠該物件。

獲取證書的 subject(主體的標識名)值。如果 subject 值為空,則返回的 Principal 物件的 getName() 方法將返回一個空字元串 ("")。

此內容的 ASN.1 定義如下:

 subject    Name
 

有關 Name 和其他相關定義的資訊,請參見 getIssuerDN

返回:
一個 Principal,其名稱是主體名。

getSubjectX500Principal

public X500Principal getSubjectX500Principal()
X500Principal 的形式返回證書的主體(主體標識名)值。如果 subject 值為空,則返回的 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()
獲取證書籤名演算法的簽章演算法名。例如字元串 "SHA-1/DSA"。此內容的 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 由一組句點分隔的非負整數集來表示。例如,按照 RFC 2459 中的規定,字元串 "1.2.840.10040.4.3" 標識使用 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 2459 建議不重用該名稱,並建議合格的證書不要使用唯一標識符。遵守該配置檔案的應用程序應該能夠解析唯一標識符並進行比較。

此內容的 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) 的各個位的 boolean 陣列。KeyUsage 擴展定義證書中所含密鑰的目的(如編碼、簽章、證書籤署)。此內容的 ASN.1 定義如下:
 KeyUsage ::= BIT STRING {
     digitalSignature        (0),
     nonRepudiation          (1),
     keyEncipherment         (2),
     dataEncipherment        (3),
     keyAgreement            (4),
     keyCertSign             (5),
     cRLSign                 (6),
     encipherOnly            (7),
     decipherOnly            (8) }
 
RFC 2459 建議,使用該擴展時將其標記為關鍵擴展。

返回:
此證書的 KeyUsage 擴展,以 boolean 陣列的形式表示。該陣列中 KeyUsage 值的順序與上面 ASN.1 定義中的順序相同。該陣列將包含上面定義的每個 KeyUsage 的值。如果證書中編碼的 KeyUsage 列表要比上面的列表長,則不會截取它。如果此證書不包含 KeyUsage 擴展,則返回 null。

getExtendedKeyUsage

public List<String> getExtendedKeyUsage()
                                 throws CertificateParsingException
獲取一個不可修改的 String 列表,表示已擴展的密鑰使用擴展 (OID = 2.5.29.37) 中 ExtKeyUsageSyntax 欄位的物件標識符(OBJECT IDENTIFIER)。除了或代替 KeyUsage 擴展欄位中所指示的基本目的,它還指示了一個或多個使用已認證公鑰的目的。此內容的 ASN.1 定義如下:
 ExtKeyUsageSyntax ::= SEQUENCE SIZE (1..MAX) OF KeyPurposeId

KeyPurposeId ::= OBJECT IDENTIFIER

任何有需要的組織都可定義 KeyPurpose。依照 IANA 或 ITU-T Rec X.660 | ISO/IEC/ITU 9834-1 的規定分派用於標識 KeyPurpose 的物件標識符

Java 2 Platform Standard Edition 的 1.4 版本中添加了此方法。為了維持與現有服務提供者的後向相容性,沒有 abstract 此方法,並且它提供了一個預設實作。子類別應該通過正確的實作覆寫此方法。

返回:
以 String 表示的、物件標識符不可修改的列表形式返回此證書的 ExtendedKeyUsage 擴展。如果此證書不包含 ExtendedKeyUsage 擴展,則返回 null。
拋出:
CertificateParsingException - 如果無法對該擴展進行解碼
從以下版本開始:
1.4

getBasicConstraints

public abstract int getBasicConstraints()
從關鍵 BasicConstraints 擴展 (OID = 2.5.29.19) 中獲取證書的限制路徑長度。

BasicConstraints 擴展標識證書的主體是否為一個證書頒發機構 (CA),以及通過該 CA 的證書路徑的深度。僅在將 cA 設置為 TRUE 時,pathLenConstraint 欄位(參見以下內容)才有意義。在這種情況下,它給出證書路徑中此證書後面的最大 CA 證書數。值為零指示路徑中只有一個終端實體證書。

注意,對於 RFC 2459,如果 cA 為 TRUE(意味著此證書屬於證書頒發機構),則始終將此擴展標記為關鍵的。

此內容的 ASN.1 定義如下:

 BasicConstraints ::= SEQUENCE {
     cA                  BOOLEAN DEFAULT FALSE,
     pathLenConstraint   INTEGER (0..MAX) OPTIONAL }
 

返回:
如果證書中有 BasicConstraints 擴展並且該證書的主體是 CA,則返回 pathLenConstraint 的值;否則返回 -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,該 List 的第一項是一個 Integer(0-8,表示名稱型別),第二項是一個 String 或 byte 陣列(分別為 string 或 ASN.1 DER 編碼形式,表示名稱)。

RFC 822、DNS 和 URI 名稱是使用這些型別已定義的 string 格式(受 RFC 2459 中所包括的限制的影響)以 String 的形式返回的。使用四點表示法(dotted quad notation)返回 IPv4 位址名。以 "a1:a2:...:a8" 的形式返回 IPv6 位址名,其中 a1-a8 是十六進制值,表示該位址的 8 個 16 位部分。以 String 形式返回 OID 名稱,該字元串用一系列句點分隔的非負整數來表示。以 RFC 2253 string 格式返回目錄名(標識名)。沒有為 otherNames、X.400 名、EDI 方名或其他全部類別型的名稱定義標準的 string 格式。它們是以 byte 陣列的形式返回的,其中包含 ASN.1 DER 編碼形式的名稱。

注意,返回的 Collection 可能包含多個相同型別的名稱。另外還要注意,返回的 Collection 是不可變的,並且將複製 byte 陣列中所包含的所有項,以防止後續的修改。

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
 
getSubjectAlternativeNames 中定義了 GeneralNames 的 ASN.1 定義。

如果此證書不包含 IssuerAltName 擴展,則返回 null。否則返回一個 Collection,其中的項表示該擴展中所包括的每個 GeneralName。每一項都是一個 List,該 List 的第一項是一個 Integer(0-8,表示名稱型別),第二項是一個 String 或 byte 陣列(分別為 string 或 ASN.1 DER 編碼形式,表示名稱)。有關每種名稱型別所用格式的更多細節,請參見 getSubjectAlternativeNames 方法。

注意,返回的 Collection 可能包含多個相同型別的名稱。另外還要注意,返回的 Collection 是不可變的,並且將複製 byte 陣列中所包含的所有項,以防止後續的修改。

Java 2 Platform Standard Edition 的 1.4 版本中添加了此方法。為了維持與現有服務提供者的後向相容性,沒有 abstract 此方法,並且它提供了一個預設實作。子類別應該通過正確的實作覆寫此方法。

返回:
發佈方替換名稱的不可變 Collection(或者為 null
拋出:
CertificateParsingException - 如果無法對該擴展進行解碼
從以下版本開始:
1.4

JavaTM 2 Platform
Standard Ed. 6

提交錯誤或意見

版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only