簡述
本文主要介紹ASN.1分析X509證書。
X.509證書格式
Cer/crt用于保存證書,并以沒有私鑰的二進制數(shù)存儲。
X.509證書詳細解析
Certificate ::= sequence {
tbsCertificate TBSCertificate, -- 證書主體
signatureAlgorithm AlgorithmIdentifier, -- 證書簽名算法標識
signatureValue BIT STRING --證書簽名值,是使用signatureAlgorithm部分指定的簽名算法對tbsCertificate證書主題部分簽名后的值。
}
TBSCertificate ::= SEQUENCE {
version [0] EXPLICIT Version DEFAULT v1, -- 證書版本號
serialNumBER CertificateSerialNumber, -- 證書序列號,對同一CA所頒發(fā)的證書,序列號唯一標識證書
signature AlgorithmIdentifier, --證書簽名算法標識
issuer Name, --證書發(fā)行者名稱
validity Validity, --證書有效期
subject Name, --證書主體名稱
subjectPublicKeyInfo SubjectPublicKeyInfo, --證書公鑰
issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL, -- 證書發(fā)行者ID(可選),只在證書版本2、3中才有
subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL, -- 證書主體ID(可選),只在證書版本2、3中才有
extensions [3] EXPLICIT Extensions OPTIONAL
-- 證書擴展段(可選),只在證書版本3中才有
}
其中:
Version ::= INTEGER { v1(0), v2(1), v3(2) }
AlgorithmIdentifier ::= SEQUENCE {
algorithm OBJECT IDENTIFIER, -- 證書主體持有的公鑰密碼算法
parameters ANY DEFINED BY algorithm OPTIONAL } -- 參數(shù)任意有算法定義可選
ASN.1編碼規(guī)則
–基本編碼規(guī)則(BER)[定義了一種或者幾種方法,使用ASN.1語法將數(shù)據(jù)對象轉換成二進制字節(jié)碼]
–唯一編碼規(guī)則(DER)[BER的子集,定義了唯一一種方法,使用ASN.1講數(shù)據(jù)對象轉換成二進制字節(jié)碼]
–規(guī)范編碼規(guī)則(CER)
–壓縮編碼規(guī)則(PER)
–XML編碼規(guī)則(XER)
BER基本規(guī)則
BER是ASN.1最早定義的編碼規(guī)則。BER傳輸語法的格式一直是TLV三元組
- 短格式
length<=127
舉例:
length=35
35轉16進制為23
35的長度域表示為:100011 為[0010 0011]
- 長格式
length>127
舉例:
length = 169 轉換為 81 A9
(169長度超過127,長度域為1000 0001 1010 1001;
169是后8位的值,前8位的第一個1表示這是一個長格式的表示方法,前8位的后7位表示后面有多少個字節(jié)表示針對的長度000 0001后面有一個字節(jié)表示真正的長度 1010 1001是表示長度為169)
length=1500=>82 05 DC(1000 0010 0000 0101 1101 1100,先看第一個字節(jié),表示長格式,后面有2 個字節(jié)表示長度,這兩個字節(jié)是0000 0101 1101 1100 表示1500)
- context[]
[0] –- 表示證書的版本
[1] –- issuerUniqueID,表示證書發(fā)行者的唯一id
[2] –- subjectUniqueID,表示證書主體的唯一id
[3] –- 表示證書的擴展字段
ASN1view分析證書
- ASN.1常用標記符示例
0x02:Integer(整數(shù),包括正數(shù)和負數(shù))
0x03:Bit String(任意的01比特流)
0x04:OCTET String(任意的字節(jié)流)
0x05:NULL(只包含一個值NULL,用于傳送一個報告或者作為CHOICE類型中的某些值)
0x06:Object Identifier(對象標識符)
0x12:UTF8 String
0x13:Printable String
0x17:UTC Time(時間類型)
0x30:Sequence(順序類型)
0x31:Set(集合類型)
證書信息本身是一個SEQUENCE,里面有兩個SEQUENCE和一個BIT STRING組成.
其中,第一個SEQUENCE是待簽的證書,tbsCertificate=TO BE Signed Certificate;第二個SEQUENCE是簽名算法,就是CA準備采用什么簽名算法對tbsCertificate進行簽名;第三個BIT STRING是簽名信息,就是CA對tbsCertificate通過signatureAlgorithm簽名算法簽出來的簽名信息。
其中tbsCertificate又包含了一下內(nèi)容:
- Version
version 是一個ASN1 INTEGER類型(0x02),長度是1(0x1), 數(shù)據(jù)是0x2,說明版本號是x509v3
- SerialNumber
序列號也是一個ASN1 INTEGER類型,長度是5, 數(shù)據(jù)是53ad44bcab就是359389248683(10進制轉10進制)
- AlgorithmIdentifier
在www.OID-in上查詢這個OID:1.2.840.113549.1.1.5的結果,它代表的是
sha1-with-rsa-signature(5)
[other identifiers: sha1WithRSAEncryption, sha-1WithRSAEncryption]
即使用了SHA1摘要算法的RSA簽名算法
- issuer
issuer由一個sequence組成,sequence下面有N個set,set下又跟了一個sequence。其中一個set代表一個字段,如下圖,第一個set代表CN;在set下的sequence中又包含一個OBject Identifier(簡稱:OID)、UTF8String
查詢OID:2.5.4.3
commonName(3)
[other identifier: cn]
在UTF8String中查看value:RSA_CA_SUB。
以此類推set,可得出完整的頒發(fā)者。
備注:
- validity
2049年以前的有效期用UTCTime格式編碼.2050及之后的時間必須使用GeneralizedTime 類型。這兩種的主要區(qū)別在于前者用兩個數(shù)字來表示年.而后者用4個數(shù)字
UCTime:世界時間類型
GeneralizedTime:通用的時間類型
UTCtime格式如下多種:
YYMMDDhhmmZ
YYMMDDhhmm+hh'mm'
YYMMDDhhmm-hh'mm'
YYMMDDhhmmssZ
YYMMDDhhmmss+hh'mm'
YYMMDDhhmmss-hh'mm'
其中,
YY:當YY大于或者等于50年,年應該解釋為19YY,當YY不到50,年應該解釋為20YY
MM:月,01-12
DD:日,01-31
hh:小時,00-23
mm:分鐘,00-59
ss:秒,00-59
Z/+/-:Z表示GMT時間,+/-表示本地時間與GMT時間的差距
hh':與GMT的差
mm':與GMT的差
則:200827230643Z 為:
YY:20年
MM:08月
DD:27日
hh:23時(23時+8時=7時)
MM:06分
ss:43秒
- subject Name
和頒發(fā)者Dn類似
- Subject Public Key Info
證書公鑰信息中的BIT STRING就是公鑰的二進制
- extensions
擴展信息
OID的計算方式
對象標識符(OID),是一個用"."隔開的非負整數(shù)組成的序列。下面說下OID的編碼設計:設OID=V1.V2.V3.V4.V5....Vn,則DER編碼的value部分規(guī)則如下:(1)計算40*V1+V2作為第一字節(jié);(2)將Vi(i>=3)表示為128進制,每一個128進制位作為一個字節(jié),再將除最后一個字節(jié)外的所有字節(jié)的最高位置1;(3)依次排列,就得到了value部分。舉例:OID=1.2.840.11359.1.1的編碼如下:
其中高位進1的意思為:
【0x01 0x1c】對0x01進行進1
0的2進制為 0000-------高位進1------1000------轉16進制為8
【0x4f 0x55】
4的二進制為 0100 --------高位進1-------1100------轉16進制為c
【0x06 0x77 0x0d】
0的二進制為 0000---------高位進1-------1000------轉16進制為8
7的二進制為 0111---------高位進1-------1111------轉16進制為f
備注:
10進制如何轉16進制
16進制數(shù):
10進制數(shù):1 2 3 4 5 6 7 8 9
16進制數(shù):1 2 3 4 5 6 7 8 9
10進制數(shù):10 11 12 13 14 15
16進制數(shù): A B C D E F
1.《100011專題之ASN.1分析X509證書》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡信息知識,僅代表作者本人觀點,與本網(wǎng)站無關,侵刪請聯(lián)系頁腳下方聯(lián)系方式。
2.《100011專題之ASN.1分析X509證書》僅供讀者參考,本網(wǎng)站未對該內(nèi)容進行證實,對其原創(chuàng)性、真實性、完整性、及時性不作任何保證。
3.文章轉載時請保留本站內(nèi)容來源地址,http://f99ss.com/gl/2031976.html