X.509證書的讀取與解釋
X.509證書的讀取與解釋
原始碼傳送門:https://github.com/dick20/Web-Security/tree/master/GetX.509
一.X.509 證書結構描述
證書的結構如下所示:
Certificate
- Version
- Serial Number
- Algorithm ID
- Issuer (CA’s name)
- Validity
- Not Before
- Not After
- Subject
- Subject Public Key Info
- Public Key Algorithm
- Subject Public Key
- Issuer Unique Identifier (Optional)
- Subject Unique Identifier (Optional)
- Extensions (Optional)
- Certificate Signature Algorithm
- Certificate Signature
解釋:
-
Version 版本號:標識證書的版本(版本1、版本2或是版本3)。
-
Serial Number 序列號:標識證書的唯一整數,由證書頒發者分配的本證書的唯一識別符號。
-
Algorithm ID:演算法ID: 標識證書演算法
-
Issuer (CA’s name) 頒發者:證書頒發者的可識別名(DN)。
-
Validity 有效期:證書有效期的時間段。本欄位由”Not Before”和”Not After”兩項組成,它們分別由UTC時間或一般的時間表示。
-
Subject 主體:證書擁有者的可識別名,這個欄位必須是非空的,除非你在證書擴充套件中有別名。
-
Subject Public Key Info 主體公鑰資訊: 主體的公鑰(以及演算法識別符號)。
-
Issuer Unique Identifier (Optional) 頒發者唯一識別符號:識別符號—證書頒發者的唯一識別符號,僅在版本2和版本3中有要求,屬於可選項。
-
Subject Unique Identifier (Optional) 主體唯一識別符號:證書擁有者的唯一識別符號,僅在版本2和版本3中有要求,屬於可選項。
-
Extensions (Optional) X.509證書擴充套件部分
-
Certificate Signature Algorithm 簽名認證演算法
-
Certificate Signature 認證簽名
二.資料結構
這次我讀取證書使用的是JAVA語言,使用java中一些證書的包,其中包括
import java.security.*;
import java.io.*;
import java.security.cert.*;
import java.security.cert.Certificate;
利用java中的CertificateFactory來獲取X.509證書的工廠的例項
還使用了String陣列與Byte陣列來進行對資料處理,輸出。
利用檔案流讀入證書來進行處理,FileInputStream的使用。
三.原始碼
1.獲取證書的過程
step1:點選網站的地址左邊的感嘆號,找到證書的入口。
step2:點選證書後,找到詳細資訊,找到複製到檔案入口
step3:選擇格式,點選下一步,然後選擇路徑即可
2.處理證書
首先將獲取到的證書放到合適的相對路徑下,便於讀入。CertificateFactory來獲取X.509證書的工廠的例項,然後利用FileInputStream讀入我從csdn網站拿下來的證書。
最後利用cf生成證書,接著用X509Certificate來將證書轉變型別。
這樣,我們就得到了X.509的證書例項了。
public static void main(String[] args) throws IOException {
CertificateFactory cf;
try {
// 獲取工廠例項
cf = CertificateFactory.getInstance("X.509");
// 用檔案流讀入證書
FileInputStream in=new FileInputStream("out.cer");
// 生成證書
Certificate c=cf.generateCertificate(in);
X509Certificate t=(X509Certificate)c;
in.close();
···
}
3.輸出證書中的內容
利用X509Certificate類的一些成員函式來進行輸出關鍵資訊,其中包括版本號,序列號,簽發者,有效期限,主體名,簽名演算法,簽名,公鑰等等。並加上適當的解釋語句來輸出。
// 輸出完整的證書資訊
String s=c.toString();
System.out.println("輸出證書資訊:\n"+s);
// 輸出關鍵資訊,擷取部分並進行標記
System.out.println("版本號:"+t.getVersion());
System.out.println("序列號:"+
t.getSerialNumber().toString(16));
System.out.println("簽發者:"+t.getIssuerDN());
System.out.println("有效起始日期:"+t.getNotBefore());
System.out.println("有效終止日期:"+t.getNotAfter());
System.out.println("主體名:"+t.getSubjectDN());
System.out.println("簽名演算法:"+t.getSigAlgName());
System.out.println("簽名:"+t.getSignature().toString());
PublicKey pk=t.getPublicKey();
byte [] pkenc=pk.getEncoded();
System.out.println("公鑰:");
for(int i=0;i<pkenc.length;i++)
System.out.print(pkenc[i]+",");
} catch (CertificateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
四.編譯執行輸出結果
X.509證書的一些關鍵內容輸出如下:
該證書的版本號為3,序列號如圖所示
證書的簽發者和證書主體用X.509 DN表示,DN是由RDN構成的序列。
屬性型別名稱 | 含義 | 簡寫 |
---|---|---|
Common Name | 通用名稱 | CN |
Organizational Unit name | 機構單元名稱 | OU |
Organization name | 機構名 | O |
Locality | 地理位置 | L |
State or province name | 州/省名 | S |
Country | 國名 | C |
通過上表可以得出簽發者的通用名稱圍為GeoTrust RSA CA 2018; 機構單元名稱為 www.digicert.com; 機構名為Dogicert Inc; 國名為 US。
主體名的通用名稱為*.csdn.net; 機構單元名稱為IT; 機構名為北京創新樂知資訊科技有限公司;地理位置為北京市,國家為CN
有效日期為2018.11.7到2020.11.06
簽名演算法為SHA256withRSA
X.509證書的全部內容也可以進行輸出: