x.509標準規定了證書可以包含什麽信息,並說明了記錄信息的方法。
X.509結構中包括版本號(integer)、序列號(integer)、簽名算法(object)、頒布者(set)、有效期(utc_time)、主體(set)、主體公鑰(bit_string)、主體公鑰算法(object)、簽名值(bit_string)。
使用ASN.1描述,我們可以將其抽象為以下結構
Certificate::=SEQUENCE{
tbsCertificate TBSCertificate,
signatureAlgorithm AlgorithmIdentifier,
signatureValue BIT STRING
}
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,
subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL,
extensions [3] EXPLICIT Extensions OPTIONAL
}
`
而本次實驗,我選擇使用從chrome上直接下載證書,此時我們可以看到,證書結構如下:
類 結構 信息 備註
TBSCertificate 版本信息 證書的使用版本 整數格式,0-V1,1-V2,2-V3
TBSCertificate 序列號 每個證書都有壹個唯壹的證書序列號 整數格式
TBSCertificate 簽名算法 得到簽名時使用的算法 有OID與之對應
TBSCertificate 頒發者 命名命規則壹般采用X.500格式 Name
TBSCertificate 有效期 通用的證書壹般采用UTC時間格式,計時範圍為1950-2049 Format:yymmddhhmssZ
TBSCertificate 使用者 使用證書的主體 Name
TBSCertificate 主體密鑰 證書所有人的公開密鑰 ?
Certificate 公鑰簽名算法 證書公鑰的加密算法 有OID與之對應
Certificate 簽名值 得到的簽名結果 ?
二、 數據結構
編碼方法
X509的編碼方法為TLV結構,使用T記錄當前數據的類型(type),使用L記錄當前數據的長度(length),使用V記錄當前數據的取值(value),其中,不同的type值對應不同的數據類型
Type 數據類型 編碼格式
01 Boolean 01;01;FF/00
02 Integer 長度大於7f時,長度n與0x80進行“位或”運算的結果賦給length的第壹個字節
03 Bit string 填充0成為8的倍數,Value的第壹個字節記錄填充數
04 Ectet string 04;len;val
05 Null value部分為空,壹***兩字節
06 Object Identifier V1.V2.V3.V4.V5....Vn (1)計算40*V1+V2作為第壹字節;(2)將Vi(i>=3)表示為128進制,每壹個128進制位作為壹個字節,再將除最後壹個字節外的所有字節的最高位置1;(3)依次排列,就得到了value部分
19 ASCII string 13;len;val
23 UTCtime yymmddhhmssZ
24 Generalize time yyyymmddhhmssZ
48 Sequence constructer 序列內所有項目的編碼的依次排列
49 Set constructer 集合內所有項目的編碼
160 Tag 對於簡單類型,type=80+tag序號;對於構造類型,type=A0+tag序號。length和value不變
數據結構
類的聲明:均使用string類型記錄數據,數據具體的內容已經在註釋中標出