X509證書結構及解析

2021-09-04 02:17:50 字數 2904 閱讀 5426

x.509標準規定了證書可以包含什麼資訊,並說明了記錄資訊的方法。

x.509結構中包括版本號(integer)、序列號(integer)、簽名演算法(object)、頒布者(set)、有效期(utc_time)、主體(set)、主體公鑰(bit_string)、主體公鑰演算法(object)、簽名值(bit_string)。

使用asn.1描述,我們可以將其抽象為以下結構

certificate::=sequence
tbscertificate::=sequence
結構資訊備註

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資料型別編碼格式

01boolean

01;01;ff/00

02integer

長度大於7f時,長度n與0x80進行「位或」運算的結果賦給length的第乙個位元組

03bit string

填充0成為8的倍數,value的第乙個位元組記錄填充數

04ectet string

04;len;val

05null

value部分為空,一共兩位元組

06object identifier

v1.v2.v3.v4.v5....vn (1)計算40*v1+v2作為第一位元組;(2)將vi(i>=3)表示為128進製,每乙個128進製位作為乙個位元組,再將除最後乙個位元組外的所有位元組的最高位置1;(3)依次排列,就得到了value部分

19ascii string

13;len;val

23utctime

yymmddhhmssz

24generalize time

yyyymmddhhmssz

48sequence constructer

序列內所有專案的編碼的依次排列

49set constructer

集合內所有專案的編碼

160tag

對於簡單型別,type=80+tag序號;對於構造型別,type=a0+tag序號。length和value不變

【資料結構】

類的宣告:均使用string型別記錄資料,資料具體的內容已經在注釋中標出

開啟.cer檔案,選擇按位元組讀取,即每次讀取乙個字元

讀取的整體流程如下:

a) 讀取乙個位元組的type

b) 讀取乙個位元組的length

c) 對type進行判斷:如果type是非標籤的:直接根據型別判斷當前的資料型別是什麼

d) 對real length進行判斷:根據type決定讀取的資料長度,如integer區分長短資料,減去0x80後才是真正的長度值,同時換算出真正的長度

e) 對value進行記錄:根據長度讀入實際的資料,並轉換成自己需要的格式,如06的格式為v11.v2.v3….

每次讀取到value後,直接賦值給證書中的內容,此時,我們首先需要對當前的賦值物件進行判斷

a) 根據證書的結構,我們對讀取的過程劃分為以下階段: "ver", "seq", "sigalg", "iss", "starttime","endtime", "usr", "keyalg",」sigalg」

b) 此時,我們可以根據當前的賦值階段n和此時讀取的資料型別type來判斷當前的賦值物件究竟是什麼,避免產生因為發布者數目不統一而無法讀取所有.cer檔案的問題

p.s. 參考了 並進行了優化

詳見github

X 509證書校驗

x.509證書校驗 這裡討論openssl 中如何應用 crls 和來自證書體系的其他證書來進行證書校驗。為此需要使用 x.509 包的功能函式。ssl協議實現已經處理了很多這裡將要討論的東西,即使如此,一些工作還是需要我們親歷親為,特別是當我們希望在證書校驗過程中使用 crls 的校驗,大部分情況...

x509證書驗證

x509 verify cert函式負責用來驗證證書的有效性,函式原型如下 int x509 verify cert x509 store ctx ctx 驗證成功返回1,失敗返回其他值,失敗的原因可以通過 long ncode x509 store ctx get error ctx const ...

如何使用X 509證書

簡介 在怎樣把x.509證書部署到生產系統之前,你需要了解ssl tsl協議中所支援的認證場景的區別。你部署證書的方式取決於 你選擇的是哪種認證場景。單向認證 在單向認證場景中,伺服器在ssl握手期間會將自己的證書分發給客戶端,以便客戶端能據此驗證目標身份。所以在 此情景下,伺服器相對於客戶端是認證...