1. 程式人生 > >X.509證書的讀取與解釋

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

解釋:

  1. Version 版本號:標識證書的版本(版本1、版本2或是版本3)。

  2. Serial Number 序列號:標識證書的唯一整數,由證書頒發者分配的本證書的唯一識別符號。

  3. Algorithm ID:演算法ID: 標識證書演算法

  4. Issuer (CA’s name) 頒發者:證書頒發者的可識別名(DN)。

  5. Validity 有效期:證書有效期的時間段。本欄位由”Not Before”和”Not After”兩項組成,它們分別由UTC時間或一般的時間表示。

  6. Subject 主體:證書擁有者的可識別名,這個欄位必須是非空的,除非你在證書擴充套件中有別名。

  7. Subject Public Key Info 主體公鑰資訊: 主體的公鑰(以及演算法識別符號)。

  8. Issuer Unique Identifier (Optional) 頒發者唯一識別符號:識別符號—證書頒發者的唯一識別符號,僅在版本2和版本3中有要求,屬於可選項。

  9. Subject Unique Identifier (Optional) 主體唯一識別符號:證書擁有者的唯一識別符號,僅在版本2和版本3中有要求,屬於可選項。

  10. Extensions (Optional) X.509證書擴充套件部分

  11. Certificate Signature Algorithm 簽名認證演算法

  12. 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:點選網站的地址左邊的感嘆號,找到證書的入口。

2

step2:點選證書後,找到詳細資訊,找到複製到檔案入口

3

step3:選擇格式,點選下一步,然後選擇路徑即可

4

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證書的一些關鍵內容輸出如下:

1

該證書的版本號為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證書的全部內容也可以進行輸出

5