數字證書簡介及Java編碼實現


1.數字證書簡介

數字證書具備常規加密解密必要的信息,包含簽名算法,可用於網絡數據加密解密交互,標識網絡用戶(計算機)身份。數字證書為發布公鑰提供了一種簡便的途徑,其數字證書則成為加密算法以及公鑰的載體。依靠數字證書,我們可以構建一個簡單的加密網絡應用平台。

數字證書類似於個人身份證,由數字證書頒發認證機構(Certificate Authority, CA)簽發。只有經過CA簽發的證書在網絡中才具備可認證性。CA頒發給自己的證書叫根證書。

VeriSign, GeoTrust和Thawte是國際權威數字證書頒發認證機構的三巨頭。其中應用最廣泛的是VeriSign簽發的電子商務用數字證書。

最為常用的非對稱加密算法是RSA,與之配套的簽名算法是SHA1withRSA,最常用的消息摘要算法是SHA1.

 

除了RSA,還可以使用DSA算法。只是使用DSA算法無法完成加密解密實現,即這樣的證書不包括加密解密功能。

數字證書有多種文件編碼格式,主要包含CER編碼,DER編碼等。

CER(Canonical Encoding Rules, 規范編碼格式),DER(Distinguished Encoding Rules 卓越編碼格式),兩者的區別是前者是變長模式,后者是定長模式。

所有證書都符合公鑰基礎設施(PKI, Public Key Infrastructure)制定的ITU-T X509國際標准(X.509標准)。

2.模型分析

在實際應用中,很多數字證書都屬於自簽名證書,即證書申請者為自己的證書簽名。這類證書通常應用於軟件廠商內部發放的產品中,或約定使用該證書的數據交互雙方。數字證書完全充當加密算法的載體,為必要數據做加密解密和簽名驗簽等操作。在我司的開發過程中,數字證書更多是用來做加密和解密。

1)證書簽發

2)加密交互,圖略。

當客戶端獲取到服務器下發的數字證書后,就可以進行加密交互了。具體做法是:

客戶端使用公鑰,加密后發送給服務端,服務端用私鑰進行解密驗證。

服務端使用私鑰進行加密和數字簽名。

3. KeyTool 管理證書

KeyTool與本地密鑰庫相關聯,將私鑰存於密鑰庫,公鑰則以數字證書輸出。KeyTool位於JDK目錄下的bin目錄中,需要通過命令行進行相應的操作。

1)構建自簽名證書

申請數字證書之前,需要在密鑰庫中以別名的方式生成本地數字證書,建立相應的加密算法,密鑰,有效期等信息。

keytool -genkeypair -keyalg RSA -keysize 2048 -sigalg SHA1withRSA -validity 3600 -alias myCertificate -keystore myKeystore.keystore

各參數含義如下:

-genkeypair  表示生成密鑰對

-keyalg    指定密鑰算法,這里是RSA

-keysize    指定密鑰長度,默認1024,這里指定2048

-sigal     指定簽名算法,這里是SHA1withRSA

-validity    指定有效期,單位為天

-alias     指定別名

-keystore    指定密鑰庫存儲位置

這里我輸入參數Changeme123作為密鑰庫的密碼,也可通過參數-storepass指定密碼。可以用-dname "CN=xxx...."這樣的形式,避免更多交互。

注意:一個keystore應該是可以存儲多套<私鑰-數字證書>的信息,通過別名來區分。通過實踐,調用上述命令兩次(別名不同),生成同一個keystore,用不同別名進行加密解密和簽名驗簽,沒有任何問題。

更多命令可參考:http://blog.chinaunix.net/uid-17102734-id-2830223.html 

經過上述操作后,密鑰庫中已經創建了數字證書。雖然這時的數字證書並沒有經過CA認證,但並不影響我們使用。我們仍可將證書導出,發送給合作伙伴進行加密交互。

keytool -exportcert -alias myCertificate -keystore myKeystore.keystore -file myCer.cer -rfc

各參數含義如下:

-exportcert  表示證書導出操作

-alias     指定別名

-keystore   指定密鑰庫文件

-file      指定導出證書的文件路徑

-rfc      指定以Base64編碼格式輸出

打印證書

keytool -printcert -file myCer.cer

2)構建CA簽發證書

如果要獲取CA機構誰的數字證書,需要將數字證書簽發申請(CSR)導出,經由CA機構認證並頒發,將認證后的證書導入本地密鑰庫和信息庫。

keytool -certreq -alias myCertificate -keystore myKeystore.keystore -file myCsr.csr -v

各參數含義如下:

-certreq    表示數字證書申請操作

-alias      指定別名

-keystore    指定密鑰庫文件路徑

-file      指定導出申請的路徑

-v       詳細信息

獲得簽發的數字證書后,需要將其導入信任庫。

keytool -importcert -trustcacerts -alias myCertificate -file myCer.cer -keystore myKeystore.keystore

參數不作詳細講解,如果是原來的證書文件,那么會報錯:

查看證書

keytool -list -alias myCertificate -keystore myKeystore.keystore

 

經過上述的所有操作后,可以得到下面幾個文件

4. 證書使用

終於到了激動人心的時刻,可以用代碼通過keystore進行加解密操作了!

Java 6提供了完善的數字證書管理實現,我們幾乎無需關注,僅通過操作密鑰庫和數字證書就可完成相應的加密解密和簽名驗簽過程。

密鑰庫管理私鑰,數字證書管理公鑰,公鑰和私鑰分屬消息傳遞雙方,進行加密消息傳遞。

考慮一個場景。

A機器某模塊需要將數據導出到一個文件中,將文件發送到B機器,由B將數據導入。

在這個場景中,A就相當於服務端,需要將證書給B,同時用私鑰加密數據,生成簽名,導出到文件中。

B相當於客戶端,用收到的數字證書進行解密和驗簽。

  View Code

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM